我正在尝试通过 uart 在 2 个 stm32f407 板之间交换数据。我使用的外围设备是 USART2(板上还有更多)。我已将其配置为波特率 9600、8 位帧、无奇偶校验位且只有 1 个停止位。发生的奇怪事情是接收器在我实际发送的数据之前获得了很多空字节(更准确地说,有时有 9 个连续的空字节,而在其他情况下,有 8 个空字节以 0xFF 字节结尾) . 这似乎只有在我打开发送器或按下其重置按钮时才会发生,如果我连续多次发送相同的数据,一切都很好。这是我用来设置 uart 的代码,如下所述:
int uart_init ()
{
unsigned int ra;
ra=GET32(RCC_AHB1ENR);
ra|=1<<0; //enable port A
PUT32(RCC_AHB1ENR,ra);
ra=GET32(RCC_APB1ENR);
ra|=1<<17; //enable USART2
PUT32(RCC_APB1ENR,ra);
//PA2 USART2_TX
//PA3 USART2_RX
ra=GET32(GPIOA_MODER);
ra|= (2<<4);
ra|= (2<<6);
PUT32(GPIOA_MODER,ra);
ra=GET32(GPIOA_OTYPER);
ra&=(1<<2);
ra&=(1<<3);
PUT32(GPIOA_OTYPER,ra);
ra=GET32(GPIOA_AFRL);
ra|=(7<<8);
ra|=(7<<12);
PUT32(GPIOA_AFRL,ra);
// divisor 136 fractional divisor 11
PUT32(USART2_BRR,(136<<4)|(11<<0));
PUT32(USART2_CR1,(1<<13)|(1<<3)|(1<<2));
return(0);
}
虽然这是我通过 uart 发送字节的例程:
void uart_putc ( unsigned int x )
{
while (( GET32(USART2_SR) & (1<<7)) == 0) continue;
PUT32(USART2_DR,x);
}
我的问题是:这是正常合理的行为吗?如果是这样,接收传入字节流并丢弃不需要的字节流的好策略是什么?如果不是,我做错了什么?