C 串行端口的可变波特率是否可能?

C 串行端口的可变波特率是否可能?,c,serial-port,rs485,C,Serial Port,Rs485,波特率通常设置为指定值之一,如9600、56k等。 是否可以选择其他值,如123456波特?这是一个数字参数,为什么不呢?通信模块的时钟通常是从系统时钟推导出来的。 该系统时钟可以通过特定的数字进行划分,如2、4、8。。 这就是为什么你只能达到特定的波特率 因为你们是在讲异步协议,所以时钟不是在线路上传输的 所有这些都会导致业界决定可接受的波特率列表 但是,如果您的两个通信模块支持像17800这样的特殊波特率,您可以使用它 通常,串行适配器设计为仅在某些标准比特率下运行-50、110、150、3

波特率通常设置为指定值之一,如9600、56k等。
是否可以选择其他值,如123456波特?这是一个数字参数,为什么不呢?

通信模块的时钟通常是从系统时钟推导出来的。 该系统时钟可以通过特定的数字进行划分,如2、4、8。。 这就是为什么你只能达到特定的波特率

因为你们是在讲异步协议,所以时钟不是在线路上传输的

所有这些都会导致业界决定可接受的波特率列表


但是,如果您的两个通信模块支持像17800这样的特殊波特率,您可以使用它

通常,串行适配器设计为仅在某些标准比特率下运行-50、110、150、300、600、1200、2400、4800、9600、14400、19200、28800等。实际上,许多适配器部分在软件中实现,并且可以在其计数器范围内运行任何速率,但事实上的标准并不要求您可以指定这种任意速率。

在Windows下,您可以使用SetCommState设置串行端口的波特率,SetCommState将a作为参数。此结构的波特率元素用于设置波特率,可以是常量,例如CBR_4800,也可以是您自己指定的值,例如4801。任何值是否有效取决于硬件,即使用中的UART或SIO是否允许特定波特率。我已经有一段时间没有研究过这些东西了,但波特率可能是其他硬件提供的输入时钟速率的倍数,因此某些速率可能无法工作。请注意,我的经验与RS232有关,而不是RS485,但我相信使用相同的SDK。

实际上,使用速率寄存器和倒计时寄存器是很正常的。速率被编程为寄存器中的时钟计数,而倒计时寄存器从速率寄存器中的值开始并倒计时到零。一般来说,这将产生一个2到16倍于目标波特率的值,进一步的除法将产生实际的波特率。您可能应该添加所针对的操作系统和平台,因为正确的答案取决于这两个方面。