Search This Blog

Wednesday, April 23, 2008

Using PC Serial Port

ကွန်ပျူတာရဲ့ serial port ကို Visual Basic programming သုံးပြီး ထိန်းချုပ် တဲ့အကြောင်းပြောမှာပါ။ ကွန်ပျူတာတွေမှာ serial port တစ်ခုတော့ ပါလေ့ရှိပါတယ်။ မပါခဲ့ရင်လဲ USB ကနေ RS232 converter လေးတွေ ကို အလွယ်တကူ ဝယ်လို့ရပါတယ်။

ဒီမှာ Serial port ကို သုံးတာနဲ့ ပတ်သက်ပြီး
1. Using VB6
2. Using VB2005 (VB.NET2)
3. Serial Port as IO
ဆိုပြီး သုံးပိုင်း ခွဲပြောထားပါတယ်။

Using VB6


VB6 မှာ ဆိုရင် serial port ကို အသုံးပြုဖို့အတွက် MSComm ဆိုတဲ့ ActiveX contorl ကိုသုံးမှာပါ။ စစချင်း VB6 မှာ Standard Exe ကိုရွေးပြီး New project တစ်ခုဖန်တီးပါ။ ပြီးရင် Project Menu က Components ဆိုတဲ့ command ကိုနှိပ်ပြီးရင် တက်လာတဲ့ Components dialog မှာ Microsoft Comm Control 6.0 ဆိုတာကိုရွေးပါ။

OK နှိပ်ပြီးရင် တယ်လီဖုန်း icon နဲ့ MSComm control ကို Toolbox ထဲမှာ တွေ့ရမှာ ဖြစ်ပါတယ်။ ပြီးရင် အဲဒီ control ပေါ်မှာ double click နှိပ်ပြီး Form ပေါ်ကိုထည့်ပါ။ အောက်ကပုံမှာ ပြထားတဲ့ အတိုင်း ထည့်ပြီးတဲ့အခါ ဒီ control ရဲ့ နာမည်က MSComm1 ဆိုပြီး ဖြစ်နေမှာဖြစ်ပြီး ဘေးအောက်နားက Properties box ထဲမှာ သူ့ရဲ့ setting တွေကို ကြိုက်သလိုပြင်လို့ရပါတယ်။

ဒီနမူနာ အနေနဲ့ ကတော့ ဒီအတိုင်းထားပြီး settings တွေကို Form ရဲ့ လွတ်တဲ့ တစ်နေရာရာမှာ double click နှိပ်ပြီး ပေါ်လာမယ့် Form_Load() ဆိုတဲ့ event မှာပဲ အောက်မှာ အတိုင်းသွားပြင်ပါမယ်။


Private Sub Form_Load()
MSComm1.Settings = "9600,N,8,1"
MSComm1.RThreshold = 1
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Text1.Text = ""
End Sub


Settings ထဲကိုထည့်လိုက်တဲ့ "9600,N,8,1" ဆိုတာက Baud rate ကို 9600 သုံးပြီး၊ No parity, 8 data bit and 1 stop bit လို့ဆိုလိုတာပါ။ RThreshold ကတော့ receive buffer ထဲကို data byte ဘယ်နှစ်လုံးရောက်ရင် လက်ခံရရှိကြောင်း Event ကို trigger လုပ်ရမလဲဆိုတာ ကိုသတ်မှတ်ပါတယ်။ ဒီနမူနာ မှာတော့ တစ်လုံးရောက်လာရင်တောင် Receive Event ကို ခေါ်ခိုင်းထားပါတယ်။ ပြီးရင် PC ရဲ့ Comm port 1 ကို အသုံးပြုထားပါတယ်။ ကြိုက်တဲ့ Comm port ကို သုံးနိုင်ပါတယ်။ ပြီးရင် Comm port ကို ဖွင့်ပါတယ်။ နောက်တစ်ခုကတော့ လက်ခံရရှိတဲ့ ဒေတာ တွေကို ဖော်ပြဖို့ Textbox ကို clear လုပ်ထားတာပါ။ ပြီးရင် data အစမ်းပို့ကြည့်ဖို့ command button တစ်ခုနဲ့ textbox တစ်ခုကို form ပေါ်မှာထည့်ပါ။ Command button ရဲ့ Caption ကို 'Send' လို့ ပြင်ပေးလိုက်ပါမယ်။

ပြီးရင် အဲဒီ button ပေါ်မှာ double click နှိပ်ပြီး သူ့ရဲ့ click ဆိုတဲ့ event function မှာ အောက်ပါအတိုင်းရေးပါမယ်။


Private Sub Command1_Click()
MSComm1.Output = "ABCD"
End Sub


ဒါဆိုရင် button ကိုနှိပ်တိုင်း ABCD ဆိုတဲ့ data ကို serial port ကနေ ပို့ပေးမှာပါ။ ABCD အစား ကိုယ်ပို့ချင်တဲ့ data ကို MSComm1.Output ထဲကို ထည့်ပေးလို့ ရပါတယ်။ နောက် data ကို လက်ခံဖို့ အတွက်ကတော့ MSComm control ရဲ့ OnComm ဆိုတဲ့ Event ကို သုံးပါမယ်။ MSComm control ပေါ်မှာ double click နှိပ်ပြီး သူ့ရဲ့ event function ထဲမှာ အောက်ပါအတိုင်းရေးပါမယ်။ OnComm Event အမျိုးမျိုး ရှိတဲ့ အထဲက data ကို လက်ခံရရှိခဲ့ ရင် Textbox ထဲကို သွားပေါင်းထည့်ပြီး ဖော်ပြပေးမှာပါ။


