关于Mscomm串口的通信延时问题,求教了

时间:2022-07-16 19:56:57
串口既需要监控,又需要写数据,然后我想写数据的时候,必须使串口停掉。我是这样写的
Mscomm.enable=false;
mscomm.enable=true;.
mscomm.output="发送的指令";
发现这样写后,串口很容易延时,有时候反应不过来,我要点好几下才有反应,
该怎么样解决这个串口延时通信的问题呢

9 个解决方案

#1


使用spcomm,偶是使用VC写的DLL

#2


为什么使用SPCOMM,就能解决这个问题呢?
呵呵

#3


“串口很容易延时,有时候反应不过来”与控件无关。可能是你下位机的问题。

#4


我知道与控件无关,觉得是通信方面的延时问题呵呵,比如通信的时候有点不顺畅啊,我现在监控和写数据是通过对MSCOMM.ENABLE的FALSE和TRUE来实现的,总觉得这样的方法很笨啊,,你觉得呢

#5


丁丁,呵呵

#6


对于调试串口通信,我建议你先用串口调试器先把通信调试好了再写自己的通信程序。
串口通信的确是有些延迟,但一般不会很大,也就100ms以内。
其他的我就不好在发表些什么看法了,毕竟我不知道你的项目的具体内容,不能瞎说了。
如果愿意你可以说的更详细写,提供更多的信息。

#7


那你觉得我这样写是没什么问题吗?
我是用于对硬件的寄存器的数据实时监控啊,比如我软件一起动的时候,我就要发送“RD”指令去实时读取,只要不操作,发生了onComm时间,根据指令标识符,如果指令标识符是“RD”的话,我就又再一次发送“RD”指令去读寄存器里面的数据。如果我要进行操作了,我就要写一个“WD”指令相关的命令发给串口,因为串口独占性的原因。我就首先把MSCOMM.enable=false;Mscomm.enable=true;然后再写Mscomm.output=WR相关发送指令。然后我再oncomm事件里面进行判断,如果指令符是“WD”就提示收到命令,有时候“WR”写一次就能提示了,有时候要写好几次才提示收到,就是这么回事啊,这是为什么呢?
这是发送过程:
      OutPutStr:='@00WR00200100';
     OutPutStr:=OutPutStr+CalBcc(OutPutStr)+'*'+Chr(13);
     form1.MsComm.Enabled :=False;
     Form1.MsComm.Enabled :=True;
     Form1.MsComm.Output :=OutPutStr;
     CommandStr:='WR';

这是MSCOMM接收过程
    if CommandStr='WR' then
    begin
    Mscomm.Enabled :=False;
    MsComm.Enabled :=True;
    Mscomm.Output := '@00RD01460006'+CalBcc('@00RD01460006')+'*'+chr(13);
    CommandStr:='RD';
    end;

只要一处理完,“WR“这个操作就立刻再次读寄存器里面的数值

#8


本身的PLC软件上面就是可以实时监控和往里面写数据,不过写数据的我仔细观察了一下,他也是把串口的读数据过程停掉的

#9


"WR"接收指令,忘记写一句:showmessage'收到数据';了,呵呵

#1


使用spcomm,偶是使用VC写的DLL

#2


为什么使用SPCOMM,就能解决这个问题呢?
呵呵

#3


“串口很容易延时,有时候反应不过来”与控件无关。可能是你下位机的问题。

#4


我知道与控件无关,觉得是通信方面的延时问题呵呵,比如通信的时候有点不顺畅啊,我现在监控和写数据是通过对MSCOMM.ENABLE的FALSE和TRUE来实现的,总觉得这样的方法很笨啊,,你觉得呢

#5


丁丁,呵呵

#6


对于调试串口通信,我建议你先用串口调试器先把通信调试好了再写自己的通信程序。
串口通信的确是有些延迟,但一般不会很大,也就100ms以内。
其他的我就不好在发表些什么看法了,毕竟我不知道你的项目的具体内容,不能瞎说了。
如果愿意你可以说的更详细写,提供更多的信息。

#7


那你觉得我这样写是没什么问题吗?
我是用于对硬件的寄存器的数据实时监控啊,比如我软件一起动的时候,我就要发送“RD”指令去实时读取,只要不操作,发生了onComm时间,根据指令标识符,如果指令标识符是“RD”的话,我就又再一次发送“RD”指令去读寄存器里面的数据。如果我要进行操作了,我就要写一个“WD”指令相关的命令发给串口,因为串口独占性的原因。我就首先把MSCOMM.enable=false;Mscomm.enable=true;然后再写Mscomm.output=WR相关发送指令。然后我再oncomm事件里面进行判断,如果指令符是“WD”就提示收到命令,有时候“WR”写一次就能提示了,有时候要写好几次才提示收到,就是这么回事啊,这是为什么呢?
这是发送过程:
      OutPutStr:='@00WR00200100';
     OutPutStr:=OutPutStr+CalBcc(OutPutStr)+'*'+Chr(13);
     form1.MsComm.Enabled :=False;
     Form1.MsComm.Enabled :=True;
     Form1.MsComm.Output :=OutPutStr;
     CommandStr:='WR';

这是MSCOMM接收过程
    if CommandStr='WR' then
    begin
    Mscomm.Enabled :=False;
    MsComm.Enabled :=True;
    Mscomm.Output := '@00RD01460006'+CalBcc('@00RD01460006')+'*'+chr(13);
    CommandStr:='RD';
    end;

只要一处理完,“WR“这个操作就立刻再次读寄存器里面的数值

#8


本身的PLC软件上面就是可以实时监控和往里面写数据,不过写数据的我仔细观察了一下,他也是把串口的读数据过程停掉的

#9


"WR"接收指令,忘记写一句:showmessage'收到数据';了,呵呵