我是这个论坛的新手,我有一个困扰我一段时间的问题。 我的设置是一个串行启用的字符显示连接到我的电脑与USB / uart转换器。我在C ++风格的单独写缓冲线程中通过serialPort类将字节传输到显示器:
private void transmitThread(){
while(threadAlive){
if(q.Count > 0){ // Queue not empty
byte[] b = q.Dequeue();
s.Write(b,0,b.Length);
System.Threading.Thread.Sleep(100);
}
else{ // Queue empty
System.Threading.Thread.Sleep(10);
}
}
}
假设串口已经打开,这可以很好地工作并将所有数据传输到显示器。在这个片段中完全没有异常处理。因此,我正在研究实现典型的C#功能,'using'语句,只在需要时打开端口,如下所示:
private void transmitThread(){
while(threadAlive){
if(q.Count > 0){ // Queue not empty
byte[] b = q.Dequeue();
using(s){ //using the serialPort
s.Open();
s.Write(b,0,b.Length);
s.Close();
}
System.Threading.Thread.Sleep(100);
}
else{ // Queue empty
System.Threading.Thread.Sleep(10);
}
}
}
这个函数的问题是,它只传输随机数量的数据,通常是80字节字节数组的三分之一。我尝试了线程的不同优先级设置,但没有任何变化。
我是否遗漏了一些重要信息,或者我只是在发送请求后过快地关闭了端口?
我希望你能帮助我。谢谢:))
答案 0 :(得分:4)
不,那是一个非常糟糕的主意。出错的地方,大致按照你会遇到的顺序:
当您关闭端口时,串行端口驱动程序会丢弃发送缓冲区中尚未传输的任何字节。这就是你现在所看到的。
用于SerialPort.Close()的MSDN文章警告您必须“等待一段时间”才能再次打开端口。有一个需要关闭的内部工作线程。您必须等待的时间量未指定且可变,具体取决于机器负载。
关闭端口允许其他程序获取端口并打开它。无法共享串口,当您尝试再次打开时,程序将失败。
串口只是没有设计成即时打开和关闭。只在程序开始时打开它,在程序结束时关闭它。根本不调用Close()是完全可以接受的,并且避免了死锁情况。
答案 1 :(得分:0)
我认为你错过了使用块的重点。典型的使用块将如下所示:
using (var resource = new SomeResource())
{
resource.DoSomething();
}
开场发生在一开始。通常作为构造函数的一部分。但有时在使用块的第一行。
但我看到的大红旗是关闭自动发生。您不需要.Close()
来电。
答案 2 :(得分:0)
如果串行设备的成功操作取决于对Thread.Sleep
的调用,那么线程可能在某个时刻被中断,足以使数据传输与设备不同步。很可能有办法解决这个问题,但我要做的第一件事就是尝试使用.NET SerialPort类。 Write方法与您想要的方法非常相似,这些文章中有C ++代码示例。