Usage of SerialPort.BytesToWrite

本文关键字:BytesToWrite SerialPort of Usage | 更新日期: 2023-09-27 17:56:33

如果 SerialPort.Write() 是一个阻塞操作(或者不是?),那么需要 BytesToWrite() 方法。它将始终计算为零,导致最后一个写入操作要么成功写入所有数据,要么失败,在任何一种情况下,要写入的字节都将为零。

也许,它比我所描述的要多。

Usage of SerialPort.BytesToWrite

SerialPort.Write是一个

阻塞操作,是的。但是,需要考虑两个缓冲区:串行设备和SerialPort缓冲区。

如果SerialPort对象配置为缓冲区,则仅当该缓冲区中没有足够的空间时,写入才会阻塞。只要缓冲区清空到足以容纳新数据,它就会阻塞。否则,它将填充缓冲区并返回。

如果SerialPort对象不缓冲,则 Write 操作仅在将数据传输到串行设备所需的时间内阻止。该设备有自己的 buffer(*),因此该块花费的时间可能远少于发送数据所需的时间。

SerialPort.BytesToWrite包括设备缓冲区中的数据和SerialPort对象缓冲区中的数据。

(*) 较旧的 UART 没有缓冲区,而较新的 UART 有,但可以配置为不缓冲。

串行端口是非常慢的 I/O 设备,可以追溯到计算的石器时代。 在每秒 9600 位的常见波特率下,它每秒只能传输不到一千字节。 与硬盘相比,每秒 60,000,000 字节的突发速度是可能的。 或者更具可比性,网卡每秒可以传输125,000,000字节。

因此,串行端口驱动程序会保留一个缓冲区,用于存储您写入的字节,并在 UART 芯片写入时缓慢清空它。 该缓冲区允许 Write() 调用快速返回。 鉴于它太慢了,您可能需要了解该缓冲区的满度,以便避免阻塞 Write() 调用。 WriteBufferSize - BytesToWrite 告诉您该缓冲区中有多少可用空间。

SerialPort 属性 BytesToWrite 获取发送缓冲区中数据的字节数。

另一方面,SerialPort方法Write(字符串文本)将指定的字符串写入串行端口。

你知道串口是如何工作的吗? 串行每秒发送一定数量的字节,具体取决于所使用的波特率。