CMSComm 控件串口编程

本文转载连接: https://blog.****.net/ieczw/article/details/21636695

 

之前在windows下用串口的时候都是用的windows的API做串口编程,他有个弊端,在接收到数据之后,不能立刻进行处理;但是CMSComm可以在接收到数据之后会立刻处理这些数据;

右键--> Insert ActiveX Control -->Microsoft Communications Control,version ...

CMSComm 控件串口编程

之后,在Dialog上就会出现一个小图标:CMSComm 控件串口编程

可以右键看看他的属性:默认情况下是选择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  安装下面的图操作

CMSComm 控件串口编程

然后就添加了重载函数OnOnCommMscom();

然后在里面添加接收代码:

//判断事件类型,2为接收到数据了

 

 
  1. VARIANT vResponse;

  2. char *buff;

  3. if(m_serial.GetCommEvent() == 2){

  4. int recv_len = m_serial.GetInBufferCount();;

  5. buff = (char *)malloc(recv_len);

  6. if(recv_len > 0){

  7. vResponse = m_serial.GetInput();

  8. memcpy(buff,(unsigned char *)vResponse.parray->pvData,recv_len);

  9. /*TODO: Add your control notification handler code here*/

  10.  
  11. }

  12. delete buff;

  13. }

这样即可了;有时候我们想在程序里面先扫描下,那个端口可以被打开,也就是你插入了那些端口;我大致看了下这个控件,貌似没有发现可以扫描的插件;

 

然后我就调用Windows的API,写了一个扫描的程序;

 

 
  1. HANDLE fd;

  2. char i = 1;

  3. char com_name[5];

  4. m_port.ResetContent();

  5. while(i < 21){

  6. sprintf(com_name,"COM%d",i);

  7. fd = CreateFile(com_name,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

  8. if(fd != INVALID_HANDLE_VALUE){

  9. m_port.AddString(com_name);

  10. CloseHandle(fd);

  11. }

  12. i++;

  13. }

  14. if(m_port.GetCount() > 0)

  15. m_port.SetCurSel(0);m_port是我的一个ListBox控件的控制变量;这样,他就会自动帮我添加已经找到的端口到ListBox里面;