Private Sub MSComm1_OnComm()
If MSComm1.CommEvent = comEvReceive Then
  Text1.Text = Text1.Text & MSComm1.Input
End If
End Sub


အဲဒါဆိုရင် program က အောက်မှာ ပြထားတဲ့အတိုင်းဖြစ်သွားပါပြီ။

ပြီးရင် program ကို run ကြည့်ပါ။ Send button ကို နှိပ်တိုင်း ပို့ပေးမှာ ဖြစ်ပြီး၊ လက်ခံရရှိတဲ့ data တွေကို textbox ထဲမှာ ဖော်ပြပေးမှာ ဖြစ်ပါတယ်။

Using VB2005


VB2005 မှာဆိုရင် တော့ Serial port ကို သုံးရတာ ပိုပြီးလွယ်ကူ သွားပါတယ်။ ဘာဖြစ်လို့လဲဆိုတော့ သူ့မှာ serial port ကိုသုံးဖို့ SerialPort ဆိုတဲ့ control ပါလာပြီးသားမို့ပါ။ စစချင်း File Menu ထဲက New Project command ကိုရွေးပြီး Windows Application အသစ်တစ်ခုကို ဖန်တီးပါ။ ပြီးရင် Toolbox ထဲက SerialPort ဆိုတဲ့ Control ကို double click နှိပ်ပြီး ထည့်ပါ။


ပြီးရင် control ကို select မှတ်ပြီး ညာဖက်အောက်နားက properties box မှာ သူ့ရဲ့ properties တွေကို ပြင်ပါမယ်။ နာမည်ကတော့ ဒီအတိုင်း SerialPort1 လို့ပဲထားပါမယ်။ ဒီနမူနာမှာ BaudRates ကို 9600, Databits=8, Parity=None, StopBits= One လို့ထားပါမယ်။ ကိုယ်သုံးမယ့် အပေါ်မူတည်ပြီး settings တွေကို ထားနိုင်ပါတယ်။ ပြီးရင် ReceivedBytesThreshold ကိုလဲ နဂို တန်ဖိုးအတိုင်း 1 လို့ထားပါမယ်။ PC ရဲ့ COM1 ကို သုံးမှာ ဖြစ်တဲ့ အတွက် PortName ကို COM1 လို့ထားပါမယ်။
ပြီးရင် Form ပေါ်မှာ double click နှိပ်ပြီး Form Load Event မှာ အောက်ပါအတိုင်းရေးပါမယ်။


CheckForIllegalCrossThreadCalls = False
SerialPort1.Open()

ဒါဆိုရင် ပရိုဂရမ် စစချင်းမှာ port ကို ဖွင့်ပြီးသားဖြစ်သွားပါမယ်။ ပုံမှန် serial port control ရဲ့ Encoding က ASCII ဖြစ်တာကြောင့် ကိုယ်သုံးချင်တဲ့ပေါ်မူတည်ပြီး Encoding ကို Form Load Event မှာ ပြင်နိုင်ပါတယ်။


SerialPort1.Encoding = System.Text.Encoding.Default


ပြီးရင် ပို့ဖို့ Button တစ်ခုနဲ့၊ လက်ခံရရှိတာတွေကို ဖော်ပြဖို့ TextBox တစ်ခုထည့်ပါမယ်။ Button ရဲ့ Text ကို Send လို့ပြင်ပါမယ်။ Button ပေါ်မှာ double click နှိပ်ပြီး သူ့ရဲ့ click event မှာ အောက်ပါအတိုင်းရေးပါမယ်။


SerialPort1.Write("ABCD")


ဒါဆိုရင် အဲဒီ Send ဆိုတဲ့ button ကို နှိပ်တိုင်း ABCD ဆိုတဲ့ ဒေတာကို ပို့ပေးမှာပါ။ အဲဒီ ABCD အစား ကိုယ် ပို့ချင်တဲ့ ဒေတာ ကို အစားထိုးနိုင်ပါတယ်။ နောက် data လက်ခံဖို့ အတွက်ကတော့ SerialPort1 ရဲ့ DataReceived event မှာ အောက်ပါအတိုင်းသွားရေးပါမယ်။


TextBox1.Text &= SerialPort1.ReadExisting()


လက်ခံရရှိတဲ့ ဒေတာတွေကို တစ်လုံးချင်း ဖတ်ချင်တယ် ဆိုရင်လဲ အဲဒီအစား အောက်က ပုံစံလဲ ရေးလို့ရပါတယ်။


Dim n As Int32
Dim i As Int32
Dim cmd As String
Dim c As String
n = SerialPort1.BytesToRead
For i = 1 To n
  c = Chr(SerialPort1.ReadChar())
  cmd &= c
Next
TextBox1.Text &= cmd


