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

iwillbeback008 2009-05-09 11:24:09
使用MSComm控件创建一个MFC的基于对话框的串口监控小程序,在做测试时遇到一点疑惑:


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

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]?
...全文
391 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmm_study 2012-07-10
  • 打赏
  • 举报
回复
m_ComPort.SetInputLen(0); //接收数据

但是如果你的数据非常多而且快速的传送的话,就不要设置为1,例如改大一些10、128、256甚至更大,否则你的接收处理太频繁(因为收到可能还要分析之类的,读取也要时间的)就赶不上速度了。SetInputLen一般用0就可以了。
如果该为10或128 或256的话,数据有丢失吗?
hzcenter 2009-05-09
  • 打赏
  • 举报
回复
可以设置读取缓冲区数据长度的
wutaihua 2009-05-09
  • 打赏
  • 举报
回复
mark
iwillbeback008 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lfchen 的回复:]
rxdata[2048]这个BYTE数组一次最多能接收2048个字(8Bit),也就是1K个字节(16Bit);
//BYTE(8bits)是字节,WORD(16bits)是字吧?
[/Quote]

是阿:
1字=2字节(1 word = 2 byte)
1字节=8位(1 byte = bit)
iwillbeback008 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Mackz 的回复:]
你的for循环应该判断len不超过rxdata数组的大小,否则可能造成溢出的错误。
[/Quote]

恩,同意,已经添加了判断
一条晚起的虫 2009-05-09
  • 打赏
  • 举报
回复
rxdata[2048]这个BYTE数组一次最多能接收2048个字(8Bit),也就是1K个字节(16Bit);
//BYTE(8bits)是字节,WORD(16bits)是字吧?
菜牛 2009-05-09
  • 打赏
  • 举报
回复
你的for循环应该判断len不超过rxdata数组的大小,否则可能造成溢出的错误。
TianChong 2009-05-09
  • 打赏
  • 举报
回复
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就可以了。
dengxuxing 2009-05-09
  • 打赏
  • 举报
回复
比如要每一次读取100KB的数据,那就设置成:
m_mscom.SetInputLen(100*1024*2);

对不?

是不对的。下面两句是用来设置接收和发送缓冲区的
m_mscom.SetInBufferSize(1024*5);
m_mscom.SetOutBufferSize(1024*5);

如果底层上传数据比较大的话,适当调整。同时
BYTE数组 rxdata 设为同样大小
iwillbeback008 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hzcenter 的回复:]
可以设置读取缓冲区数据长度的
[/Quote]

哦,这样阿?

我在OnOpenCom()函数中原先设置:
m_mscom.SetInputLen(0); //将使MSComm控件读取接收缓冲区中全部的内容

那就可以按照字(8Bit)的数量来设置MSComm控件每一次接收事件时读取的数据量咯?

比如要每一次读取100KB的数据,那就设置成:
m_mscom.SetInputLen(100*1024*2);

对不?

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