关于mscomm编写串口字节接收的问题,请帮忙 点击:1682 | 回复:7



jiangbin1937

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:24帖 | 60回
  • 年度积分:0
  • 历史总积分:130
  • 注册:2007年6月04日
发表于:2007-09-08 08:59:00
楼主
    有几个关于用mscomm进行串口编程的问题,请大虾们帮忙:
上位机与下位机设备以9600baud的速率通信,上位机是用来接收数据的,现在问题就是在主机的数据接收编程中遇到的。mscomm里面有个接收缓冲区的门限属性设置,我设置为1,那么只要接收缓冲区一收到字符(因为我需要对每个数据包的第1个字节进行判断处理),就会产生一个oncomm事件,我就在这个事件里编写数据接收程序,我的接收程序无非就是判断首字节是否是H,第2字节是下位机的设备地址,并存储下接下来的多个数据字节(因为命令不同,下位机向上位机传的数据部分的字节数也是不定的),现在问题是,我有两种处理方法,

一种是在oncomm事件处理中一开始先延迟一段时间,以便在这段时间内整个数据包都接收完毕,然后再对inbuffer里的字节作相应的处理,这样就是在一个事件中就处理完毕了,,可这时的问题就是需要延迟多少时间,才能保证数据都接收完,如果这个时间长的话,就不是很合适了。还有就是oncomm事件会不会每收到一个字符就产生一次?如果产生的话会不会对我当前的事件(第一个事件)处理有影响,如果在当前事件处理过程中没有影响,会不会在事后影响,也就是说这一系列的oncomm事件都排在事件队列中,当前事件处理完毕后,这些事件还是相继产生,要求程序去处理它们。

另一种是oncomm事件处理中不延迟,这样的意图是想,一个个字节处理,也就是收到一个字节产生一个oncomm事件,事件中对这个字节进行相应处理。接着又收到一个字节,又产生一个oncomm事件,再对这个字节处理,,以此类推。这样的话 就有个问题,就是会不会在我对当前字节还没处理完(也就是oncomm事件过程还没结束),下一个字节就收到了,从而产生新的oncomm事件,这样影响到我的正常处理过程。





wjun7610

  • 精华:0帖
  • 求助:0帖
  • 帖子:14帖 | 199回
  • 年度积分:0
  • 历史总积分:436
  • 注册:2004年2月01日
发表于:2007-09-08 22:33:00
1楼
  你完全可以不用mscomm,可以用串口DLL,这些有DLL自行处理,你只用调用函数就能实现。如希望用mscomm进行串口编程可以用延时查询的方式一旦收到字节满足你的查询要求就去做相应处理,不要用oncomm事件它不好控制。
  我这有多种PLC的串口通信DLL。
QQ:157610979
wjun7610@yahoo.com.cn

werew

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 21回
  • 年度积分:0
  • 历史总积分:26
  • 注册:2003年3月04日
发表于:2007-09-22 13:51:00
2楼
你的下位机是什么?下位机是不停的在发数据吗?一般是上位机确定收到下位机一侦数据后,下位机再发,依此循环.你的实现功能是什么?


有需求可联系我:QQ415690728  

老星土

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 85回
  • 年度积分:0
  • 历史总积分:110
  • 注册:2006年5月04日
发表于:2007-09-30 12:54:00
3楼
不会的,我一般都是一个一个字节处理,这样比较好
http://www.chinadacs.cn

zaxife

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 80回
  • 年度积分:0
  • 历史总积分:270
  • 注册:2005年5月25日
发表于:2007-10-02 19:04:00
4楼
可以设定接受缓冲区长度来相应中断啊
MSComm1.InputLen="接受多少个字就产生中断"

FanRan630

  • 精华:0帖
  • 求助:1帖
  • 帖子:9帖 | 72回
  • 年度积分:0
  • 历史总积分:66
  • 注册:2003年6月18日
发表于:2007-11-07 12:28:00
5楼
如果用oncomm事件的话,您可以设置在inputbuffer内有多少个字节的数据后启动oncomm事件。
一般可以不用oncomm事件,如zaxife所说,先判断MSComm1.InputLen>=2,读取“H”和站号(只读取两个字节的内容),然后根据站号判断需要多少个字节的判断条件n,当MSComm1.InputLen>=n后,读取n个数据去分析就可以了。

chunyejun

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 21回
  • 年度积分:0
  • 历史总积分:58
  • 注册:2006年7月28日
发表于:2008-09-09 14:31:10
6楼

可以用循环判断数据是否为结束符或自定议的结束符。

一般来说我都是这样判断的,比一个个字节接收数据准确性要高一些。

gzgylgl

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 221回
  • 年度积分:0
  • 历史总积分:556
  • 注册:2001年8月30日
发表于:2008-09-12 08:48:23
7楼

我认为用API,开个线程来处理就好了


热门招聘
相关主题

官方公众号

智造工程师