之前在windows下用串口的時候都是用的windows的API做串口編程,他有個弊端,在接收到數據之後,不能立刻進行處理;但是CMSComm可以在接收到數據之後會立刻處理這些數據;
右鍵--> Insert ActiveX Control -->Microsoft Communications Control,version ...
之後,在Dialog上就會出現一個小圖標:
可以右鍵看看他的屬性:默認情況下是選擇COM1,波特率:9600,校驗位:None,數據位:8,停止位:1。
OK,我們需要添加一個這個控件的變量;
CMSComm m_serial;
//串口的詳細造作各個步驟
m_serial.SetCommPort(1);//設置輸入要打開的端口
m_serial.SetInBufferSize(10240);//設置接收緩衝區
m_serial.SetOutBufferSize(1024);//設置發送緩衝區
m_serial.SetInputMode(1);//設置輸入方式爲二進制
/* 設置一些流標誌位 */
m_serial.SetEOFEnable(false);
m_serial.SetDTREnable(false);
m_serial.SetRTSEnable(false);
m_serial.SetSettings("9600,n,8,1”);
m_serial.SetRThreshold(1);//設置幾個字節觸發接收響應事件
m_serial.SetInputLen(0);//清除接收字符統計區
m_serial.SetPortOpen(TRUE);//打開串口
//串口發送,需要藉助CByteArray類
CByteArray array;
memcpy(array.GetData(),str,str_len);
m_serial.SetOutput(COleVariant(array));
//串口接收,同樣需要藉助CByteArray類
//爲了保證數據接收的實時性,我們需要重載OnOnCommMscom()函數
//右鍵-->Class Wizard 安裝下面的圖操作
然後就添加了重載函數OnOnCommMscom();
然後在裏面添加接收代碼:
//判斷事件類型,2爲接收到數據了
VARIANT vResponse;
char *buff;
if(m_serial.GetCommEvent() == 2){
int recv_len = m_serial.GetInBufferCount();;
buff = (char *)malloc(recv_len);
if(recv_len > 0){
vResponse = m_serial.GetInput();
memcpy(buff,(unsigned char *)vResponse.parray->pvData,recv_len);
/*TODO: Add your control notification handler code here*/
}
delete buff;
}
這樣即可了;有時候我們想在程序裏面先掃描下,那個端口可以被打開,也就是你插入了那些端口;我大致看了下這個控件,貌似沒有發現可以掃描的插件;
然後我就調用Windows的API,寫了一個掃描的程序;
HANDLE fd;
char i = 1;
char com_name[5];
m_port.ResetContent();
while(i < 21){
sprintf(com_name,"COM%d",i);
fd = CreateFile(com_name,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
if(fd != INVALID_HANDLE_VALUE){
m_port.AddString(com_name);
CloseHandle(fd);
}
i++;
}
if(m_port.GetCount() > 0)
m_port.SetCurSel(0);
m_port是我的一個ListBox控件的控制變量;這樣,他就會自動幫我添加已經找到的端口到ListBox裏面;
希望大家多多指點!