这几天运气好背啊,串口程序有问题,交不了差了

Persistent8813 2006-05-23 10:49:50
我用VICTOR控件第一次做了个串口程序,本来觉得很简单,但到了快交付的时候了,却发现有N多问题,闷啊~~
程序是这样的~~

在COM1连接一个232 - 485转换接口,连接10台温控AI仪表。用一个Timer控件每隔3秒钟循环读取0-9号这十个表的数据。
在循环读取的时候,首先要向仪表发送读取命令,然后读取接收到的数据。这地方的时间间隔延时怎么也处理不好。一个表处理起来很正常,但十个表循环就总有中断取不到数据的时候。还请这方面的专家给个说法,先谢了~
...全文
281 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Persistent8813 2006-05-24
  • 打赏
  • 举报
回复
我试了,不行,如果在发送读指令和接收之前没有Sleep(250~200)就始终接收不到数据
Persistent8813 2006-05-24
  • 打赏
  • 举报
回复
我理解你的意思是:只在发送下一个读指令前加延迟?其它位置无须延迟?是这样吗?我试试管用不~~
tianshu888 2006-05-24
  • 打赏
  • 举报
回复
1、第一条 读com设备的命令
2、不加延迟马上取读到的数据//去掉你的Sleep(250)
3、加延迟Sleep(几百个毫秒)
4、发第二条 读com设备的命令
.........................

这回明白了?
第2步不加延迟 是因为你的com设备可能把数据立刻就返回,没有缓存机制 加延迟可能读不到数据了。
第3条加几百个毫秒是因为 一般给串口连续发命令不能过快,一般要几百个毫秒的间隔,否则回通讯错误。
Persistent8813 2006-05-24
  • 打赏
  • 举报
回复
tianshu888(CC) :
不明白你的意思,“读完数据后间隔几白个毫秒在发第二个命令。”不还是要Sleep()?
netsys2 2006-05-23
  • 打赏
  • 举报
回复
发起可以用Timer,但发出命令后必须一直等待接收到数据,而不是通过TIMER来收数据。
daydayup234 2006-05-23
  • 打赏
  • 举报
回复
这种监控好象用Timer不准确,代码执行速度有时都要考虑。
在“硬件/嵌入”哪儿问问可能有用
tianshu888 2006-05-23
  • 打赏
  • 举报
回复
Sleep(250)这条语句去掉直接读取数据,应可以。我遇到过同样的问题。这样的问题根com设备硬件程序有关(比如单片机的程序)。读完数据后间隔几白个毫秒在发第二个命令。
Persistent8813 2006-05-23
  • 打赏
  • 举报
回复
Sleep(250)会丢数据吗?我用一个表是没有问题的啊,另外我不太懂接收到的数据在缓冲区中没有新命令前应该不会自动丢掉吧?
Persistent8813 2006-05-23
  • 打赏
  • 举报
回复
我看书上讲一般的串口通信有轮询(Polling)方式和线程方式,我用的应该是轮询方式吧,不知道这种思路是不是有问题。那么线程方式又是什么样的流程呢?
netsys2 2006-05-23
  • 打赏
  • 举报
回复
我现在是发送命令后作Sleep(250),然后读取数据的~

---->如果对方反应快,你就丢数据了!你应该用个线程一直收。
Persistent8813 2006-05-23
  • 打赏
  • 举报
回复
各表都自带电源的,用同一个插排没问题吧?
我想应该是数据缓冲区在循环的过程中造成了堆积,还是等待时间不正确所致
flowercity 2006-05-23
  • 打赏
  • 举报
回复
232->485转换模块和温控模块不要使用同一个电源
分开供电
Persistent8813 2006-05-23
  • 打赏
  • 举报
回复
但发出命令后必须一直等待接收到数据,

我就是不知道应该在哪儿等待啊,我现在是发送命令后作Sleep(250),然后读取数据的~

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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