我正在使用SerialPort,WPF作为用户界面,使用'ui'对象来处理应用程序逻辑,以及使用SerialPort的包装器。
当触发SerialPort.DataReceived事件时,将调用相关方法。它开始运行,然后在阅读数据后,似乎退出,即使它还有更多的事要做。
它似乎没有抛出任何异常,它不会像它被卡在循环中一样(同步读取应该超时+我会得到大量的“我读了一件事”),而且我我很难过。几乎所有的GiveFeedback调用都是我尝试调试正在进行的操作的结果,因为我无法在我正在编写的机器上进行测试。
'ui'符号是指在调用GiveFeedback(字符串)时触发事件的对象,最终通过调用Dispatcher.BeginInvoke(stuff)来更新文本框的内容。
以下是完整的代码:
$('a.feature_thumb').click(function(){
$('.' + this.id).addClass('your-class');
});
我不知道发生了什么,我找不到任何可以帮助我的资源。我试过没有任何尝试/捕获运行它,看看它是否投掷了一些奇怪的东西,我尝试用特定的异常捕获运行它,我已经尝试了我能想到的所有事情并且知道要做。
为什么它没有一直运行,我该如何解决?即使你有一个有助于调试的想法,我也很乐意听到它!请堆栈溢出,你是我唯一的希望!
答案 0 :(得分:2)
这里有很多可能性......
首先,将数据放入串行缓冲区时会触发SerialDataReceivedEvent
。这并不意味着整个消息可用,只是串行端口对象具有来自底层流的缓冲字节。然后,您使用while
循环读取字节,直到获得-1。
ReadByte
方法表示如果已读取流的末尾,则返回 -1 。这需要仔细解密,因为流的结尾实际上是Eof
字符,不一定表示不再接收任何数据。
除此之外,您正在捕捉异常,我假设您可以告诉读取超时的时间。如果您设置了非常非常大的超时,或者将其保留为默认SerialPort.InfiniteTimeout
,那么您将永远不会抛出此异常。
最后,当数据被读入缓冲区时会引发事件,并且这并不是说事件不能被多次引发。因此,例如,当您收到10个字节时,它可能会引发事件,当您循环访问数据时,它可能会再次引发它,创建处理程序的另一个实例,然后相互争用数据。
我会仅使用该事件来发信号通知另一个线程来读取数据。如果另一个线程已经在阅读它,那么它就不会做任何事情。线程应该在它失去工作时暂停。您还应该检查SerialPort.BytesToRead
属性以确定是否有更多数据,请参阅https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.bytestoread(v=vs.110).aspx我也不确定为什么要在逐个字节循环时才能调用{ {1}}获取一次通话中可用的所有内容......?