အဲလိုရေးပြီးတဲ့အခါ ပရိုဂရမ်က အောက်ပါအတိုင်းဖြစ်သွားပါမယ်။

ပြီးရင် ပရိုဂရမ်ကို run ပြီး ဒေတာ ပို့တာ၊ လက်ခံတာ စမ်းသပ်လို့ရပါပြီ။
Sending Binary Data
အထက်မှာ ပြောခဲ့တာက character တွေပို့ဖို့အတွက်ပါ။ ဥပမာ ASCII code number 127 ထက်ကြီးတဲ့ binary code (128-255) တွေ အတွက်ကတော့ အောက်မှာပြထားတဲ့ အတိုင်းပို့နိုင်ပါတယ်။


Dim a(3) As Byte
a(0) = &H41
a(1) = &H31
a(2) = &HFF
a(3) = &H80
SerialPort1.Write(a, 0, 4)


သူတို့ကိုလက်ခံဖို့အတွက်ကလဲ ReadChar နဲ့ဖတ်လို့မရပါဘူး။ အဲဒီအစား ReadByte ကိုသုံးနိုင်ပါတယ်။ နမူနာ အနေနဲ့ အောက်မှာကြည့်နိုင်ပါတယ်။


Dim n As Int32
Dim i As Int32
Dim cmd As String = ""
Dim c As String
n = SerialPort1.BytesToRead
For i = 1 To n
c = Chr(SerialPort1.ReadByte())
cmd &= c
Next
TextBox1.Text &= cmd


Getting Port List in Your PC
သင့် PC မှာရှိတဲ့ port တွေကို Combo box တစ်ခုထဲမှာပြချင်ရင်၊ ပြီးတော့ သင့် setting ထဲမှာသိမ်းထားတဲ့ နံပါတ်ကို ပြနေစေချင်ရင် အောက်ပါအတိုင်းရေးပါမယ်။


Dim ports As String() = SerialPort.GetPortNames()
Dim port As String
Array.Sort(ports)
cmbSerial.Items.Clear()
For Each port In ports
cmbSerial.Items.Add(port)
Next port
Dim index As Integer
index = cmbSerial.FindString(My.Settings.MCOM)
cmbSerial.SelectedIndex = index



Using Serial Port as IO


အမှန်တော့ serial port မှာ data ပို့တဲ့၊ လက်ခံတဲ့ Tx, Rx အပြင် တခြား control output နှစ်လိုင်းနဲ့ status input လေးလိုင်းကို သုံးလို့ရပါသေးတယ်။ RTS, DTR တွေက output အဖြစ်သုံးနိုင်ပြီး၊ CTS, DSR, CD, RI တို့ကို input အဖြစ်သုံးနိုင်ပါတယ်။ IO အများကြီး မလိုတဲ့ application တွေမှာ serial port ကို IO interface အဖြစ်သုံးရင် အရမ်းလွယ်ကူ အဆင်ပြေပါတယ်။

Related post:

Saturday, April 19, 2008

Asynchronous Serial Communication- RS232, RS422 and RS485

ဒီ serial communication မှာဆိုရင် data byte ကို bit တစ်ခုချင်းစီ အစီအစဉ်လိုက် တစ်ခုပြီးတစ်ခု ပို့တဲ့ အတွက် ဝါယာအများကြီးသုံးစရာမလိုတော့ပဲ ဝါယာတစ်ခုနဲ့တင် ပို့လို့ရတဲ့ အားသာချက်ရှိပါတယ်။ ပို့တဲ့အခါ byte ကနေ bit တစ်ခုချင်း serial ပြောင်းပြီးထွက်လာဖို့၊ လက်ခံတဲ့အခါ တစ်ခုပြီးတစ်ခု ဝင်လာတဲ့ serial bit တွေကို byte အဖြစ်ပြန်တည်ဆောက်ဖို့ အတွက် UART ကိုသုံးကြပါတယ်။

UART


UART တစ်ခုဟာ serial bit stream ပြောင်းပေးနိုင်ရုံတင် မကပဲ start bit, parity bit, stop bit များထည့်ပေးခြင်း အစရှိတဲ့ လုပ်ငန်းများကိုလည်း Asynchronous Serial Communication Protocol နဲ့ကိုက်ညီအောင် ဆောင်ရွက်လုပ်ဆောင် ပေးပါတယ်။

Start Bit



ဒီလိုပါ UART တစ်ခုဟာ ပို့စရာ data မရှိပဲ idle ဖြစ်နေရင် output ကို 1 မှာထားပါတယ်။ ဒီအခါ လက်ခံမယ့် UART ဟာ idle ဖြစ်လို့ ထုတ်ထားတဲ့ 1 လား၊ ပို့ပေးနေတဲ့ ဒေတာ က 1 လား ခွဲခြားသိဖို့လိုလာပါတယ်။ အဲဒါကို ဖြေရှင်းဖို့အတွက် start bit ကိုသုံးပါတယ်။ 0 bit တစ်ခုကို start bit အနေနဲ့ သုံးပါတယ်။ လက်ခံနေတဲ့ UART တစ်ခုဟာ 0 ရောက်မလာမချင်း ရှိနေတဲ့ 1 ကို idle လို့ယူဆပါတယ်။ ပထမဆုံး 0 ရောက်လာတာနဲ့ အဲဒါကို start bit လို့ယူဆပြီး နောက်ဝင်လာမယ့် bit တစ်ခုက စပြီး data အနေနဲ့ လက်ခံပါတယ်။

