232串口数据接收丢失问题

lemonzx2008 2008-06-18 05:03:00
用一台泵连到计算机上,通过计算机不停接收泵的数据
我是用VB.NET2003利用串口类来写的上位机接收程序,出现以下问题
1、接收数据时老是少接收一个,但是发现缓冲区中还有一个
2、发生最多的情况是第一次接收少收一个,而以后则接收数据正常
3、偶尔第一次及以后均接收正常
上面是在不利用断点的情况下,若加上断点来调试,则每次接收的数据都少一个,即校验和收不到。

想破了脑袋,还是没解决这个问题,希望社区的兄弟姐妹不吝指点下。
...全文
1140 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lemonzx2008 2008-07-02
  • 打赏
  • 举报
回复
自己顶下
只在此山中 2008-06-27
  • 打赏
  • 举报
回复
应该不是BUG,
估计是什么参数没设置或设置错误.你是用事件触发吗?是接收1个字节就触发1次吗?
lemonzx2008 2008-06-27
  • 打赏
  • 举报
回复
是的 是用事件触发,接收一个字节触发一次

zdingyun 2008-06-26
  • 打赏
  • 举报
回复
一台电脑可通过插PCI串口扩展卡,可增加串口,费用60-70元。
lemonzx2008 2008-06-26
  • 打赏
  • 举报
回复
多谢大家,现在装了VB.NET2005,想用SERIALPORT类做,由于要向下位机发送地址,所以校验位用的是MARK,结果发现校验位为MARK时进不了接收中断且再用串口调试助手收到的数据比原来多了15个字节.前面在VB.NET2003中校验位为MARK也没发现有这个问题,难不成是2005的BUG?有人能回答下吗?郁闷深思中^……
lemonzx2008 2008-06-23
  • 打赏
  • 举报
回复
聪明^^^^
yanlongwuhui 2008-06-23
  • 打赏
  • 举报
回复
2个电脑不就有2个串口了嘛......
lemonzx2008 2008-06-23
  • 打赏
  • 举报
回复
电脑只有一个串口……
yanlongwuhui 2008-06-22
  • 打赏
  • 举报
回复
串口连接线应该知道怎么用的吧,就是把COM1跟COM2连接起来(线要做对,不清楚的话可以查下资料),用串口调试工具通过COM1往COM2发数据,上位机软件在COM2口接收数据
yanlongwuhui 2008-06-22
  • 打赏
  • 举报
回复
是不是上位机软件问题,通过两个途径可以进行排查:
1.做个串口连接线,用串口调试工具给自己发指令,自己接收处理,看能否正常处理:
2.改成单字节接收,看是否接收正确;
如果两者排查确认上位机都能正常处理,基本能确保问题在下位机
lemonzx2008 2008-06-22
  • 打赏
  • 举报
回复
谢谢炎龙无悔,明天去公司了试下,好象我电脑只有一个串口……
lemonzx2008 2008-06-21
  • 打赏
  • 举报
回复
恩,去看了下,收获不小,不过有些还是不太明白,最想要一个应用的实例.

实在不行的话就只能改成每接收一个就读一个了,不过上位机牵涉到浮点数转换问题,有点麻烦.
yanlongwuhui 2008-06-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lemonzx2008 的回复:]
不过我不明白的是为什么串口调试工具可以收到正确的?应该原理一样的啊。
[/Quote]
因为串口调试工具是接收到什么就读取什么,显示什么。如果你的测试不考虑指令,改成每接收到1个字符就读取一次,并显示一次,保证你的结果跟串口调试工具一样。本来也以为是上位机程序问题,后来下位机的程序员主动通过调试找到问题了,算合作得比较愉快吧。
lemonzx2008 2008-06-20
  • 打赏
  • 举报
回复
谢谢各位 今天试了延时,加了延时后一个也收不到了,而串口调试工具依然是接收正确。

难道真的是我的程序有问题,或者要装上VS.NET 2005?

可能自己对串口还是不是很了解,不知道对串口类来说怎样才能控制一次只读一个字节。

我遇到的也是,下位机的现在还一直说是上位机软件的问题,不愿意修改,一直认为是接收的问题,因为用串口调试工具接收正确。问他发送的速度,他不知道,要我算,我也不知道该怎么算。

不过我不明白的是为什么串口调试工具可以收到正确的?应该原理一样的啊。
yanlongwuhui 2008-06-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lemonzx2008 的回复:]
还有,用串口调试工具接收的数据是正确的.这样是不是可以说下位机是没有问题的呢?
[/Quote]
我遇到的也是这问题,开始做下位机的一直说是上位机软件的问题,后来进过多次调试,修改了下位机代码。下位机修改的好象不是延时,好象修改了发送速度,没记错的话,好象是加快了。至于为什么会这样,就不很清楚了。
网上的资料,不知道有没有对下位机分析问题有用:
为什么在RS-485/RS-422构成的通信网络中,传输数据包时经常出现多出一个数据或少一个数据的现象?
一般在点-多点通信系统中会经常出现这个问题, 归纳出现的原因大致如下:
1) 在半双工通信中,一般可以通过禁止RS-485收发器接收使能或UART内部的接收使能,以保证不出现自发自收,进而减少CPU的开销。当数据发送完成后,RS-485接收器和内部UART将回到允许接收状态而发送器将关闭,在此状态切换过程中,可能出现RS-485接收器输出低电平跳变,而此时UART已经允许接收,从而导致多接收一个字节。
正确处理方法应该为:从接收状态向发送状态转换时,先禁止内部UART的接收使能,再打开接口的发送器使能,然后,允许内部UART的发送使能,开始发送数据;从发送状态向接收状态转换时,先禁止内部UART的发送使能,再关闭接口的发送使能(如果接口的接收使能被禁止,则紧跟着打开接口的接收使能),在延时2至4个NOP指令后,才打开内部UART的接收使能。
2)对于大多数UART来说,内部发送缓冲器"空"会产生中断或置对应的标志位,但此时数据不一定真的发送完成,因为数据有可能还在输出移位寄存器中。如果仅靠发送缓冲的状态来判断一包数据是否发送完成,从而决定是否关闭内部UART的发送使能和接口的发送使能,则这个数据包的最后一个字节将不会发送到总线上,以致对方会少接收一个字节。此类问题会出现在MAX3100、MAX3140和PIC系列单片机等类似情况的UART中,请用户应用中注意此类问题。
cauhorse 2008-06-20
  • 打赏
  • 举报
回复
。。。真抱歉,以前做的代码,课题一结就找不到了(-_-|||),不过当时我就照着MSDN上的一个文档改的:
http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.aspx
SerialPort Class
有一点例程。
把那个基本整明白了,应该就没有问题了。
lemonzx2008 2008-06-20
  • 打赏
  • 举报
回复
新装了2005,庭树东南枝能给我一个应用实例吗?
AManStudio 2008-06-19
  • 打赏
  • 举报
回复
有一种笨的方法就是不用控件触发的事件,而是用一个Timer循环读取串口数据!
lemonzx2008 2008-06-19
  • 打赏
  • 举报
回复
还有,用串口调试工具接收的数据是正确的.这样是不是可以说下位机是没有问题的呢?
lemonzx2008 2008-06-19
  • 打赏
  • 举报
回复
下位机程序是要发送的字节间加延时吗?
加载更多回复(7)

16,718

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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