1.stm串口第一个字符乱码,如下将gpio初始化的代码移动到串口初始化后边
void UartInit(ULONG ulBound)
{
RCC_AHB1PeriphClockCmd(EVAL_COM1_TX_GPIO_CLK, ENABLE);
RCC_AHB1PeriphClockCmd(EVAL_COM1_RX_GPIO_CLK, ENABLE);
RCC_APB2PeriphClockCmd(EVAL_COM1_CLK, ENABLE);
GPIO_PinAFConfig(EVAL_COM1_TX_GPIO_PORT, EVAL_COM1_TX_SOURCE, EVAL_COM1_TX_AF);
GPIO_PinAFConfig(EVAL_COM1_RX_GPIO_PORT, EVAL_COM1_RX_SOURCE, EVAL_COM1_RX_AF);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = ulBound;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(EVAL_COM1, &USART_InitStructure);
USART_Cmd(EVAL_COM1, ENABLE);
USART_ClearFlag(EVAL_COM1, USART_FLAG_TC);
/* 清空发送缓冲区 */
while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
{
USART_ReceiveData(EVAL_COM1);
}
///
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = EVAL_COM1_TX_PIN | EVAL_COM1_RX_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(EVAL_COM1_TX_GPIO_PORT, &GPIO_InitStructure);
/
return;
}
2. 接线
注意:rs485接线好像是 rx接rx tx接tx
3.注意使用微库,才能调用printf
![](https://i-blog.csdnimg.cn/blog_migrate/03f0db7b818b1a77f5a6038ce774b3d2.png)
4.轮询中调用receive 导致部分数据缺失
轮询可能因为其他业务占用cpu太多时间,导致无法一次性接受全字符串,有的缓冲区例如新塘可能有16字节缓冲,一单其他业务占用太多cpu就会出现只能接收16字节数据的现象,其他字节丢了
5.RS485 使能引脚
例如你先使能发送是en,然后发送,如果发送速度慢你立马 再使能了接受,就可能导致发不全甚至发不出去,同理接收,主要是时序的问题
6. 终端显示乱码
一般大概率是电脑设置波特率和串口波特率不一致
7. 每次重启,概率性会存在串口乱码
之前用过一个命令行,然后你发送东西就会回显出来,最终定位是因为串口初始化之后最好要清空一下接收缓冲区
/* 清空发送缓冲区 */
while (USART_GetFlagStatus(EVAL_COM1, USART_FLAG_TC) == RESET)
{
USART_ReceiveData(EVAL_COM1);
}