Baud Rate



data bit တစ်ခုနဲ့ တစ်ခုကြားက အချိန်အကွာအဝေး ကို Baud rate ကသတ်မှတ်ပါတယ်။ ဥပမာ baud rate က 1 kHz ဆိုရင်၊ bit တစ်ခု အတွက် time period က 1/(1kHz) = 1 ms ကြာမှာ ဖြစ်ပါတယ်။ အသုံးများတဲ့ baud rate ကတော့ 9600 ဖြစ်ပါတယ်။

Data Bits


Data ပို့တဲ့အခါ ပို့တဲ့ UART နဲ့ လက်ခံတဲ့ UART data bit အရေအတွက်ခြင်းတူဖို့လိုပါတယ်။ ပို့တဲ့ အခါ 5 bit data ကနေ 8 bit data ထိ ပို့တတ် ပါတယ်။ ဥပမာ ASCII data ဆိုရင် ပို့တာ 7 bit ပဲရှိတဲ့အတွက် လက်ခံရင်လဲ 7 bit လက်ခံဖို့လိုပါတယ်။ Data bits တွေကိုပို့တဲ့ အခါ LSB ကနေ အရင်စပို့ပါတယ်။ အသုံးများတာကတော့ 8 bit ပါ။

Parity Bit


လက်ခံလိုက်တဲ့ data က မှန်ကန်ကိုက်ညီမှု ရှိရဲ့လား ပြန်စစ်ဖို့အတွက် parity bit ကိုလဲ data bits တွေရဲ့ နောက်မှာ အပိုထည့်ပေး တတ်ပါတယ်။ 1 အရေအတွက် စုံဂဏန်းဖြစ်အောင် ထည့်ပေးရင် Even parity၊ မ ဂဏန်းဖြစ်အောင် ပေါင်းထည့်ပေးရင် Odd parity ပါ။ ပို့တဲ့ UART နဲ့ လက်ခံတဲ့ UART parity ချင်းလည်း ကိုက်ညီဖို့လိုပါတယ်။ များသောအားဖြင့် Parity သုံးလေ့ မရှိပါဘူး။

Stop Bit


8 bits ရှိတဲ့ data byte တစ်ခုနဲ့ တစ်ခုကြားမှာ ခြားပေးဖို့အတွက် stop bits တွေကိုသုံးပါတယ်။ 1 ကို stop bit အနေနဲ့ သုံးပါတယ်။ Stop bit ကို တစ်ခု၊ သို့မဟုတ် နှစ်ခု သုံးလို့ရပါတယ်။ data တွေ၊ parity bit တွေ ပို့ပြီးတဲ့ အခါ နောက်မှာ 1 တစ်ခုပေါင်း ပေး၊ ဒါမှမဟုတ် နှစ်ခု ပေါင်းထည့် ပေးတာပါ။ အသုံးများတာတော့ stop bit တစ်ခုထဲ ပါပဲ။
အောက်မှာ နမူနာ အနေနဲ့ data byte 0x41 ကို UART တစ်ခုကနေ 9600, 8N1 နဲ့ ပို့တာကို ပြထားပါတယ်။ ဆိုလိုတာက
Baud rate = 9600
Data bit = 8 bits
Parity = No parity (N= No parity, E= Even parity, O= Odd parity)
Stop bit= 1 stop bit
လို့ ဆိုလိုတာပါ။ No parity ဖြစ်တဲ့အတွက် data ကို ပို့ပြီးတဲ့ အခါ parity bit ကို မထည့်ပဲ stop bit တန်းလာပါတယ်။

Forms of UART


UART တစ်ခုဟာ ပုံစံ အမျိုးမျိုးဖြစ်နိုင်ပါတယ်။ ပထမ ပုံစံကတော့ သီးသန့် IC တစ်ခုအနေနဲ့ ပါ။ အသုံးများတဲ့ IC ကတော့ 16550 ပါ။ CMOS ဆိုရင်တော့ 16C550 ပေါ့ဗျာ။ သူ့မှာ buffer တွေ၊ interrupt တွေ၊ အစရှိသဖြင့် ပါပြီးသားမို့ သုံးရတာ လွယ်ကူ အဆင်ပြေပါတယ်။ သူ့ရဲ့ serial data က sout ကနေ ထွက်လာတာပါ။ Basic configuration ကို အောက်မှာ ပြထားပါတယ်။

နောက်တစ်မျိုးကတော့ microcontroller ထဲမှာ တစ်ခါတည်း built in ပါပြီးသားမျိုးပါ။ နောက်ဆုံးအနေနဲ့ ကတော့ ရိုးရိုး IO pin ကိုပဲ software နဲ့ရေးပြီး emulate လုပ်လို့ရ တဲ့ software UART မျိုးလဲ လုပ်လို့ရပါတယ်။

RS232


