您能查询当前串口的速度吗?


9

我是否可以使用一些代码来找出所选串行端口的运行速度是多少?


1
在变量中定义速度可能会更容易:)
匿名企鹅

您是说PC或其他设备设置串行速度,而Arduino进行自我调整以匹配吗?
DaveP

Answers:


7

没有顶层,易于使用的方式。抱歉。设置串行端口时,将所选的波特率存储在一个变量中可能会更容易。

无论如何,对于基于AVR的硬件UART,您可以尝试做的是撤消Serial.begin设置特定波特率的操作,但这有点麻烦。这是用于设置波特率的代码:

  // Try u2x mode first
  uint16_t baud_setting = (F_CPU / 4 / baud - 1) / 2;
  *_ucsra = 1 << U2X0;

  // hardcoded exception for 57600 for compatibility with the bootloader
  // shipped with the Duemilanove and previous boards and the firmware
  // on the 8U2 on the Uno and Mega 2560. Also, The baud_setting cannot
  // be > 4095, so switch back to non-u2x mode if the baud rate is too
  // low.
  if (((F_CPU == 16000000UL) && (baud == 57600)) || (baud_setting >4095))
  {
    *_ucsra = 0;
    baud_setting = (F_CPU / 8 / baud - 1) / 2;
  }

  // assign the baud_setting, a.k.a. ubrr (USART Baud Rate Register)
  *_ubrrh = baud_setting >> 8;
  *_ubrrl = baud_setting;

您可以通过读取正确的UCSRA,UBRRH和UBRRL寄存器找到结果。在uno上,这些是正确的寄存器名称,在Mega上,其UCSR0A,UBRR0H,UBRR0L(用于Serial),UCRS1A ...用于serial1,依此类推。非Avr板(和SerialLeonardo)将完全不同。

每个波特率下,特定板卡(和该板卡的频率)在AVR硬件串行端口上的这三个寄存器将处于单一状态。您可以尝试建立一个方程式来获得原始的波特率,但是我建议您只将直接值与某种形式的查找进行比较,因为整数算术舍入误差会使其变得一团糟。

例如,在我的大型UBBR0H,UBBR0L和UCSR0A上,9600波特为0、207、2,但38400波特为0、51、2,而57600波特为0、16、0。


谢谢,这是我一直在寻找的东西,但是如上所述,与其他选择相比,这可能比值得的麻烦更多。
Hayden Thring 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.