C# 如何等待合适的时机写作?

C# 如何等待合适的时机写作?,c#,serial-port,serial-communication,C#,Serial Port,Serial Communication,我正在尝试将我的rs232设备发送到多个串行端口。在每个串行端口之后编写命令。但是,我认为它不能同时处理多个写命令 目前,我只是使用Thread.Sleep(500)来延迟两次写入之间的时间,但是有没有办法检测何时是发送的最佳时间?还是用缓冲器 示例代码 接口 private void btn_infuse_Click(object sender, RoutedEventArgs e) { cmd.SetTargetInfusionVolume(spmanager, double

我正在尝试将我的rs232设备发送到多个串行端口。在每个串行端口之后编写命令。但是,我认为它不能同时处理多个写命令

目前,我只是使用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"); }
        }
    } 

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

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


这通常涉及尝试和错误,但请查阅设备的文档,因为相当多的设备使用传输间隙来指示消息包的结束(例如,通常他们可能希望您在消息后保持短暂的沉默,例如,如果他们指定了10位的“沉默时间”在2400 bps链路上,这将对应于10/2400次(或略高于4毫秒)。不过,windows可能会对这一切造成一些影响,因为它倾向于缓冲数据(即,它会保持几毫秒,以查看您是否会要求它传输更多数据)-因此,您可能需要比严格要求的更长的延迟来实现这一点,可能需要15-20毫秒。当然,我可能找错了方向,你可能会发现你需要500毫秒大的东西才能让它工作。

请确保将SerialPort.Handshake属性与设备用于流量控制的内容相匹配。