CMSComm 控件串口编程
本文转载连接: https://blog.****.net/ieczw/article/details/21636695
之前在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里面;