2012-07-12 21 views
4

我试图发送我的rs232设备多个SerialPort.Write命令对彼此。但是,我不认为它可以一次处理多个WRITE命令。如何等待正确的时刻写入?

目前,我只是使用Thread.Sleep(500)来延迟写入,但有没有办法来检测何时发送完美的时间?或与缓冲区?

示例代码

接口

private void btn_infuse_Click(object sender, RoutedEventArgs e) { 
     cmd.SetTargetInfusionVolume(spmanager, double.Parse(tbox_targetvolume.Text)); 
     cmd.StartInfuse(spmanager);//cmd object of Command class 
} 

命令类

public void StartInfuse(SPManager spm){ 
     spm.Write("RUN");//spm object of serialportmanager class 
    } 
    public void SetTargetInfusionVolume(SerialPortManager spm, double num) { 
     spm.Write("MLT " + num.ToString()); 
    } 

SerialPortManager类

 public void Write(string sData) { 
     if (oSerialPort.IsOpen) {//oSerialPort object of SerialPort class 
      try { 
       oSerialPort.Write(sData + "\r"); 
      } 
      catch { MessageBox.Show("error"); } 
     } 
    } 
+2

一定要将SerialPort.Handshake属性与设备用于流量控制的内容相匹配。 – 2012-07-12 19:23:27

回答

1

如果你的串口设置(特别是,汉斯·帕sssant提到,流量控制)是正确的,那么速度问题很可能是您的设备无法快速处理消息,如果发送速度太快,或者它预期消息之间的“无声”间隙为了划定它们。

在这种情况下,Sleep()引入传输延迟是非常合理的方法。您需要找到一个合理的延迟,以确保设备能够成功处理您的消息,理想情况下不会拖延您的应用程序太久。

这通常涉及反复试验,但请查阅设备的文档,因为相当多的设备在传输中使用间隙来指示消息包的结束(例如,他们可能经常希望你对某个设备保持沉默短消息后的时间,例如,如果他们在2400bps链路上指定了10比特的“静默时间”,则这将对应于10/2400th或仅超过4毫秒)。尽管如此,这些都可能会被W​​indows损害一点,因为它往往会缓冲数据(也就是说它会挂在它上面几毫秒,看看你是否会要求它发送更多) - 因此,您可能需要一个明显比应该严格要求的延迟时间要长 - 可能需要15-20毫秒。当然,我可能会咆哮错误的树,你可能会发现你需要500毫秒的时间才能使它工作。