7991|15

76

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MScomm的输入缓冲区怎么设置? [复制链接]

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

最新回复

问题解决了,谢谢大家的帮助!  详情 回复 发表于 2009-4-21 09:32
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
CSDM以前的旧帖子:

MScomm的输入缓冲区怎么设置?
http://topic.eeworld.net/t/20020612/14/797695.html
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
打开控件属性,里边有很多项,
还有就是可以用程序的SetInBufferSize()
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
CMSCOMM::SetInBufferSize(); //接收缓冲区
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(初级)

5
 
你这个问题,并不是缓冲区大小造成的.
而是接受中断事件那个接收数据上限造成的吧
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
但是接收要用2~3次串口接收中断处理才能接受完一帧数据!
//这个和接收缓冲区的大小没有关系,只是说明一帧数据触发了多次中断。将字节间超时设置的大一点可以解决这个问题。
//或者将触发中断的输入缓冲区到达字符数设置的大些。
//至于我说的输入缓冲区没有溢出,你可以尝试在多次中断后,再去收取数据,你就可以发现数据都在那里。
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 lfchen 的回复:
但是接收要用2~3次串口接收中断处理才能接受完一帧数据!
//这个和接收缓冲区的大小没有关系,只是说明一帧数据触发了多次中断。将字节间超时设置的大一点可以解决这个问题。
//或者将触发中断的输入缓冲区到达字符数设置的大些。
//至于我说的输入缓冲区没有溢出,你可以尝试在多次中断后,再去收取数据,你就可以发现数据都在那里。


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

回复

62

帖子

0

TA的资源

一粒金砂(初级)

8
 
查了下,MSCOMM没有这个功能
在windwos + VC的环境下,我都是用API,对MSCOMM不熟悉。
m_MSComm.SetRThreshold(length);//这个设置的大一些?表示length字符在接收缓冲区后触发中断
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

9
 
1.你发送的少,不等于接收也少。
2.接收数据分几次收完一帧其实没有什么问题,关键是你接收代码要写对。
3.如果祯是带结构的,比如有特殊结束符号才将触发接收事件。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

10
 
引用 7 楼 lfchen 的回复:
m_MSComm.SetRThreshold(length);//这个设置的大一些?表示length字符在接收缓冲区后触发中断


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

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

   
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

11
 
ASCII码表中,那个是“文件结尾 (EOF) 字符”?

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

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

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
考,汗,学习
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 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;  

具体设置的值为多大,根据波特率调整.
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

14
 
接上面
if(!SetCommTimeouts( m_hComm, &CommTimeOuts ))
{
//        TRACE( _T("SetCommTimeouts 返回错误") );
        printf("SetCommTimeouts error!\r\n");
        return FALSE;
}
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

15
 
引用 10 楼 iwillbeback008 的回复:
ASCII码表中,那个是“文件结尾 (EOF) 字符”?

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

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


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

问题回到求解:如何将字节间超时设置以修改接收中断事件那个接收数据上限?
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

16
 
问题解决了,谢谢大家的帮助!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表