Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确保字节以物理方式写入串行端口_C#_.net_Serial Port_.net 4.5 - Fatal编程技术网

C# 确保字节以物理方式写入串行端口

C# 确保字节以物理方式写入串行端口,c#,.net,serial-port,.net-4.5,C#,.net,Serial Port,.net 4.5,我有一个使用此通信协议的串行设备: 打开DTR 写入请求4字节 关闭DTR 读取响应4字节 用于切换设备模式的DTR引脚 我试着写: serialPort.DtrEnable = true; serialPort.Write(request, 0, 4); serialPort.DtrEnable = false; serialPort.Read(response, 0, 4); 但它并没有像预期的那样起作用。我打开DTR,然后立即关闭DTR,然后是4字节的传输,我用示波器确定了这一点。我已尝

我有一个使用此通信协议的串行设备:

打开DTR 写入请求4字节 关闭DTR 读取响应4字节 用于切换设备模式的DTR引脚

我试着写:

serialPort.DtrEnable = true;
serialPort.Write(request, 0, 4);
serialPort.DtrEnable = false;
serialPort.Read(response, 0, 4);
但它并没有像预期的那样起作用。我打开DTR,然后立即关闭DTR,然后是4字节的传输,我用示波器确定了这一点。我已尝试调用BaseStream.Write调用后刷新,但未成功。此外,简单while循环whileserialPort.BytesToWrite>0 Thread.Sleep1;给出同样的否定结果。串行端口速度非常慢,只有600 b/s。如果我在写入后添加Thread.Sleep调用,一切都可以,但我认为这很难看,我需要在写入后立即切换DTR


那么,如何在.NET程序中确定串行端口缓冲区何时物理传输到设备?

以600位/秒的速度,添加停止位时,4个字节(可能是40位)将需要0.0666秒,或66.67毫秒。称之为70毫秒。因此,如果您想确保在禁用DTR之前传输数据,我怀疑您需要在其中放置Sleep70。我一直认为DTR应该与DSR配对,并且在整个会话中都是静态的,但为了发送,请设置RTS并等待CTS,然后再发送?因此,RTS和CTS会在整个会话中改变状态。如果您无法获得可靠的状态,则驱动程序只会在传输缓冲区为空时通知您。但现代UART有一个片上FIFO缓冲区,通常16字节深。您需要一个自定义驱动程序来告诉您这个缓冲区是空的。实际上,这是一个微控制器的工作。请记住,设备供应商往往会想出这些不可靠的协议来推广他们自己的硬件,购买它会让你省去很多痛苦。如果没有任何选择,请投入时间使延迟更可靠。默认情况下,睡眠仅精确到15.625毫秒增量。在谷歌搜索了一段时间后,我发现我可以使用RTS\u控制\u切换标志并使用RTS pin而不是DTR。在msdn上找到。我希望这能解决我的问题。。