在VC++的平臺下,串口通信一般存在兩種形式:1.直接通過API函數設計通信的參數等,這種方式的好處在於與實際的結合比較的靈活,缺點是編碼的工作量比較大,要了解通信的各個環節的話就必須弄懂每個API函數的具體意思。2.使用VC++提供的串行通信控件MSComm,這種方法編碼簡單易懂,但是不夠靈活。
本文就主要介紹第二種方法。
首先,選擇菜單-->添加到工程-->選擇Component and Controls Gallery文件夾-->選定Registered ActiveX Controls文件夾,選定Microsoft Communications Control, version 6.0控件,然後將該控件從工具箱拖到對話框裏面。
其次,設置MSComm控件的屬性,下面主要介紹MSComm的幾個屬性:
m_Comm.SetCommPort(1);//設定的串口號,1表示選擇的串口號是1
m_Comm.SetInBufferSize(1024);//設置接受緩衝區的大小
m_Comm.SetOutBufferSize(1024);//設置發送緩衝區的大小
m_Comm.SetInputMode(1); //0是以文本的形式取出數據,1是以2進制的形式取出數據
m_Comm.GetInput();//先預讀緩衝區以清除殘留數據
m_Comm.SetSettings("9600,N,8,1"); //波特率9600,無校驗,8個數據位,1個停止位
m_Comm.SetInputLen(0); //設置當前接收區數據長度爲0, 設置成從緩衝區讀取全部內容
m_Comm.SetRThreshold(1);//參數1表示每當串口接收緩衝區中有多於或等於1個字符時將引發一個接收數據的OnComm事件
if( !m_Comm.GetPortOpen())
{
m_Comm.SetPortOpen(TRUE);//打開串口
}
最後在OnComm事件裏面添加接受數據的具體代碼,下面是本人在曾經在項目中的一段代碼,僅供參考:
VARIANT Rec_Data;
char Rec_Data_Array[2048];
if (m_Comm.GetCommEvent() == 2) //事件值爲2表示接收緩衝區內有字符
{
Rec_Data = m_Comm.GetInput();//從緩衝區取出數據
int Data_Len = Rec_Data.parray->rgsabound->cElements; //取出一維的數據個數
memcpy(Rec_Data_Array, (char*) Rec_Data.parray->pvData, Data_Len); //拷貝出數據
Rec_Data_Array[Data_Len] = NULL;
CString str1;
CString str2;
for(int i = 0; i<Data_Len ; i++)
{
str2.Format("%02x",Rec_Data_Array[i]);//16進制的形式接受數據
str1 = str2.Right(2);//取右邊兩位數據(註釋:一般來說是不用取右邊兩位數據的,但是項目中實際測試還是要取右邊2位數
據才能得到真正的結果,這行代碼僅供參考,可以不要)
this->m_receive = this->m_receive + str1;//m_receive就爲接受的數據
}
}