UART တစ်ခုက ပုံမှန်အားဖြင့် 1 ဆိုရင် 5V ထုတ်ပေးပြီး၊ 0 ဆိုရင် 0V ထုတ်ပေးပါတယ်။ UART တစ်ခုက ထွက်လာတဲ့ voltage signal ကို များသောအားဖြင့် external device တွေနဲ့ ဆက်ဖို့ သင့်တော်တဲ့ signaling levels တွေအဖြစ်ပြောင်းဖို့ transceiver တစ်ခုခုခံပြီး ထုတ်ပေး လေ့ရှိပါတယ်။ အသုံးများတဲ့ standard တစ်ခုကတော့ RS232 ပါ။ RS232 transceiver တစ်ခုရဲ့ အလုပ်က 1 ဆိုရင် -10V ပြောင်းပေးပြီး၊ 0 ဆိုရင် +10V အဖြစ် အပြန်အလှန် ပြောင်းပေးတာပါ။ တကယ်တော့ အပေါင်း၊အနုတ် 3V ကနေ 25V အထိက valid ဖြစ်ပါတယ်။ အသုံးများတဲ့ IC ကတော့ MAX232 ဖြစ်ပါတယ်။ သူ့ရဲ့ configuration ကို အောက်က ပုံမှာ ပြထားပါတယ်။

Capacitor အသေး (0.1uF) နဲ့ IC အရွယ်အစား အသေးအတွက်တော့ MAX202 ကို အသုံးများပါတယ်။ အခုနက 16C550 နဲ့ စပ်ဆက်ပြီး ပြောရမယ်ဆိုရင်တော့ အဲဒီ UART ရဲ့ sout ကထွက်လာတဲ့ 0V,5V ကို သူ့ရဲ့ pin number 11 နဲ့ဆက်ရင် pin number 14 ကနေပြီး +10V,-10V ဆိုပြီး transmit (Tx) လိုင်းအနေနဲ့ထွက်လာမှာပါ။ အဲဒီလိုပဲ receive (Rx) လိုင်းကနေ ဝင်လာတဲ့ +10V, -10V တွေဟာလဲ MAX232 ရဲ့ pin number 13 နဲ့ဆက်ပေးမယ်ဆိုရင် သူ့ရဲ့ pin number 12 ကနေ 0V,5V အနေနဲ့ ပြန်ထွက်လာပြီး UART ရဲ့ sin နဲ့ ဆက်လို့ရသွားပါတယ်။
အောက်မှာ RS232 ရဲ့ ဆက်သွယ်ပုံကိုပြထားပါတယ်။ ပုံမှန်အားဖြင့် transmit and receive data lines တွေကိုပဲ သုံးလေ့ရှိတဲ့ အတွက် Tx တစ်လိုင်း၊ Rx တစ်လိုင်း နဲ့ Ground ဝါယာ တစ်လိုင်း စုစုပေါင်း သုံးလိုင်း သုံးဖို့လိုပါတယ်။ ပုံပေါ်မှာ ကလစ်နှိပ်ပြီး ပုံကြီးကြည့်နိုင်ပါတယ်။

RS232 ရဲ့ Tx နဲ့ Rx ကို တစ်ခါတလေ ခွဲခြားဖို့ လိုလာပြီဆို ကြိုးတွေကို open လုပ်ပြီး မီတာ ကိုသုံးပြီး အလွယ်အကူတိုင်းကြည့်နိုင်ပါတယ်။ Tx နဲ့ Ground ကြားမှာ ပုံမှန်အားဖြင့် -10V လောက်တွေ့ရမှာဖြစ်ပြီး၊ Rx နဲ့ Ground ကြားမှာ ဗို့မရှိပါဘူး။ RS232 ကို unbalanced lines လို့ဆိုပါတယ်။ Tx ဝါယာနဲ့ Ground ဝါယာ ကြားက ဗို့ဟာ transmit voltage ဖြစ်ပြီး၊ Rx ဝါယာနဲ့ Ground ဝါယာကြားက ဗို့ဟာ receive voltage ဖြစ်ပါတယ်။

