关于MSComm控件中接收缓冲区数据的BYTE数组的一点疑惑使用MSComm控件创建一个MFC的基于对话框的串口监控小
关于MSComm控件中接收缓冲区数据的BYTE数组的一点疑惑
使用MSComm控件创建一个MFC的基于对话框的串口监控小程序,在做测试时遇到一点疑惑:
在MSComm控件的OnCommMscomm()事件中,有这么一个BYTE数组用来接收接收缓冲区的数据:
C/C++ codeBYTE rxdata[2048]; //定义存放二进制数据的数组...switch (m_mscom.GetCommEvent()) { case 2: //表示接收缓冲区内有字符 { variant_inp = m_mscom.GetInput(); //读串口输入缓冲区 //将VARAIANT变量赋值给COleSafeArray类的实例 safearray_inp = variant_inp; //使用COleSafeArray类的成员函数获取数据长度 len = safearray_inp.GetOneDimSize(); //使用COleSafeArray类的成员函数将数据写入数组 for (i = 0; i < len; i++) { safearray_inp.GetElement(&i, &rxdata[i]); strTemp.Format("%02X",rxdata[i]); strDis+=strTemp; } }....
该程序中,设置了接收缓冲区大小为2MB,现在有个问题:
rxdata[2048]这个BYTE数组一次最多能接收2048个字(8Bit),也就是1K个字节(16Bit);
假设由于串口接收缓冲区的数据突然增加,串口接收事件一次读到的数据大于2048个字,是不是程序就会异常?是不是也容易造成电脑死机?
是不是可以把rxdata这个BYTE数组设置成2MB的:rxdata[2*1024*1024]; 或是设置成一个100KB大小的rxdata[100*1024]?
[解决办法]比如要每一次读取100KB的数据,那就设置成:
m_mscom.SetInputLen(100*1024*2);
对不?
是不对的。下面两句是用来设置接收和发送缓冲区的
m_mscom.SetInBufferSize(1024*5);
m_mscom.SetOutBufferSize(1024*5);
如果底层上传数据比较大的话,适当调整。同时
BYTE数组 rxdata 设为同样大小
[解决办法]1.缓冲区是由以下二个选项设置的:
m_ComPort.SetInBufferSize(2048); //设置输入缓冲区的大小,Bytes
m_ComPort.SetOutBufferSize(2048); //设置输出缓冲区的大小,Bytes
2.根本不用担心太快会导到缓冲区溢出,因为,你还有一个触发事件,当有多少个数据进就触发一次接收数据的事件。
m_ComPort.SetRThreshold(1); //为1表示有一个字符引发一个事件,引发的事件是:OnCommMscomm(); 你在里面接收数据即可。
m_ComPort.SetInputLen(0); //接收数据
但是如果你的数据非常多而且快速的传送的话,就不要设置为1,例如改大一些10、128、256甚至更大,否则你的接收处理太频繁(因为收到可能还要分析之类的,读取也要时间的)就赶不上速度了。SetInputLen一般用0就可以了。
[解决办法]你的for循环应该判断len不超过rxdata数组的大小,否则可能造成溢出的错误。