我正在尝试向我的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"); } } }
解决方法
如果您的串口设置(特别是Hans Passsant提到的,流量控制)是正确的,那么速度问题很可能是您的设备无法足够快地处理消息,以便在发送速度过快时与您保持联系,或者它期望消息之间存在“无声”差距以便描述它们.
在这种情况下,Sleep()引入传输延迟是一种非常合理的方法.您需要找到明智的延迟,以确保设备成功处理您的消息,理想情况下不会拖延您的应用程序太长时间.
这通常涉及试验和错误,但请查阅设备的文档,因为相当多的设备在传输中使用间隙来指示消息包的结束(例如,通常他们可能希望您在一段时间后保持沉默.消息,例如,如果他们在2400bps链路上指定了10比特的“静默时间”,则这将对应于10/400ths或仅超过4毫秒).但是,这可能会受到Windows的影响,因为它往往会缓冲数据(即它会挂起几毫秒,看看你是否会要求它传输更多) – 你可能因此需要一个延迟显着超过应该严格要求的延迟 – 可能15-20ms.当然,我可能会咆哮错误的树,你可能会发现你需要500毫秒左右才能让它工作.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。