RS232 communication မှာ ပုံမှန်အားဖြင့် data transmit line (Tx) နဲ့ data receive line (Rx) ကိုပဲ သုံး ပေမယ့် တစ်ခုနဲ့ တစ်ခု handshaking လုပ်ဖို့ အတွက် control and status lines တွေကိုလဲ သုံးတတ်ကြပါတယ်။ Primary Communication lines တွေထဲမှာဆို Tx နဲ့ RTS က အထွက်ဖြစ်ပြီး၊ Rx နဲ့ CTS က အဝင်ဖြစ်ပါတယ်။ Status and Control lines တွေမှာဆိုရင်တော့ DTR က အထွက်လိုင်းဖြစ်ပြီး၊ DSR နဲ့ CD က အဝင်လိုင်း ဖြစ်ပါတယ်။ သူတို့ အကြောင်းအောက်မှာ ဆက်ပြောပါမယ်။ RS232 device တွေ အကြောင်းပြောတဲ့ အခါမှာ ကွန်ပျူတာကို DTE ( Data Terminal Equipment) လို့ခေါ်ပြီး၊ ကွန်ပြူတာနဲ့ ဆက်သုံးတဲ့ Modem သို့ device ကို DCE (Data Circuit-Terminating Equipment) လို့ခေါ်ပါတယ်။
RTS- Request To Send signal ကတော့ DTE ကနေ DCE ကို ပို့ချင်တဲ့ အကြောင်း လှမ်း request လုပ်တာပါ။ ပုံမှန် အားဖြင့် logic 1 အနုတ်ဗို့ မှာ ပဲရှိပြီး request လုပ်တာနဲ့ logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
CTS- Clear To Send signal ကတော့ DCE က ပို့ဖို့ ready ဖြစ်တဲ့ အတွက် စပို့တော့ ဆိုတဲ့အကြောင်း DTE ကို အကြောင်းပြန်တာပါ။ ပုံမှန် အားဖြင့် logic 1 အနုတ်ဗို့ မှာ ပဲရှိပြီး DCE ကနေအကြောင်းပြန်ဖို့ logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
DSR- DCE Ready (Data Set Ready) ကတော့ DCE (device) က turn on ဖြစ်ပြီး ready ဖြစ်နေပြီဆိုတဲ့ အကြောင်း DTE ကွန်ပျူတာကို လှမ်းပြောတာပါ။ Ready ဖြစ်ပြီဆို DCE ကနေ logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
DTR- DTE Ready ကတော့ DTE ကွန်ပျူတာကနေ communication ကိုလုပ်ချင်လို့ အသင့်ပြင်တော့ လို့ DCE (device) ကို လှမ်းပြောတာပါ။ ပုံမှန် အားဖြင့် logic 1 အနုတ်ဗို့ မှာ ပဲရှိပြီး DTE ကနေ DTR လိုင်းကို true လုပ်တဲ့အခါ logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
CD- Carrier Detect (Received Line Signal Detector) ကတော့ DCE က modem ဖြစ်တဲ့အခါမှာ သုံးပါတယ်။ တယ်လီဖုန်းလိုင်းကို တခြားဖက် အဝေးမှာရှိတဲ့ modem က ဖြေလိုက်တဲ့ answer tone ကို ရတဲ့အခါမှာ ဒီဖက် modem က ကွန်ပျူတာ ကို logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။
RI- Ring Indicator ကတော့ ring signal ကို ရတဲ့အခါ modem က ကွန်ပျူတာ ကို logic 0 အပေါင်း ဗို့ ထုတ်ပေးပါတယ်။ Ring signal ရတဲ့ အချိန်ပဲ အပေါင်းထုတ်ပေးပြီး ring signal အချင်းချင်းကြားနဲ့ ring signal မရှိတဲ့ အချိန်တွေမှာ အနုတ်ဖြစ်နေပါတယ်။
RS232 ရဲ့ ဝါယာ connectors တွေ အကြောင်းဆက်ပြောပါမယ်။

ပုံမှာ ပြထားတဲ့ အတိုင်း ကွန်ပျူတာ (DTE) မှာ RS232 အတွက် Male DB9 ပါပြီး သူနဲ့ ဆက်သုံးရမယ့် (DCE) device မှာ Female DB9 connector ပါလေ့ရှိပါတယ်။ (ကွန်ပျူတာဘက်က) DTE ဘက် male connector ရဲ့ pin connection တွေကို အောက်ကပုံမှာ ဖော်ပြထားပါတယ်။

pin 1 = CD- Carrier Detect (input)
pin 2 = Rx- Receive Data (input)
pin 3 = Tx- Transmit Data (output)
pin 4 = DTR- Data Terminal Ready (output)
pin 5 = GND- System Ground
pin 6 = DSR- Data Set Ready (input)
pin 7 = RTS- Request To Send (output)
pin 8 = CTS- Clear To Send (input)
pin 9 = RI - Ring Indicator (input)

(Device ဘက်က) DCE ဘက် female connector ရဲ့ pin connection တွေကိုလဲ အောက်က ပုံမှာ ကြည့်နိုင်ပါတယ်။

