Answers:
如果您在1%以内,则应该可以。
假设您的UART使用16倍过采样时钟,例如,您可以将其设置为1,843,200 Hz至16倍过采样115,200 bps。(这样的过采样是很常见的)这使UART从起始位的下降沿开始以8个超时钟计数,因此在之后,它可以将位单元的中心定位在超时钟的+/-周期内。它将计算超频的16个周期,以确定何时采样数据。
如果您认为它可以到达起始位的中心,那么为了在8个数据位上的正确位单元中保持对串行数据的采样,时钟频率必须保持在(8-0.5)/ 8和(8 + 0.5)之间)/ 8或预期比特率的+/- 6.25%。更高的超频接近击中起始位中心的理想条件,但是8x或16x通常足够接近,您可以假设5%的不匹配将起作用。
但是,您不能指望频率完美的另一面。如果将速度为4%的设备连接到速度为4%的设备,则会遇到问题。我碰到过至少一种情况:一台PC的运行速度有点慢,而一台设备的运行速度却快,而两者只能勉强沟通,尽管同一台设备可以与其他PC正常运行,而PC可以与其他PC正常运行设备。(O观察到它们的频率大约为112kbps和119kbps)因此,最好尽可能地接近标称频率。我从未见过名义上2%以内的任何问题。
通常要做的是使用一个主时钟速率,该时钟速率提供预期UART过采样速率乘以波特率的整数倍。例如,如果您想让CPU运行在大约8MHz的频率上,则可以使用7.3728MHz的振荡器,将其除以4得到1.8432MHz,恰好是115200的16倍。
不需要1%@JustJeff提及。大多数UART在最后一位允许半个位错误。大多数情况下,一帧包含1个起始位,8个数据位和1个停止位,总共10位。10位上的一半是5%(JustJeff的6.25%并未考虑起始和终止位)。
JustJeff忘记了开始位,但是Stevenh添加了停止位。假设共有8个数据位,1个起始位,没有奇偶校验位的通用协议(停止位的数量无关紧要),则从起始位的上升沿到中间位有8 1/2位时间。最后一个数据位。通常,您希望接收器在1/4位时间内对最后一位进行采样。请注意,1/2位是保证失败的阈值。由于总是存在一些电气噪声和抖动,因此附近的任何东西都变得不可靠。
1/4除以8 1/2 = 2.94%。
正如JustJeff提到的那样,大多数UART实现实际上都是使用异步16x时钟采样输入数据的。这增加了另一个1/16位时间不确定性,因为这是可以测量起始位前沿的误差。8 1/2位中的1/16位时间是另一个0.74%。这来自先前计算的错误预算。最终,接收器将允许2.2%的时钟失配,以使其在其中心的1/4位时间内对最后一位进行采样。
正如其他人所说,当需要精确的波特率时,通常使用7.3728MHz晶体。通常,您可以安排在接近晶体错误的情况下达到UART波特率时,以接近其最大速率运行CPU。