SerialPort的Write
方法是否写入了被告知的所有字节?
我有这个代码通过串口发送数据。
SerialPort port = new SerialPort(
"COM1", 9600, Parity.None, 8, StopBits.One);
// Open the port for communications
port.Open();
// Write bytes
byte[] bytes = Encoding.ASCII.GetBytes("Hello world from PC");
port.Write(bytes, 0, bytes.Length);
// Close the port
port.Close();
如果我发送字符串"你好"通过串口连接到我的电脑的设备接收良好。如果我从PC发送字符串" Hello world" 它只收到 前16个字节而不是19个字节。 有没有办法可以在代码中验证所有字节都已发送?或者是通过串口连接的硬件问题?
答案 0 :(得分:0)
是的,.Write是同步的,因此所有数据在返回之前都会发送。无论如何,你做的30秒超时就足够了,如果它不会发生。
答案 1 :(得分:0)
通常会发送所有字节。也许问题出在接收方。 为了确保关闭握手,请使用此代码,但我相信它已经是默认值:
serialPort.Handshake = Handshake.None;
我怀疑接收方。另一侧的UART可能不够快,无法将字符从缓冲区中取出。也许您可以尝试在消息的各个部分之间添加一些小延迟,但这当然只是用于故障排除。像这样:
// Write bytes for test purpose
byte[] bytes = Encoding.ASCII.GetBytes("Hello world from PC");
port.Write(bytes, 0, 10);
Thread.Sleep(100); // small delay
port.Write(bytes, 10, 9); // next block
答案 2 :(得分:0)
我有类似的问题。 我写了一个20字节的数组到串口,连接到无线发射器。发送完所有字节后,我需要切换回接收模式。 因此,有必要确切地知道所有字节何时从串行端口物理写出。 不幸的是,这在Windows下是不可能的,因为缓冲区查询不会返回物理芯片缓冲区的状态。
我的解决方案是使用serialPort.BaseStream.WriteAsync发送数据异步 然后通过将字节数乘以波特率来计算传输时间量:
serialPort.BaseStream.WriteAsync(buffer,0,buffer.length);
int waittime = (int)((double)buffer.length * (10/(double)baudrate) + some_reserve);
Thread.Sleep(waittime);
“10”表示一个字节由10位
组成