昨天工作用到了串口通信,MMP的,昨天懵逼了一下午,今天終於整通了,身為菜鳥,大師們是不懂這些心痛的。
進入主題:使用BCB提供的控件TComm編程方便且簡單,TComm位於System分類里面。 / /備注(網友說這種方式可以用,當要求高的時候還是不夠用的。)
1、窗口拖入一個TComm控件
2、屬性框參數設置。
/ /備注(常需設置的參數:CommName串口名 、BaudRate波特率、ByteSize、Parity校驗、ReadIntervalTimeout讀串口時兩字符時間間隔)
3、接收數據並處理
BCB提供了 OnReceiveData()自動接收來自串口的數據
//備注(typedef void* Pointer;//標准定義的
void __fastcall cm1ReceiveData(TObject *Sender, Pointer Buffer, // Buffer存放着讀取的數據 WORD BufferLength); //Bufferlength 存放着 讀取的數據的長度
4、發送數據
用串口對象調用寫數據函數
function TComm.WriteCommData( pDataToWrite: PChar; dwSizeofDataToWrite: Word ): Boolean; // 參數一:發送的數據;參數二:發送的數據的長度
5、具體使用串口
TComm * cm1; //1、打開串口
try { cm1->StartComm(); //函數會讓程序掛掉,不知道為什么 try catch可規避,不影響使用 CM1PortOpenSucccessFlag=true; } catch(...) { m_step = -1; //Application->MessageBoxA("OK","串口打開失敗",MB_OK|MB_SYSTEMMODAL); }
//2、發送的數據
char * cmd;
cmd="MCH\r\n"; //注意:命令MCH末尾要跟着\r\n不然串口不回數據,至於為什么,各位開腦洞吧
bool rtn = cm1->WriteCommData(cmd,strlen(cmd)); //注意:第二個參數如果按照函數定義那樣用sizeof函數是有問題的,sizeof求的是所占空間,而不是字符個數
//3、睡眠等待Sleep(500);
發送數據后,接着要使用cm1ReceiveData串口返回的數據,需要等待一些時間。如果不等待,一直不等的 writeCommData將會出錯。
//4、接收函數(自動接收)
void __fastcall TparaForm::cm1ReceiveData(TObject *Sender, Pointer Buffer,
WORD BufferLength)
{
char recvData[100];
unsigned char revBuffer[100];
memset(recvData, 0, 100);
//AnsiString str;
for(int i=0; i<BufferLength; i++, ((BYTE *)Buffer)++)
{
revBuffer[i] = *(BYTE *)Buffer ;
recvData[i] = revBuffer[i];
}
//得到char* 的recvData接收數據之后,根據需要使用,下面是個例子
m_readData=recvData; //成員變量
m_readDataLength=BufferLength;
}
//5、使用完,關閉串口
cm1->StopComm();
工作小助攻:AccessPort串口監視軟件 易學易用
參考鏈接:http://www.myexception.cn/h/530898.html(串口各項參數解釋)
https://bbs.csdn.net/topics/310121049(串口監視工具)
https://blog.csdn.net/Tercel99/article/details/46690921(這個詳細)
http://ascii.911cha.com/(Ascii值對照表)
http://www.cnblogs.com/azbane/p/8710064.html(AnsiString與各種數據類型間的相互轉換)
棒棒噠~~么么噠