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:

No comments:

Post a Comment