pin 1 = CD- Carrier Detect (output)
pin 2 = Tx- Transmit Data (output)
pin 3 = Rx- Receive Data (input)
pin 4 = DTR- Data Terminal Ready (input)
pin 5 = GND- System Ground
pin 6 = DSR- Data Set Ready (output)
pin 7 = CTS- Clear To Send (input)
pin 8 = RTS- Request To Send (output)
pin 9 = RI - Ring Indicator (output

RS422 and RS485


RS422 နဲ့ RS485 နှစ်ခုက ဝါယာနှစ်ခု ကြားက difference voltage ကိုပဲ ကြည့်ပြီး ခြားနားချက် 0.4V လောက်ရှိရင်ကို လုပ်ဆောင်နိုင်ပါတယ်။ ထုတ်ပေးတဲ့ ဗို့ကတော့ +12V နဲ့ -12V ကြားရှိရမယ်လို့ပြောပါတယ်။ +Tx နဲ့ -Tx ကြားကအထွက်ဗို့ဖြစ်ပြီး၊ +Rx နဲ့ -Rx ကြားကဗို့က အဝင်ဗို့ဖြစ်ပါတယ်။ သူက Ground နဲ့ transmit လိုင်းကြားက ဗို့ကို မကြည့်ပဲ၊ +Tx, -Tx လိုင်းနှစ်လိုင်းကြားက ဗို့ကိုကြည့်တဲ့အတွက် balance လိုင်းလို့ခေါ်ပါတယ်။ Common mode noise တွေကို ပိုခံနိုင်ရည်ရှိ်ပါတယ်။ RS232 နဲ့ ယှဉ်ရင် ဒေတာတွေကို မြန်မြန်နဲ့၊ ဝေးဝေး ပို ပို့ ပေးနိုင်ပါတယ်။

Note:
-200mV to +200mV = 0.4 V
-6V to +6V = 12V
RS485 နဲ့ ကွာခြားတဲ့ အချက်ကတော့ RS232 တို့၊ RS422 တို့က ဝါယာ bus တစ်ခုမှာ လက်ခံတဲ့ receiver အများကြီးရှိလို့ ရပေမယ့် transmit လုပ်ပေးတဲ့ driver circuit တစ်ခုပဲ ရှိလို့ရပါတယ်။ RS485 မှာတော့ transmit လုပ်မယ့် driver circuit ကို enable, disable လုပ်လို့ရတဲ့ data enable ပါတဲ့အတွက် ဝါယာ bus တစ်ခုမှာ လက်ခံတဲ့ receiver အများကြီးရှိလို့ ရသလို၊ ပို့တဲ့ transmitter တွေလဲ အများကြီး ထားလို့ရပါတယ်။ ပုံမှန်အားဖြင့် RS422 က transmit အတွက် ဝါယာနှစ်ခု (+Tx, -Tx)၊ receive အတွက် ဝါယာနှစ်ခု (+Rx, -Rx) စုစုပေါင်း ဝါယာလေးခုသုံးပြီး၊ RS485 မှာတော့ transmit အတွက်ရော၊ receive အတွက်ရော ဝါယာနှစ်ခုထဲကိုပဲ တလှည့်စီ share ပြီး half duplex သုံးလေ့ရှိပါတယ်။ RS485 ကို ဝါယာလေးခုနဲ့ Full duplex သုံးချင်ရင်လဲရပါတယ်။ အောက်က ပုံမှာ MAX481 transceiver IC ကို သုံးပြီး RS485 ဆက်သွယ်ပုံကို ပြထားပါတယ်။ ဝါယာ နှစ်လိုင်းထဲ ကိုပဲ သုံးထားတဲ့ အတွက် တစ်ခုက ပို့နေရင် တခြားတစ်ခုက ပို့လို့မရတဲ့အတွက် half duplex ပဲရပါတယ်။

RS485 မှာ transmit အတွက် ဝါယာ ၂ လိုင်း၊ receive အတွက် ဝါယာ ၂ လိုင်း စုစုပေါင်း ဝါယာ လေးလိုင်း သုံးမယ်ဆိုရင် Transmit, Receive ပြိုင်တူလုပ်လို့ရတဲ့ အတွက် Full duplex ဖြစ်ပါတယ်။ အောက်မှာ RS422 အတွက်ရော၊ RS485 အတွက်ရော သုံးလို့ရတဲ့ အသုံးများတဲ့ transceiver IC MAX491 ရဲ့ ဆက်သွယ်ပုံကို ပြထားပါတယ်။ MAX491 ကို half duplex သုံးချင်ရင် +Tx နဲ့ +Rx လိုင်းကိုပူး၊ -Tx နဲ့ -RX လိုင်းကိုပူးလိုက်ရင် ရပါတယ်။

ပြောရမယ်ဆိုရင် RS485 ကို Full duplex ဝါယာလေးခုသုံးပြီး transmit driver circuit ကို အမြဲ enable အသေလုပ်ထားလိုက်ရင် RS422 ဖြစ်သွားတာပါပဲ။ RS422 ကို RS232 ရဲ့ အကွာအဝေး ကို ပိုများအောင် extend လုပ်ဖို့ အတွက်သုံးလေ့ ရှိကြတာပါ။ ပို့ရမယ့် အကွာအဝေးက အရမ်းဝေးတဲ့ အခါ RS232 နဲ့ အဆင်မပြေတဲ့အခါမျိုးမှာ RS422 converter ကိုသုံးပို့ပြီး လက်ခံတဲ့ဘက်မှာလဲ converter နဲ့ RS232 ပြန်ပြောင်းသုံးကြပါတယ်။
RS232 ရဲ့ အထွက်ကို RS422/RS485 ရဲ့ အဝင်နဲ့ ဝါယာနှစ်ကြိုးထဲသုံးပြီး တန်းဆက်ပြီးသုံးကြည့်ဘူးတာ အဆင်ပြေပါတယ်။ RS232 ရဲ့ Tx ကို RS422 ရဲ့ -Rx နဲ့ဆက်ပြီး၊ RS232 ရဲ့ Ground ကို RS422 ရဲ့ +Rx လိုင်းနဲ့ဆက်တာပါ။
အောက်မှာ RS422, RS485 half duplex နဲ့ RS485 full duplex တို့ရဲ့ ဆက်သွယ်ပုံတွေကို ယှဉ်ပြထားပါတယ်။
ပထမ တစ်ခုက RS422 ပါ။ တစ်ခု တစ်ခု ချင်းပဲ ဆက်သွယ်လေ့ရှိပါတယ်။ Bus တစ်လိုင်းမှာ receiver အများကြီးရှိနိုင်ပေမယ့် transmitter တစ်ခုထဲပဲရှိနိုင်ပါတယ်။ Transmit driver ကိုထိန်းလို့မရပါဘူး။

RS485 half duplex ပါ။ Driver Enable, Receiver Enable ပါတာကို သတိပြုပါ။ Bus တစ်ခုမှာ Node တွေအများကြီး (ပုံမှန်အားဖြင့် ၃၂ ခုလောက်ထိ) ဆက်လို့ရပါတယ်။

RS485 full duplex ပါ။

Saturday, April 12, 2008

Valentine Poems

Valentine's day နဲ့ ဆက်စပ်ပြီး အရင်တုန်းက သူငယ်ချင်းတွေစုပြီး ထုတ်ခဲ့ဖူးတဲ့ ကဗျာစာအုပ်လေးကို သတိရမိတယ်။ ကဗျာတော့ သိပ်မရေးတတ်ပါဘူး။ ကဗျာတွေကိုတော့ တော်တော်လေး စိတ်ဝင်စားနှစ်သက် ခဲ့ဘူးတယ်။ မောင်စိန်ဝင်း (ပုတီးကုန်း) တို့၊ ခိုင်ဝင်း (ပုဏ္ဏဝတီ) တို့ ဆိုတာတော့ အသည်းစွဲတွေပါ။ ၉၉ တုန်းက သူငယ်ချင်းတွေက ချစ်သူများနေ့မှာ "ချစ်သူများရဲ့ရက်ရာဇာ" ဆိုတဲ့ ကဗျာစာအုပ်လေး ထုတ်ကြမယ်ဆိုပြီး ရေးဖို့တိုက်တွန်းတာနဲ့ တိုတိုလေး တစ်ပုဒ်တော့ ရေးဖြစ်သွားတယ်။


အဲဒီတုန်းက အခုလို email တွေ၊ blog တွေ မရှိကြတော့လဲ စာအုပ်တွေနဲ့ပဲ ရေးကြ၊ထုတ်ကြတယ်။ ကဗျာစာအုပ်လေးကတော့ မရှိတော့ဘူး။ အဖုံးတွေ ဘာတွေကတော့ သူများနဲ့ မတူတဲ့ handmade ပန်းချီပုံလေးတွေပါ။

ဒီလိုနဲ့ ၂၀ဝ၀ ခုနှစ်မှာလည်း handmade ပန်းချီပုံ အဖုံးလေးတွေနဲ့ပဲ ချစ်သူများရဲ့ ရက်ရာဇာ ကို ဆက်ထုတ်ကြပါတယ်။ တိုင်ပင်ဖော် တိုင်ပင်ဖက်၊ သွားအတူ လာအတူ သူငယ်ချင်းတွေကို အော့ဖ်ဆက် အပ်တာတွေ ဘာတွေကို ဝိုင်းလုပ်ပေး ရတာပါပဲ။ အော့ဖ်ဆက် ကလည်း state ကျောင်းတုန်းက သူငယ်ချင်း မြတ်ဝတ်ရည် တို့ဆိုင်ပါ။ သူတို့ကလည်း စိတ်ရှည်ရှည် သဘောကောင်းကောင်းနဲ့ စိတ်တိုင်းကျ လုပ်ပေးရှာပါတယ်။ ကဗျာရေးဖို့ အတွက်လည်း ရေးဖို့ ရည်ရွယ်ချက်မရှိ၊ ရေးထားပြီးသား မရှိပေမယ့် သူငယ်ချင်းတွေ ပြောလွန်းတာနဲ့ ဝင်ရေးဖြစ်ပြန်ရော။ စာအုပ်ကလေး တွေကို ပလစ်စတစ်အိပ်နဲ့ ထုတ်ပြီး အသည်းပုံ စတစ်ကာ ကပ်တာတွေက အစ လုပ်ကြပါတယ်။ စတစ်ကာ ပေါ်မှာ ပုံမိတ္တူကူးတာ ဆန်းလင်းတို့ဆိုင်မှာ။ စာအုပ်လေးတွေကို Eternal ရေမွှေး ပုလင်းလေးတွေနဲ့တောင် ရေမွှေးတွေလဲ ဆွတ်ကြသေး။ ပြီးတော့ အတန်းထဲက၊ မိန်းထဲက သူငယ်ချင်းတွေကို ရောင်းကြတယ်။ တချို့ကိုလည်း အမှတ်တရပေးကြတယ်။ ကဗျာဆန်ခဲ့၊ စိတ်ကူးယဉ်ဆန်ခဲ့ ကြတာတွေပေါ့။ ဒီကဗျာ စာအုပ်လေးကလည်း ကျွန်တော့် ဆီမှာ မရှိတော့ဘူး။ နောက်တော့မှ သူငယ်ချင်းတစ်ယောက် ဆီမှာ တစ်အုပ်ရှိတာ ရတာနဲ့ blog မှာ အမှတ်တရ တင်ဖြစ်ပါတယ်။ တောင်းထားတာတော့ ကြာပြီ အခုမှ တင်ဖြစ်တာ။