有关SPCOMM串口通信的等待问题??(45分)

  • 主题发起人 主题发起人 nzfboy
  • 开始时间 开始时间
N

nzfboy

Unregistered / Unconfirmed
GUEST, unregistred user!
我要如何等待端口(用SPCOMM)给我返回消息,再发送下一次数据?
我要进行队列消息发送,其中要等前一条消息发送完并从端口接受到一个成功信息后再继续发送下一条?
我现在的作法是:发送一条,再sleep(6000), 再发送下一条,在SPCOMM的接受过程中把标志变量赋值,
但在发送过程经过sleep(6000)后依然无法监测到标志变更的改变。

我想我的问题可能就是 SPCOMM进行串口通信时的等候如何解决?
 
应该是从接收端给你返回一个消息,然后再发送下一条
当接收端接收完指定的数据后给你发一个消息表示将一条数据接收完成。
 
我已经在接受端改变这个接受完毕的消息,可是我的发送端在sleep(6000)后依然无法获取到改变的消息。
我想是不是要用线程解决这个问题?
如果接受端启动了。我的发送端是不并没有等到接受端完毕就对外发送了?如是这样,如何解决?
 
如果是在主线程中进行的,你sleep(6000)时,你的主线程就sleep了,
根本不会响应任何信息,
对方的信息已经丢失了
 
对,和我想法差不多。我该怎么办?是不是要新开一个线程,专门监视串口流的进入?
另外,是不是涉及到线程的同步问题?
请具体示例??!!!
 
我该如何在一线程中监视端口进入数据,又如何在另一线程中发送数据,又如何协调两个线程的关系?
 
spcomm从数据接收完成到触发他的接收事件,
中间大概有200ms的时间间隔,如果数据量比较大的话
或者时实性要求高的话,就不好做了
要解决的话可能要改一下这个控件的代码吧(反正是公开的)

如果你的数据量不大,时实性不高的话,可以发一条后,
等待对方收到后发一确认给你,这样的通讯是比较可靠的,
基本上不会丢数据

如果对方是用单片机之类的,用中断处理的话,
你就可以一直发下去好了
 
>>如果你的数据量不大,时实性不高的话,可以发一条后,
>>等待对方收到后发一确认给你,这样的通讯是比较可靠的,

我的程序与单片机就是这样的通讯。但我无法等到单片机发给我的确认消息,
我的发送程序就着急发出下一条了。我的难点就是在这里了。
 
DCSDCS:在你的程序中,那里有#06或#05呀?
我的程序是如此做的:
全局变更SRS用来标识发送是否成功

procedure SendData(.....);发送子程序,肯定没有问题。
begin
end
procedure Spcomm Recedive()//spcomm的接收程序
begin
//发送完成后给全局变更SRS赋值:11
SRS:=11;
end;
procedure form1.button1click()
begin
SRS=10;
senddata(...);//第一次发送
if SRS=11 then
SendData(....);第二次发送
end;
我的程序在做完第一次发送后,按想像,SRS应该被接受程序改为11,
可实际并不是如此,而是SRS依然是10。
如何解决?
 
新建一个线程,正好你的问题与我的现在做的一样,我是通过新建一个线程实现了。各个
线程之间的同步我用的是阻塞方式,当SPCOMM收到数据时,置全局变量标志。线程中设一
定时间SLEEP,当超过这个时间视为超时,当在这个时间中收到全局变量标志改变时即收到
数据,可以发送你的下一条数据了。当然如果你要在发送之前检查你收到的数据是不是正确,
这个根据你自己的要求具体更改。
  但是,为了测试方便,我设的超时时间比较长,为一秒,更短的时间我没有测试过。
>spcomm从数据接收完成到触发他的接收事件,
>中间大概有200ms的时间间隔,如果数据量比较大的话
>或者时实性要求高的话,就不好做了
>要解决的话可能要改一下这个控件的代码吧(反正是公开的)
可能是这样的吧,我也在做,我们共同交流。
 
procedure form1.button1click()
begin
SRS=10;
senddata(...);//第一次发送
if SRS=11 then
SendData(....);第二次发送
end;
我的程序在做完第一次发送后,按想像,SRS应该被接受程序改为11,
可实际并不是如此,而是SRS依然是10。
如何解决?

你是在主线程中发送的,程序执行完第一次发送,马上判断SRS是不是11,这时SPCOMM还没
有来得及置全局变量标志,程序已经判断完,继续往下执行了。
应该另建一个线程监视它,各线程之间是同步的。
 
南宫吹云:我们到QQ上聊一下如何?我的QQ:5269564
新建一个线程?是不是两个线程都要对串口初始化?如何操作?可以给我简单代码吗?
 
好啊,不过这几天我的时间不多,马上要参加自考了,我得复习。

新建一个线程很多书上有介绍,只要主线程对串口接收数据即可,新建线程只对串口发送
数据。我是这样做的。
 
欢迎大小虾来讨论。继续。
 
>procedure SendData(.....);发送子程序,肯定没有问题。
>begin
>end
>procedure Spcomm Recedive()//spcomm的接收程序
>begin
> //发送完成后给全局变更SRS赋值:11
> SRS:=11;
>end;
>procedure form1.button1click()
>begin
>SRS=10;
>senddata(...);//第一次发送
>if SRS=11 then
> SendData(....);第二次发送
>end;


procedure form1.button1click()
begin
SRS=10;
senddata(...);//第一次发送
if SRS=11 then
SendData(....);第二次发送
end;
改为
procedure form1.button1click()
begin
SRS=10;
senddata(...);//第一次发送
while(SRS=10) do application.processmessage;//使劲等直到SRS=11,当然,SRS是通过
procedure Spcomm Recedive()//spcomm的接收程序
begin
//发送完成后给全局变更SRS赋值:11
SRS:=11;
end;
触发改变的(客户端发送数据触发主发送端的ONRECEIVE事件)。
//接着第二次发送
SendData(....);第二次发送
end;
 
各位兄弟对我真是够关心的了。不管如何,先行谢过了。
 
请大家继续出招吧
 
.....................................
 
..............
 
后退
顶部