【MFC】CMSComm 控件串口編程

之前在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裏面;


希望大家多多指點!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章