关于SPCOMM通信问题!!

flyfishcn 2007-01-08 01:29:58
我通过串口对一组电表进行读取,我是通过FOR循环来做的,现在有个问题就是要等
循环结束才能执行Comm1ReceiveData事件过程,这样一来就收不到数据。
我想要等一块表接收完成再执行下一块表,请问怎么实现?

for i:=0 to Lvwbjxx.Items.Count -1 do
begin
if Leftstr(trim(Lvwdxst.Items[0].SubItems[i]),1)='1' then
begin
//这是个发送过程
      SetErr(Lvwbjxx.Items[i].SubItems[3],0);
       
end;

end;
...全文
284 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luxuewei5214 2007-01-11
  • 打赏
  • 举报
回复
我感觉最好不要在主线程里使用长时间的循环,可以另开一个线程来用循环;或者在你的循环里加application.processmessages;并在发送完请求后sleep(200);以等待接收数据;
newfang 2007-01-11
  • 打赏
  • 举报
回复
呵呵 ~SPCOMM好像是带原码的,你可以修改它接收事件的触发机制!
或者用API来实现串口读写,简单而且方便,比较好控制!
flyfishcn 2007-01-11
  • 打赏
  • 举报
回复
用application.ProcessMessages;是不行的,我试过了
luxuewei5214 2007-01-11
  • 打赏
  • 举报
回复
把循环放在一个新线程好了,绝对没问题,我就是这么做的
ly_liuyang 2007-01-11
  • 打赏
  • 举报
回复
SPCOMM是基于线程的,为异步控制方式
所以你需要接收缓存区,然后通过控制队列来逐个处理~
必要时,需要多线程来配合
flyfishcn 2007-01-11
  • 打赏
  • 举报
回复
循环的时间不长,但是在循环里加了application.processmessages,延时一样不会触发接收事件,只有等循环结束了才能触发。
newfang 2007-01-09
  • 打赏
  • 举报
回复
STYun(天云)说的正确:

FOR I := 1 TO 100 DO
BEGIN
发送电表[I];
//延时
application.ProcessMessages;
END;

中间最好加上一定的延时,要看串口设备响应的迟滞时间长短!
newfang 2007-01-09
  • 打赏
  • 举报
回复
哦 ~你用的是组件!
偶一直都是用READFILE等API函数自己写的 !
SPCOMM应该也是通过线程循环,一旦读取到数据就触发事件的吧!没用过它!
STYun 2007-01-09
  • 打赏
  • 举报
回复
你的问题是在循环中没有办法让Comm1ReceiveData得到机会出发而已,你需要循环等待中加上
application.ProcessMessages让COM有机会得到消息Comm1ReceiveData就有机会执行了,循环中一般应该还有个GetTickCount来保证等待结果时间.
flyfishcn 2007-01-08
  • 打赏
  • 举报
回复
newfang(传说中的MIC)
你这样不行的,我试过的,Comm1ReceiveData事件是自动触发的,主动执行这个是不行的
newfang 2007-01-08
  • 打赏
  • 举报
回复
注意在循环中加上消息处理语句,以免造成界面停止响应!
newfang 2007-01-08
  • 打赏
  • 举报
回复
你是不是先发送然后再读取?可以这样:
FOR I := 1 TO 100 DO
BEGIN
发送电表[I];
S := 读取电表[I];
WHILE S > '' DO
BEGIN
S := S + 读取电表[I];
END;
END;

意思就是直到读取完了再操作下一个电表!

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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