Search This Blog

Wednesday, May 31, 2017

Programming serial port in C++ with wxWidgets for Windows and Linux

Seriar Port ကိုအသုံးပြုနိုင်တဲ့၊ ကျနော်ဖန်တီးထားတဲ့ C++ class library လေးတစ်ခု အကြောင်း ပြောချင်ပါတယ်။ သူက cross-platform ဖြစ်ပြီး Windows ရော၊ Linux မှာပါ သုံးနိုင်ပါတယ်။ နမူနာ အနေနဲ့ ရိုးရှင်းတဲ့ C++ console program လေးတစ်ခုကို ဖော်ပြထားပြီး၊ GUI application အနေနဲ့ wxWidgets ကိုသုံးထားတဲ့ program ကိုပါ ဖော်ပြထားပါတယ်။ သူတို့ရဲ့ source code တွေကို အောက်က လင့်ခ် မှာ တွေ့နိုင်ပါတယ်။

https://github.com/yan9a/serial


Figure. A wxWidgets GUI application using 'Serial' class with Visual Studio 2017


'Serial' class သုံးထားတဲ့ နမူနာ serialcon.cpp ဆိုတဲ့ program လေးကို အောက်မှာ ပြထားပါတယ်။
#include
#include "Serial.h"
using namespace std;
int main()
{
 Serial com("\\\\.\\COM1",9600,8,'N',1); //Windows
 //Serial com("/dev/ttyS0",9600,8,'N',1); //Linux

 printf("Opening port %s.\n",com.GetPort().c_str());
 if (com.Open() == 0) { printf("OK.\n");}
 else {printf("Error.\n");return 1;}

 bool successFlag;
 printf("Writing.\n");
 char s[]="Hello";
 successFlag=com.Write(s);//write string
 successFlag=com.WriteChar('!');//write a character

 printf("Waiting 3 seconds.\n");
 delay(3000);//delay 5 sec to wait for a character

 printf("Reading.\n");
 char c=com.ReadChar(successFlag);//read a char
 if(successFlag) printf("Rx: %c\n",c);

 printf("Closing port %s.\n",com.GetPort().c_str());
 com.Close();
 return 0;
}

အစမှာ #include "Serial.h" လို့ ကြေငြာပြီး 'Serial' class ကို ထည့်လိုက်ပါတယ်။ ပြီးတော့ 'com' လို့ခေါ်တဲ့ object တစ်ခုကို port number, baud rate စတဲ့ တန်ဖိုး တွေနဲ့ ကြေငြာပါတယ်။ ဒီနမူနာအတွက်ဆိုရင် Windows မှာ COM1 ကိုသုံးမှာဖြစ်ပြီး၊ Linux မှာ ttyS0 ကို သုံးမှာဖြစ်ပါတယ်။ Linux မှာ USB device ကို သုံးမယ် ဆိုရင်တော့ ttyUSB0 ဖြစ်ကောင်း ဖြစ်နိုင် ပါတယ်။ Parity အတွက် က 'N','E','O','M', သို့ 'S' တို့ကို none, even, odd, mark, နဲ့ space တို့ အတွက် သုံးလို့ ရပါတယ်။
com ကို com.Open() နဲ့ ဖွင့်ပါတယ်။ Write နဲ့ WriteChar methods တွေကိုသုံးပြီး null terminated string ဒါမှမဟုတ် character တစ်လုံးကို ပို့နိုင်ပါတယ်။ ReadChar method နဲ့ character ကို ဖတ်တဲ့အခါ စောင့်မနေပဲ non-blocking ပုံစံနဲ့ ဖတ်မှာဖြစ်တဲ့အတွက် character ရှိမနေရင် successFlag က false လို့ပြပါမယ်။ Close method နဲ့ com ကို ပိတ်ပါတယ်။ RTS နဲ့ DTR lines တွေကိုလည်း control လုပ်နိုင်ပါတယ်။ CTS တို့၊ DSR တို့လို Status lines တွေကိုလည်း ဖတ်နိုင်ပါတယ်။ "serialcon.cpp" ကို Ubuntu Linux မှာ အောက်ကအတိုင်း compiled လုပ်၊ run လုပ်နိုင်ပါတယ်။
g++ serialcon.cpp Serial.h -o serialcon
sudo ./serialcon

Windows ပေါ်မှာတော့ Visual Studio ဒါမှမဟုတ် tdm-gcc တို့၊ mingw တို့လို compiler တစ်ခုခုကို သုံးပြီး အောက်ကလိုမျိုး complie လုပ်၊ run လုပ်နိုင်ပါတယ်။
g++ serialcon.cpp Serial.h -o serialcon.exe -std=c++11
.\serialcon.exe

source code မှာနမူနာ wxWidgets GUI application - wxserial.cpp ပါ ပါပါတယ်။ အပေါ်က စစချင်းပုံက Visual C++ 2017 နဲ့ သုံးထားတာပါ။
အဲ့ဒီ wxserial.cpp program ကိုပဲ ဘာမှ မပြင်ပဲ Debian အခြေပြု Linux တွေပေါ်မှာ အောက်ကအတိုင်း built လုပ်၊ run လုပ်လို့ရပါတယ်။
g++ wxserial.cpp Serial.h wx-config --cxxflags --libs -o wxserial -DNDEBUG
sudo ./wxserial


အဲ့ဒီ commands တွေလုပ်ဖို့အတွက် wxWdigets တော့ရှိနေဖို့လိုပြီး၊ သူ့ကိုအောက်ကအတိုင်း ထည့်သွင်းနိုင်ပါတယ်။
sudo apt-get install build-essential
sudo apt-get install libwxgtk3.0-dev


Running serial application on Ubuntu


အောက်က link တွေ ကတော့ wxWidgets သုံးတဲ့ အကြောင်းနဲ့ ၊ PC serial port ကို VB6 တို့ Visual Basic 2005 တို့နဲ့ သုံးတဲ့အကြောင်း ရေးခဲ့ဘူးတဲ့ အရင် ဆောင်းပါး အဟောင်းလေး တွေပါ။

Related posts:

No comments:

Post a Comment