4

我正在尝试向我的 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"); }
        }
    } 
4

1 回答 1

1

如果您的串行端口设置(特别是如 Hans Passsant 提到的流量控制)是正确的,那么速度问题很可能是您的设备无法足够快地处理消息以跟上您发送的速度,或者它期望消息之间的“无声”间隙以描述它们。

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

这通常涉及反复试验,但请查阅设备的文档,因为相当多的设备使用传输间隙来指示消息包的结束(例如,他们通常可能希望您在一个消息,例如,如果他们在 2400 bps 链路上指定 10 位的“静默时间”,这将对应于 10/2400 秒或刚刚超过 4 毫秒)。但是,这可能会受到 Windows 的影响,因为它倾向于缓冲数据(即它会在它上面挂起几毫秒,看看你是否要让它传输更多的东西)——因此你可能需要一个比让它工作严格要求的延迟要长得多——可能是 15-20 毫秒。当然,我可能找错了树,你可能会发现你需要 500 毫秒大的东西才能让它工作。

于 2012-07-12T22:37:26.053 回答