首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

关于MSComm控件中接收缓冲区数据的BYTE数组的1点疑惑

2012-08-08 
关于MSComm控件中接收缓冲区数据的BYTE数组的一点疑惑使用MSComm控件创建一个MFC的基于对话框的串口监控小

关于MSComm控件中接收缓冲区数据的BYTE数组的一点疑惑
使用MSComm控件创建一个MFC的基于对话框的串口监控小程序,在做测试时遇到一点疑惑:


在MSComm控件的OnCommMscomm()事件中,有这么一个BYTE数组用来接收接收缓冲区的数据:

C/C++ code
BYTE 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数组的大小,否则可能造成溢出的错误。

热点排行