MScomm的输入缓冲区怎么设置?

huhongfeng   2009-4-17 16:39 楼主
  正在编写使用VC++6.0的MSComm控件做通讯的东西,
  我发现设置大小不同,接收到的数据大小也不同。举例说:
   
  自发自收情况下, 发送一帧数据最大有42个char,设置输入缓冲区的大小为1024Bytes,输出缓冲区的大小为512Bytes时。一次可以发送完,但是接收要用2~3次串口接收中断处理才能接受完一帧数据!
  修改了输入缓冲区和输出缓冲区的大小,问题依旧。网上有人说:MScomm的输入缓冲区,一般来说根据波特率和处理数据的速度才设定这个缓冲区大小。
  
  但为啥我一次发送42个char的数据,这样一个小数据,就会造成缓冲区溢出的问题?
  
  请各位高手帮忙。

回复评论 (15)

CSDM以前的旧帖子:

MScomm的输入缓冲区怎么设置?
http://topic.eeworld.net/t/20020612/14/797695.html
点赞  2009-4-17 16:41
打开控件属性,里边有很多项,
还有就是可以用程序的SetInBufferSize()
点赞  2009-4-17 16:47
CMSCOMM::SetInBufferSize(); //接收缓冲区
点赞  2009-4-17 16:49
你这个问题,并不是缓冲区大小造成的.
而是接受中断事件那个接收数据上限造成的吧
点赞  2009-4-17 16:51
但是接收要用2~3次串口接收中断处理才能接受完一帧数据!
//这个和接收缓冲区的大小没有关系,只是说明一帧数据触发了多次中断。将字节间超时设置的大一点可以解决这个问题。
//或者将触发中断的输入缓冲区到达字符数设置的大些。
//至于我说的输入缓冲区没有溢出,你可以尝试在多次中断后,再去收取数据,你就可以发现数据都在那里。
点赞  2009-4-17 16:54
引用: 引用 5 楼 lfchen 的回复:
但是接收要用2~3次串口接收中断处理才能接受完一帧数据!
//这个和接收缓冲区的大小没有关系,只是说明一帧数据触发了多次中断。将字节间超时设置的大一点可以解决这个问题。
//或者将触发中断的输入缓冲区到达字符数设置的大些。
//至于我说的输入缓冲区没有溢出,你可以尝试在多次中断后,再去收取数据,你就可以发现数据都在那里。


那如何设置这个“字节间超时设置”?
点赞  2009-4-17 17:08
查了下,MSCOMM没有这个功能
在windwos + VC的环境下,我都是用API,对MSCOMM不熟悉。
m_MSComm.SetRThreshold(length);//这个设置的大一些?表示length字符在接收缓冲区后触发中断
点赞  2009-4-17 17:18
1.你发送的少,不等于接收也少。
2.接收数据分几次收完一帧其实没有什么问题,关键是你接收代码要写对。
3.如果祯是带结构的,比如有特殊结束符号才将触发接收事件。
点赞  2009-4-17 17:25
引用: 引用 7 楼 lfchen 的回复:
m_MSComm.SetRThreshold(length);//这个设置的大一些?表示length字符在接收缓冲区后触发中断


SetRThreshold(length)这个函数设置大些,我觉得不太好,因为我发送和接收的数据不定长,所以还是让MSComm每接受一个既中断。
  
   看了ASCII码表,有stx(正文开始)和etx(正文结束)这两个码,这两个应该也可以作为数据传输开始和完毕的标识。

   在MSComm中,有EOFEnable属性(确定在输入过程中 MSComm 控件是否寻找文件结尾 (EOF) 字符。如果找到 EOF 字符,将停止输入并激活 OnComm 事件,此时 CommEvent 属性设置为 comEvEOF),但是不知道ASCII码表中,那个是“文件结尾 (EOF) 字符”?

   
点赞  2009-4-17 17:32
ASCII码表中,那个是“文件结尾 (EOF) 字符”?

看了些资料,这个文件结尾(EOF)字符应该是ASCII 26。

但是这个26是指十进制26D对应的sub,还是十六进制26H对应的&?
点赞  2009-4-17 17:47
考,汗,学习
点赞  2009-4-17 17:52
引用: 引用 6 楼 iwillbeback008 的回复:
引用 5 楼 lfchen 的回复:
但是接收要用2~3次串口接收中断处理才能接受完一帧数据!
//这个和接收缓冲区的大小没有关系,只是说明一帧数据触发了多次中断。将字节间超时设置的大一点可以解决这个问题。
//或者将触发中断的输入缓冲区到达字符数设置的大些。
//至于我说的输入缓冲区没有溢出,你可以尝试在多次中断后,再去收取数据,你就可以发现数据都在那里。


那如何设置这个“字节间超时设置”?


//设置串口读写时间
        COMMTIMEOUTS CommTimeOuts;
        GetCommTimeouts (m_hComm, &CommTimeOuts);
        CommTimeOuts.ReadIntervalTimeout =10;//250;//MAXDWORD;  
        CommTimeOuts.ReadTotalTimeoutMultiplier =0;//MAXDWORD;  
        CommTimeOuts.ReadTotalTimeoutConstant = 0;//MAXDWORD;   
        CommTimeOuts.WriteTotalTimeoutMultiplier =0;//10;  //100
        CommTimeOuts.WriteTotalTimeoutConstant = 0;//1000;//500;  

具体设置的值为多大,根据波特率调整.
点赞  2009-4-17 17:58
接上面
if(!SetCommTimeouts( m_hComm, &CommTimeOuts ))
{
//        TRACE( _T("SetCommTimeouts 返回错误") );
        printf("SetCommTimeouts error!\r\n");
        return FALSE;
}
点赞  2009-4-17 17:59
引用: 引用 10 楼 iwillbeback008 的回复:
ASCII码表中,那个是“文件结尾 (EOF) 字符”?

看了些资料,这个文件结尾(EOF)字符应该是ASCII 26。

但是这个26是指十进制26D对应的sub,还是十六进制26H对应的&?


经过实验,文件结尾(EOF)是ASCII 26(指十进制26D对应的sub),但是由于项目所使用的通信协议中不用到这个文件结尾符,只好作罢。

问题回到求解:如何将字节间超时设置以修改接收中断事件那个接收数据上限?
点赞  2009-4-18 10:47
问题解决了,谢谢大家的帮助!
点赞  2009-4-21 09:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复