
从我的代码中,当我只写一个传感器命令并读取时,它工作正常.但是当我编写所有命令并尝试执行它时,它无法正常工作.
在我的代码中DatafromCOM是带字符串值的全局变量,在Timer中我写了一个写传感器命令的代码.能否请你给我一些解决方案我试图这样做一周,我找不到解决方案.我的代码如下
private voID serialPort1_DataReceived(object sender,System.IO.Ports.SerialDataReceivedEventArgs e) { while (serialPort1.BytesToRead != 0) { DatafromCOM = serialPort1.Readline(); } }private voID timer1_Tick(object sender,EventArgs e){ string cmdCurrent = "D0107012A0C"; string cmdCrntTW = "D0107022B4C"; string cmdVer = "D010703EB8D"; string cmdConf = "D01070429CC"; string cmdAdd = "D010705E90D"; string cmdCorr = "D020B10"; string cmdAvg = "D011011"; string cmdLvlCor = "D010B12"; string cmdGrvty = "D010B14"; serialPort1.Write(cmdCrntTW + Newline); serialPort1.Write(cmdVer + Newline); serialPort1.Write(cmdConf + Newline); serialPort1.Write(cmdAdd + Newline); serialPort1.Write(cmdCorr + Newline); serialPort1.Write(cmdCorr + Newline); serialPort1.Write(cmdAvg + Newline); serialPort1.Write(cmdAvg + Newline); serialPort1.Write(cmdLvlCor + Newline); serialPort1.Write(cmdGrvty + Newline); txtKQ.Text += DatafromCOM + Environment.Newline; }解决方法 一般来说,我发现有两个独立的线程来处理串口通信要容易得多.一个是从BlockingCollection读取的编写器循环,另一个是使用ReadByte()同时读取一个字节的数据并立即循环返回以获取下一个数据的读取器循环.读取器线程与其他线程通信,包括使用Subject< T>的UI线程,即可观察序列. 您的主UI(或其他控制线程或计时器)可以在传出的BlockingCollection中放置要发送的字节,并且当在observable上异步接收输入时,可以对其进行处理.
当我尝试使用时,SerialDataReceivedEvent似乎永远不够可靠,这就是为什么我有一个专用的读者线程. ReadAsync也不可靠.
我的home automation system中有10个串口设备,包括许多RS485设备,这是我使用的方法.我的读者线程还会检查TimeoutException和IOException以及InvalIDOperationException,当串行端口上出现瞬态或致命错误时,调用ReadByte时会发生所有这些错误.实现指数退避然后重新打开串行端口,取消发送方线程,并重新启动新的发送方线程可以可靠地处理所有这些情况.
但无论如何,第一步,尝试实现一个单独的线程,一次一个字节从串口读取,并确保工作.缓冲一行,然后使用IObservable将该行发送到您的UI,主题将是一个良好的开端.
总结以上是内存溢出为你收集整理的c# – 写入多个命令的senser并同时读取全部内容,希望文章能够帮你解决c# – 写入多个命令的senser并同时读取所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)