【发布时间】:2012-07-18 04:33:01
【问题描述】:
我是这个论坛的新手,有一个问题困扰了我一段时间。 我的设置是使用 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);
}
}
}
假设串行端口已经打开,这可以完美运行并将所有数据传输到显示器。虽然在这个 sn-p 中根本没有异常处理。因此,我正在研究实现一个典型的 C# 功能,即“使用”语句,并且只在需要时打开端口,如下所示:
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 字节字节数组的三分之一。我尝试了线程的不同优先级设置,但没有任何改变。
我是否遗漏了一些重要的东西,或者我只是在发送请求后关闭端口太快了?
我希望你能帮助我。谢谢:)
【问题讨论】:
-
那些
Sleep()调用会扼杀你的吞吐量。有没有可以在串行端口对象上调用的Flush()方法? -
如果使用 using 块,则不需要关闭...
-
@RobertHarvey Dispose 或 Close 将刷新流。
-
是的,我知道 Sleep(100) 的时间很长,但在接收到 SpecialFunctionCommandBytes 后,显示器似乎需要一些时间。对于字符串输入,它并不关心,但现在我不管它睡着了。
标签: c# serial-port using data-loss