Serial Port Programming by VB 6.0 (၁)

     VB 6.0 ဟာ အခုလို .NET ေတြ တြင္က်ယ္ေနတဲ႔ ေခတ္မ်ိဳးမွာ သိပ္ ေခတ္မစားေတာ႔ပါဘူး။ ဒါေပမယ္႔ portable ပိုျဖစ္တယ္ ဆိုတဲ႔ အခ်က္ေၾကာင္႔ ကၽြန္ေတာ္တို႔ တစ္ခ်ိဳ႕ တစ္ေလ အတြက္ေတာ႔ အခုထိ လက္လႊတ္လို႔ မရေသးပါဘူး။ အခု ေဆာင္းပါးမွာေတာ႔ VB 6.0 ကိုသံုးၿပီး Serial Port ကို ေဒတာေတြ ဘယ္လို ေရးရမယ္ ဆိုတာကို ရွင္းလင္း တင္ျပသြားမွာ ျဖစ္ပါတယ္။
  ဒါေပမယ္႔ ဒီေဆာင္းပါးကို ဖတ္ဖို႔ VB 6.0 နဲ႔ ပက္သက္တဲ႔ အေျခခံ အခ်ိဳ႕ကို သိထားၿပီး ျဖစ္ဖို႔ေတာ႔လိုပါတယ္။ ကၽြန္ေတာ္ ေရးတဲ႔ ေဆာင္းပါး အေတာ္မ်ားမ်ားဟာ အေျခခံ ရွိၿပီးသား စာဖတ္ ပရိသတ္ အတြက္ ရည္ရြယ္ထားတာ ျဖစ္တဲ႔ အတြက္ ေလ႔လာကာစ စာဖတ္ ပရိသတ္ အတြက္ ဖတ္ရတာ အခက္အခဲ ရွိတယ္ ဆိုရင္ ေတာင္းပန္ပါတယ္။
    PC တစ္လံုးရဲ႕ Serial data ေတြကို Serial Port (Com1-Com4) ကေန ပို႔ေဆာင္တဲ႕ ေနရာမွာ ASCII data ေတြကို အသံုးခ် ရပါတယ္။ အဲဒီလို လုပ္ေဆာင္ဖို႔ VB 5.0 နဲ႔ 6.0 မွာ MsComm ဆိုတဲ႔ control ကို အသံုးျပဳရမွာ ျဖစ္ပါတယ္။ အဲဒီ control ဟာ custom control ျဖစ္တဲ႔ အတြက္ default control အေနနဲ႔ ပါလာမွာ မဟုတ္ပါဘူး။ ဒါေၾကာင္႔ menu ထဲက Project - Components ဆိုၿပီး ေပၚလာတဲ႔ dialog box ထဲက Microsoft comm control 6.0 ဆိုတာေလးကို ပံုမွာ ျပထားတဲ႔ အတိုင္း ေရြးခ်ယ္ေပးရပါမယ္။
     ေနာက္ တစ္ဆင္႔ အေနျဖင္႔ MS Comm control (တယ္လီဖုန္းပံု) ကို ေအာက္ပံုတြင္ ေဖၚျပထားသည္႔ အတိုင္း Toolbox မွ form ေပၚသို႔ ဆြဲယူ ေရးသား ရမည္ ျဖစ္သည္။
     Serial Port ကို programming အသံုးျပဳ၍ interfacing ျပဳလုပ္ရာတြင္ နည္းလမ္း ၂ ခုကို အသံုးျပဳႏိုင္သည္။
