C# 读取时带InfiniteMeout的单声道串行端口
我有一个异步响应的设备,当设备上发生事件时,它会通过串行向主机发送状态 因此,由于mono没有实现DataReceived事件,我创建了一个线程PollRun,其中我有:C# 读取时带InfiniteMeout的单声道串行端口,c#,mono,serial-port,C#,Mono,Serial Port,我有一个异步响应的设备,当设备上发生事件时,它会通过串行向主机发送状态 因此,由于mono没有实现DataReceived事件,我创建了一个线程PollRun,其中我有: void PollRun(object param) { byte rcvResponse = 0x00; _serialPort.ReadTimeout = System.IO.Ports.SerialPort.InfiniteTimeout; while (true) { rc
void PollRun(object param)
{
byte rcvResponse = 0x00;
_serialPort.ReadTimeout = System.IO.Ports.SerialPort.InfiniteTimeout;
while (true)
{
rcvResponse = _serialPort.ReadByte();
// SOME handle code...
}
}
轮询运行正常,直到某个点。。。轮询运行在应用程序中是一个单独的线程,但当我在用户处于非活动状态一段时间后运行此应用程序时会发生什么,例如,主线程中的控制台应用程序上没有按键。。。。它停止工作,就像readByte阻塞了整个应用程序一样
也没有ctrl-c信号帮助。。。我必须手动终止进程
我正在使用Ubuntu11.10和mono 2.10.5
使用无限超时是否存在任何已知问题?在我必须一直等待事件发生的情况下,你们还有什么其他的方法来阅读这种阅读呢
谢谢大家! 确保在使用SerialPort的同一线程上创建并打开该SerialPort。另外,尝试使用10秒的超时时间,然后重新轮询。在一个真正的无限超时的情况下,退出一个应用程序是很困难的。我将实例作为主应用程序,而我需要写入串行端口。Mybe我这样做是错误的,我需要能够在轮询线程运行时写入串行端口。我需要发送启用/禁用设备,它必须是响应的,它不能真正等待readByte完成,并且由于我已经检测到mono代码,在读取工作时写入串行端口应该不会有任何问题。全双工。。。是否可以使用_serialPort.BytesToRead属性每100ms检查一次,如果大于0,则锁定_serialPort执行并读取?理论上它是全双工的,我没有这样使用过,但在线程之间传递时肯定反应不好。如果您需要从一个线程向其写入数据,然后在另一个线程上读取数据,那么请使用队列机制传递数据-不要在线程之间反弹SerialPort实例!如果我看一个普通的例子,它使用一个线程在主线程中进行读取和写入,这和我正在做的事情是一样的,只是他在读取时的超时可能较低。。。就像硬件设计一样,你可以在写作的同时阅读……这不是我做过的事情。我所测试的是,如果我有两个线程从同一个端口读取带有锁的数据——一次只有一个线程在读取,那么就会发生故障。.so库中的C代码只是假设只有一个线程。这种方式很糟糕,但到目前为止,任何人在生产中使用它都已经足够了。请确保在使用它的同一线程上创建并打开SerialPort。另外,尝试使用10秒的超时时间,然后重新轮询。在一个真正的无限超时的情况下,退出一个应用程序是很困难的。我将实例作为主应用程序,而我需要写入串行端口。Mybe我这样做是错误的,我需要能够在轮询线程运行时写入串行端口。我需要发送启用/禁用设备,它必须是响应的,它不能真正等待readByte完成,并且由于我已经检测到mono代码,在读取工作时写入串行端口应该不会有任何问题。全双工。。。是否可以使用_serialPort.BytesToRead属性每100ms检查一次,如果大于0,则锁定_serialPort执行并读取?理论上它是全双工的,我没有这样使用过,但在线程之间传递时肯定反应不好。如果您需要从一个线程向其写入数据,然后在另一个线程上读取数据,那么请使用队列机制传递数据-不要在线程之间反弹SerialPort实例!如果我看一个普通的例子,它使用一个线程在主线程中进行读取和写入,这和我正在做的事情是一样的,只是他在读取时的超时可能较低。。。就像硬件设计一样,你可以在写作的同时阅读……这不是我做过的事情。我所测试的是,如果我有两个线程从同一个端口读取带有锁的数据——一次只有一个线程在读取,那么就会发生故障。.so库中的C代码只是假设只有一个线程。这种东西很臭,但到目前为止,任何人在生产中使用它都已经足够了。