如何等待正确的时刻写?

时间:2012-07-12 18:56:03

标签: c# serial-port serial-communication

我正在尝试向我的rs232设备发送多个SerialPort.Write命令。但是,我认为它不能同时处理多个WRITE命令。

目前,我只是使用Thread.Sleep(500)在WRITE之间延迟,但有没有办法检测何时发送的最佳时间是?或者使用缓冲区?

示例代码

接口

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"); }
        }
    } 

1 个答案:

答案 0 :(得分:1)

如果您的串口设置(特别是Hans Passsant提到的流量控制)是正确的,那么速度问题很可能就是您的设备无法快速处理邮件,以便在您发送邮件时也能跟上快速,或者它期望消息之间存在“无声”差距以便描绘它们。

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

这常常涉及反复试验,但请查阅设备的文档,因为很多设备在传输中使用间隙来指示消息包的结束(例如,通常他们可能希望您保持沉默在消息之后的时间,例如,如果他们在2400bps链路上指定了10比特的“静默时间”,则这将对应于10/400ths或仅超过4毫秒)。但是,这可能会受到Windows的影响,因为它往往会缓冲数据(即它会挂起几毫秒,看看你是否会要求它传输更多) - 你可能因此需要一个延迟显着超过应该严格要求的延迟 - 可能15-20ms。当然,我可能会在错误的树上狂奔,你可能会发现需要500毫秒左右才能让它工作。