1. Interrupt communication
Interrupt communication ျပဳလုပ္ရာတြင္ Interrupt process မွ အဆိုပါ devices မ်ားမွ မိမိ ကြန္ပ်ဴတာ ၏ comm port ဆီသို႔ signal ပို႔မပို႔ကို ေစာင္႔ၾကည္႔ ေနရမည္ ျဖစ္သည္။ ပရိုဂရမ္မာ တစ္ေယာက္အေနျဖင္႔ ComEvent ႏွင္႔ OnCommEvent ႏွစ္ခုကို အသံုးျပဳရမည္ ျဖစ္သည္။ အကယ္၍ အဆိုပါ events မ်ား active ျဖစ္လာပါက devices မ်ားမွ signal မ်ား ေပးပို႔ေၾကာင္း သိရွိႏိုင္မည္ ျဖစ္သည္။
2. Polling Communication
PC system တစ္ခုတြင္ polling ဆိုသည္မွာ CPU ႏွင္႔ terminal တစ္ခုၾကား ေဒတာ ပို႔ေဆာင္ျခင္း ျဖစ္သည္။ ဥပမာ ကီးဘုတ္မွ ကီး တစ္ခုကို ႏွိပ္ထားမထား ေစာင္႔ၾကည္႔သည္႔ ပံုစံမ်ိဳးျဖစ္သည္။ သို႔ေသာ္ အဆိုပါ device တစ္ခုတည္းကိုသာ အခ်ိန္ျပည္႔ ေစာင္႔ၾကည္႔ေနပါက infinite looping ကဲ႔သို႔ အေျခအေနမ်ိဳး ျဖစ္ကာ အျခား devices မ်ား အလုပ္ ဆက္မလုပ္ႏိုင္ေတာ႔ဘဲ ကြန္ပ်ဴတာ ဟန္း သြားမည္ ျဖစ္သည္။ ထိုအေျခအေနမ်ိဳးကို "Web Poll" ဟုေခၚၿပီး Loss time 90% ရွိတတ္သည္။ အဆိုပါ cycle time lose ကို ေရွာင္ရွားရန္ VB Programming တြင္ Roung Robin ဟု ေခၚေသာ Timer control ကို အသံုးျပဳ၍ Serial Port ကို အလွည္႔က် ေစာင္႔ၾကည္႔ သည္႔ စနစ္ ကို အသံုးခ်ႏိုင္သည္။
MSComm control တြင္ interrupt ကို အသံုးျပဳႏိုင္ေသာ event မွာ Oncomm Event ျဖစ္သည္။ ပံုမွန္ Serial port communication အတြက္ အသံုးျပဳေလ႔ရွိေသာ comm event မွာ comEvReceive ႏွင္႔ comEvSend တို႔ ျဖစ္သည္။ Modem ကို အသံုးျပဳ၍ ဆက္သြယ္မႈ အေျမာက္အမ်ား အတြက္ signals မ်ားကို ေစာင္႔ၾကည္႔ရန္ အတြက္မူ MSDN ကိုသာ ရွာေဖြရန္ ရည္ညႊန္းလိုပါသည္။
MSComm Element (Serial Port အတြက္ setting မ်ား ျပဳလုပ္ျခင္း)
• ComPort သည္ RS-232 port interfacing အတြက္ Com1, Com2 စသျဖင္႔ ေရြးခ်ယ္ေပးရန္ ျဖစ္သည္။
• Setting မွာ Baud,Parity,Data(number of bits),Stop ပံုစံျဖည္႔ရန္ ျဖစ္သည္။ ဥပမာ။ "1200,n,8,1 "
• HandShaking တြင္ ကၽြန္ေတာ္တို႔ အေနျဖင္႔ အမ်ိဳးအစား ၄ မ်ိဳးကို ေအာက္ပါအတိုင္း သတ္မွတ္ ေပးႏိုင္ပါသည္
• comNone
• comXonXoff
• comRTS
• comTRSXonXoff
အခ်က္အလက္မ်ား ေပးပို႔ရာတြင္ Buffer ကို အသံုးျပဳပံု
-InBuffersize ကို လက္ခံရရွိလာေသာ အခ်က္အလက္မ်ား အတြက္ buffer အရြယ္အစားကို သတ္မွတ္ရန္ အသံုးျပဳသည္။
- OutBuffersize ကို ေပးပို႔မည္႔ အခ်က္အလက္မ်ား အတြက္ buffer အရြယ္အစားကို သတ္မွတ္ရန္ အသံုးျပဳသည္။
- Rthreshold ကို အခ်က္အလက္မ်ား ေပးပို႔ရာတြင္ Event-driven ျဖစ္ေစရန္ သတ္မွတ္သည္။
- Sthreshold ကို အခ်က္အလက္မ်ား ရယူရာတြင္ Event-driven ျဖစ္ေစရန္ သတ္မွတ္သည္။
- Inputlen သည္ buffer အတြင္း လက္ခံရယူႏိုင္ေသာ အခ်က္အလက္ အေရအတြက္ ကို သတ္မွတ္ေပးသည္။
- EOFEnable ဆိုသည္မွာ ဖိုင္ အဆံုးကို သတ္မွတ္ထားေသာ သေကၤတ ျဖစ္သည္။
About Hardware
- ParityReplace mean is character value instead of occur Parity Error
- NullDiscard mean is define in receive or not "NULL CHARACTER"
- RTSEnable mean is define signal RTS (Request To Send)
- DTSEnablemean is define signal DTR(Data Terminal Ready)
Port မ်ားကို ဆက္သြယ္ရန္အတြက္ MSComm ၏ properties မ်ားကို ေရြးခ်ယ္ သတ္မွတ္ျခင္း
1. CommPort Property ကို coding မိမိ ေရးသားရာတြင္ အသံုးျပဳလိုသည္႔ comm port ကို ေရြးခ်ယ္ႏိုင္ရန္ အတြက္ အသံုးျပဳႏိုင္သည္။ ဥပမာ။ Com1 ကို အသံုးျပဳမည္ဆိုပါက MSComm1.CommPort=1 ဟူ၍ေရးသားႏိုင္သည္။
2. Settings Property ကို coding ေရးသားရာတြင္ အခ်က္အလက္မ်ား ေပးပို႔/လက္ခံ မည္႔ သတ္မွတ္ခ်က္မ်ား ျဖစ္ေသာ Baud(rate for receive/send data),Parity(N),Number of bits,bits Stop စသည္တို႔ကို သတ္မွတ္ႏိုင္ရန္ အသံုးျပဳထားျခင္း ျဖစ္ပါသည္။ အသံုးျပဳပံုမွာ ေအာက္ပါ အတိုင္း ျဖစ္ပါသည္ -
MSComm1.Settings="Baud(rate for receive/send data),Parity(N),Number of bits,bits Stop"
ဥပမာ။ MSComm1.Settings="1200,N,8,1"
3. InputLen Property ကို input buffer size သတ္မွတ္ရန္ အတြက္ အသံုးျပဳသည္။
Exemple MSComm1.InputLen=1
4. Property PortOpen ကို port အား ဖြင္႔ျခင္း ပိတ္ျခင္း ျပဳလုပ္ရန္ အသံုးျပဳသည္။ Open =True ,Close =False
ဥပမာ။ MSComm1.PortOpen=True
5. Rthreshold Property သည္ buffer တြင္ အခ်က္အလက္မ်ား လက္ခံရရွိလာသည္႔ အခါတြင္ Event-driven activation ကို ျဖစ္ေပၚေစသည္။ OnComm Event procedure အတြင္းရွိ CommEvent ကို active ျဖစ္ေစသည္။
Example MSComm1.Rthreshold =1
MSComm properties မ်ားကို port selection ႏွင္႔ port enabling functions အစရွိေသာ communication parameters မ်ားအား သတ္မွတ္ေပးရန္ အသံုးျပဳႏိုင္သည္။ အဆိုပါ setting မ်ားကို ေအာက္တြင္ ေဖၚျပထားသကဲ႔သို႔ Form_load() procedure တြင္ ေရးသားျခင္း သို႔မဟုတ္ new Sub တစ္ခု ဖန္တီး၍ ေနာင္မွ ေခၚယူ အသံုးခ် ျခင္းမ်ား ျပဳလုပ္ႏိုင္သည္။
Private Sub Form_Load()
MSComm1.Settings="1200,N,8,1"
MSComm1.CommPort=1
MSComm1.InputLen=1
MSComm1.PortOpen=True
MSComm1.Rthreshold =1
End Sub
Serial port ကို သံုးျပဳ၍ ဆက္သြယ္ျခင္း
အထက္တြင္ ေရးသားျပခဲ႔ေသာ coding အရ Comm port ကို အသံုးျပဳ RS-232 ႏွင္႔ ဆက္သြယ္ရန္ အတြက္ လိုအပ္ေသာ အခ်က္အလက္မ်ား သတ္မွတ္ေပးထားၿပီး ျဖစ္ရာ ေဒတာ ေပးပို႔ျခင္း၊ ရယူျခင္းမ်ားကို Output ႏွင္႔ Input properties မ်ား အသံုးျပဳ၍ လုပ္ေဆာင္ ႏိုင္ပါသည္။
Output = အခ်က္အလက္မ်ားကို Serial port သို႔ ေပးပို႔ရန္ အသံုးျပဳသည္။
Input == အခ်က္အလက္မ်ားကို Serial port မွ ရယူရန္ အသံုးျပဳသည္။ but this will being command to write at Event Property OnComm that has in Sub MSComm_OnComm that read data from serial port or RS-232
ဥပမာ
keyboard မွ ရိုက္သြင္းလိုက္ေသာ အခ်က္အလက္မ်ားကို serial port သို႔ ေပးပို႔ရန္ အတြက္ TextBox Control ၏ KeyPress event ကို ေအာက္ေဖၚျပပါ အတိုင္း အသံုးျပဳႏိုင္သည္။
Sub txtRXTX_KeyPress(KeyAscii As Integer)
MSComm1.Output=Chr$(KeyAscii)
End Sub
ေပးပို႔ေသာ အခ်က္အလက္မ်ား ကို လက္ခံရယူရန္ အတြက္မူ OnComm event ကို ေအာက္ပါ နမူနာ အတိုင္း အသံုးျပဳ ႏိုင္သည္။
Private Sub MSComm1_OnComm()
Dim StrData As Variant 'define variable type as it is variant
Str=MSComm1.Input
Text1.Text=StrData
End Sub
ကၽြန္ေတာ္ ပထမဆံုး Input property ကို အသံုးျပဳစဥ္က direct data မ်ား ရယူရာတြင္ အဆင္မေျပ ျဖစ္ခဲ႔ရသည္။ ထို႔ေၾကာင္႔ filter function အေနႏွင္႔ ေအာက္တြင္ ေရးသား ေဖၚျပထားေသာ DataShow function ကို အသံုးျပဳခဲ႔ရသည္။
DataShow function
Public Static Sub DataShow(TextShow As Control, Data As String)
Const SpeedBaud = 16000
Dim LngSize As Long, X
LngSize = Len(TextShow.Text)
If TermSize > SpeedBaud Then
TextShow.Text = Mid$(TextShow.Text, 4097)
LngSize = Len(TextShow.Text)
End If
TextShow.SelStart = SpeedBaud
Do
X = InStr(Data, Chr$(8))
If X Then
If X = 1 Then
TextShow.SelStart = SpeedBaud - 1
TextShow.SelLength = 1
Data = Mid$(Data, X + 1)
Else
Data = Left$(Data, X - 2) & Mid$(Data, X + 1)
End If
End If
Loop While X
Do
X = InStr(Data, Chr$(10))
If X Then
Data = Left$(Data, X - 1) & Mid$(Data, X + 1)
End If
Loop While X
X = 1
Do
X = InStr(X, Data, Chr$(13))
If X Then
Data = Left$(Data, X) & Chr$(10) & Mid$(Data, X + 1)
X = X + 1
End If
Loop While X
TextShow.SelText = Data
TextShow.SelStart = Len(TextShow.Text)
End Sub

