之前在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里面;
希望大家多多指点!
【MFC】CMSComm 控件串口编程,布布扣,bubuko.com
原文:http://blog.csdn.net/ieczw/article/details/21636695