这个SerialPort的写缓冲区怎么理解?那么写出去的数据有没有延时呢?如果写的数据不比传输速率快的话例如,下位机向计算机发出数据,要求上位机根据数据作出迅速反应作出指令,现在假设下位机就发出一个字节的数据,上位机也就是计算机根据这个数据立即写出指令数据也是一个字节,那么下位机从发出数据到接收到指令需要多长时间呢?假设串口波特率本身时间不算,有没有延时呢?例如对于标准波特率,下位机从发出数据结束到接收到数据的一开始,中间会有延时么?下位从发出数据结束等待例如100ms应该能确定受到反馈数据指令吧?如果中间有延时,那么这个延时一般是怎么引起的?机理是什么?能否确定一个范围?
谢谢
谢谢
可以看看,还有示例
http://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport_methods.aspx
1.如果用其它IO类包裹BaseStream,比如StreamWriter,则写入后要调用Flush,因为StreamWriter是有缓存的。
2.如果在DataReceived事件中接收数据,应该要把缓存的数据都读出来(长度为BytesToRead),不要在事件中做其它耗时的操作。
3.串口通信是不保证传输正确的,所以接收错误时,应该要有重新传输纠错的机制。
我举例100ms是为了说明问题,当然我也知道可能要求10ms也没有问题,我就是想知道到底延时会有多少,是怎么影响的,例如计算机执行其它软件比较忙的时候(但是此COM端口是专用的),其机理是什么
缓冲区其实是硬件专有的,任何硬件都自带缓冲区,例如显卡的缓存,计算机的内存,CPU的高速缓存等。这里的串口也是一样,信息先保留在缓冲区中,如果缓冲区未清除,说明对方来不及接收,理论上是会阻止继续写入的,不过还是建议测试下。
UART内部有FIFO硬件缓存,比如16550兼容的UART为1/4/8/14字节(更老的8250没有FIFO,但这种串口应该已经绝迹了,除非是模拟的)启用FIFO后,接受数据时,要凑够缓存容量或超时,才会发出中断请CPU处理,超时是8个RCLKs,RCLK时钟频率是16倍波特率,也就是说在9600波特率下,最多可能延迟0.05毫秒左右,更高波特率延迟更短。可以通过禁用FIFO缓存来及时响应接收到的数据。