Call function DataShow :
Call DataShow Text1,(StrConv((StrData),vbUnicode))

Using Even in OnComm() procedure
ေအာက္ပါ နမူနာ ပရိုဂရမ္တြင္ Select case condition ကို အသံုးျပဳ၍ ေရးသား ထားပါသည္။
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Dim Buffer As Variant
Buffer = MSComm1.Input
ShowData txtRXTX, (StrConv((Buffer), vbUnicode))
Case comEvSend : 'here put your condition that you want
Case comEvCTS
Case comEvDSR
Case comEvCD
Case comEvRing
Case comEvEOF
Case comBreak
Case comCDTO
Case comCTSTO
Case comDCB
Case comDSRTO
Case comFrame
Case comOverrun
Case comRxOver
Case comRxParity
Case comTxFull
End Select
End Sub
ကၽြန္ေတာ္႔ အေနနဲ႔ Microcontroller ကို Serial port ကေနတစ္ဆင္႔ Ascii command ေတြ လွမ္းပို႔ၿပီး stepper motor တစ္လံုးကို ဘယ္လိုမ်ိဳး ထိန္းခ်ဳပ္လို႔ ရလဲ ဆိုတာကို ေအာက္မွာ နမူနာ ေရးျပထား ပါတယ္။
A99 ' accelerate setting - အရွိန္ျမႇင္႔ဖို႔
V3 ' speed setting - အရွိန္ႏႈန္း
D5000 ' step setting -
H- 'direction setting - ဦးတည္ရာ ထိန္းခ်ဳပ္ရန္
G ' go ,it is start motor command - ေမာ္တာ စတင္ရန္
ေအာက္က နမူနာ ပရိုဂရမ္ေလးမွာ button တစ္ခု ထည္႔ထားၿပီး click လုပ္တဲ႕ အခ်ိန္မွာ အလုပ္စလုပ္မွာ ျဖစ္ပါတယ္။
Private Sub Command1_Click()
MSComm1.Settings="1200,N,8,1"
MSComm1.CommPort=1
MSComm1.InputLen=1
MSComm1.PortOpen=True
MSComm1.Rthreshold =1
If MSComm1.PortOpen Then
MSComm1.Output ="A99 V3 D5000 H- G " ' character lastest will be press space bar 1 time before put symbol "
End If
End Sub
ေအာက္ပါ ပရိုဂရမ္ကေတာ႔ MODEM ကို အသံုးျပဳၿပီး Serial port ကေန အဆက္အသြယ္ျပဳလုပ္တဲ႔ နည္းလမ္း နမူနာပဲ ျဖစ္ပါတယ္။
Private Sub Form_Load()
Dim strValue As String ' define Buffer value from Modem
MSComm1.CommPort = 1 ' select Com1
MSComm1.Settings = "9600,n,8,1" ' setting parameter in communicate with com port
MSComm1.InputLen = 0 'define size of Input buffer (comming with Modem)
MSComm1.PortOpen = True ' command open port
MSComm1.Output = "ATV1Q0" & Chr&(13) 'send AT command to Modem
Do
DoEvents
strValue = strValue & MSComm1.Input ' get input data of Com Port
Loop Until InStr(strValue, "OK" & vbCrLf)
MSComm1.PortOpen = False 'Close port
End Sub
မွတ္ခ်က္မ်ား
1. PORT ENABLING
Port ေရြးခ်ယ္ျခင္း ႏွင္႔ enable ျပဳလုပ္ျခင္းမ်ားကို form load ႏွင္႔ unload subroutines မ်ားတြင္ coding ေရးသား သင္႔သည္။ သို႔မဟုတ္ radio buttons ႏွင္႔ pull down menus မ်ားကို အသံုးခ်၍ runtime တြင္ ေရြးခ်ယ္ႏိုင္ရန္ စီမံထားသင္႔သည္။
2.ေဒတာမ်ား ရယူျခင္း
serial port မွ ေဒတာမ်ား ရယူရာတြင္ serial buffer ထဲမွာ လက္ခံရရွိတဲ႔ စာလံုးအေရအတြက္ မွန္ကန္တဲ႔ အထိ ေစာင္႔ဖို႔ အေရးႀကီးပါတယ္။ မွန္ကန္တဲ႔ စာလံုး အေရအတြက္ ရရွိလာရင္ carriage return (တစ္ေၾကာင္း ဆင္းဖို႔) တစ္လံုး နဲ႔ line feed အတြက္ တစ္လံုး စုစုေပါင္း ၂ လံုး ထပ္ေပါင္းထည္႔ၿပီး ေစာင္႔ၾကည္႔ရမွာ ျဖစ္ပါတယ္။
3.ေဒတာမ်ား ေပးပို႔ျခင္း
အေျခအေန အေတာ္မ်ားမ်ားမွာ Serial port ကေန ေဒတာ ေပးပို႔ရာမွာ Command တစ္ခုနဲ႔ တန္ဖိုး တစ္ခုကို တြဲၿပီး ပို႔ရမယ္႔ အေျခအေနမ်ိဳး ႀကံဳရေလ႔ ရွိပါတယ္။ ဥပမာ။ 'GO' ဆိုတဲ႔ ညႊန္ၾကားခ်က္နဲ႔ '1500' ဆိုတဲ႔ position value တစ္ခုကို တြဲလ်က္ ေပးခ်င္တယ္ဆိုရင္ ေအာက္ပါအတိုင္း ေပးပို႔လို႔ ရပါတယ္။
MSComm1.Output = " GO 1500" + Chr(13)
(အဲဒီမွာ Chr(13) ဆိုတာ carriage return (တစ္ေၾကာင္းဆင္းတဲ႔ သေကၤတ) ျဖစ္ပါတယ္။)
စာဖတ္သူမ်ား အေနနဲ႔ Microcontroller ေတြကို Serial port သံုးၿပီး ဘယ္လို ဆက္သြယ္ရလဲဆိုတာကို သိခ်င္ေနမယ္ ထင္ပါတယ္။ တကယ္ေတာ႔ အထက္က ေဖၚျပထားၿပီးသား နည္းလမ္းေတြကိုပဲ သံုးၿပီး ဆက္သြယ္ရတာပဲ ျဖစ္ပါတယ္။ ဒါေပမယ္႔ ကိုယ္ ဆက္သြယ္မယ္႔ Microcontroller ေတြ အသံုးျပဳထားတဲ႔ protocol ေတြကိုေတာ႔ ေသေသခ်ာခ်ာ သိထားရမွာ ျဖစ္ပါတယ္။
.....ဆက္ရန္

Please Share This Post

Share on Facebook Plus on Google+