C 串口读取()一次只能获取较少的字节

C 串口读取()一次只能获取较少的字节,c,serial-port,usbserial,C,Serial Port,Usbserial,操作系统:Ubuntu 串行端口使用:USB->串行适配器(prolific PL2303) 我有一个样本串口读写程序。在运行应用程序时,我试图发送4100字节,编写的程序能够一次性完成 n = write (s_port,msg,4100); 我在这里检查'n'值,它是4100 I*强文本*n接收端 n = read(s_port,msg,5000); 上面这一行是在一个循环中,我在一次读取尝试中获得的字节数不超过32个。因此,要获得完整字节数(4100),需要进行128次以上的读取尝试(

操作系统:Ubuntu

串行端口使用:USB->串行适配器(prolific PL2303)

我有一个样本串口读写程序。在运行应用程序时,我试图发送4100字节,编写的程序能够一次性完成

n = write (s_port,msg,4100);
我在这里检查'n'值,它是4100

I*强文本*n接收端

n = read(s_port,msg,5000);
上面这一行是在一个循环中,我在一次读取尝试中获得的字节数不超过32个。因此,要获得完整字节数(4100),需要进行128次以上的读取尝试(32+32+32等)


在发送端,如果能够在一次发送中推送整个字节,为什么不能在一次发送中接收呢?根据波特率,串行通信需要时间传输单个字节。CPU在处理接收到的字节时速度要快得多

通过写入,串行通信设备接口能够缓冲要发送的字节。然而,读取必须在从另一个设备接收字节时获取字节,因此存在时间延迟

这是一个例子

将串行端口与此进行比较


并行端口每一位有一根导线,因此所有位都在同一时间传输,而串行端口一次一个地串行传输位。并行端口用于高速传输,例如在串行端口速度非常低的时候用于打印机。串行端口速度在过去几年中有了显著的提高,但仍然没有接近USB速度的地方。

这是串行到USB转换器的一般性质,您将不得不处理接收到的数据块较小。我原以为PL2303有一个64字节的缓冲区,但不管怎样,它完全在一次读取中传输的内容之下


由于是异步的,因此没有指定数据块开始和结束的参数,因此,芯片/驱动程序必须根据芯片缓冲区大小和其他规则(例如,在将数据作为USB数据包转发之前超时)决定在何处中断数据流。

因此,如果在直接串行到串行设置中(我的意思是没有USB到串行适配器),将在一次触发中接收整个字节,对吗?串行通信一次发送一个位,这就是为什么最小的电缆是发送线、接收线和接地(我认为是接地)。电缆插入的串行通信端口设备读取接收线上的信号电压,并根据接收数据时的电压变化创建一系列的1和0,或在发送数据时获取一系列的位并发送一系列的电压变化。串行端口设备将一系列位聚合成一个完整的字节,提供给端口的用户。这意味着在写入端,整个数据保存在缓冲区中,并且仅部分地发送?串行通信一次发送一个位,这就是为什么最小电缆是发送线、接收线和接地(我认为是接地)。电缆插入的串行通信端口设备读取接收线上的信号电压,并根据接收数据时的电压变化创建一系列的1和0,或在发送数据时获取一系列的位并发送一系列的电压变化。串行端口设备将一系列位聚合成一个完整的字节,以提供给端口用户。