写入会发送所有字节吗?(串行端口)

本文关键字:串行端口 字节 | 更新日期: 2023-09-27 18:32:22

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();

如果我发送字符串"Hello",则通过串行端口连接到PC的设备可以很好地接收它。如果我从PC发送字符串"你好世界"它只接收前 16 个字节而不是 19 个字节。有没有办法在代码中验证所有字节都已发送?还是通过串行端口连接的硬件问题?

写入会发送所有字节吗?(串行端口)

是的,.写入是同步的,因此所有数据在返回之前都会发送。无论如何,您所做的 30 秒超时将绰绰有余,如果它不会。

通常发送所有字节。也许问题出在接收方。要确保握手已关闭,请使用以下代码,但我相信它已经是默认设置:

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

我也有类似的问题。我将一个 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 位组成