背景说明:
STM32上对接一款串口传感器,该串口采用串口如下
波特率:115200
停止位:1
校验位:偶校验(Even)
硬件流控:无
数据位:8bit
笔者使用STM32F103C8系列单片机,使用2路串口
串口1:PA9 PA10 //打印调试数据
串口2:PA2 PA3 //串口传感器通讯
遇到问题说明:
1、STM32串口1、2输出时,一直丢失第一个字节数据。
2、STM32串口2与协议无法不一致,其效果如下文档 (CC 10 01 00 00 CC 1F) 实际接受(CC )
Q1:STM32串口1、2输出时,一直丢失第一个字节数据。
A1:
增加如下代码中粗体字段,具体原因为stm32的usart的sr寄存器的TC初始化为1,导致第一次发送时,直接被后一个数据取代,故无法打印。
int fputc(int ch, FILE *f)
{
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return (ch);
}
Q2:STM32串口2与协议无法不一致,其效果如下文档 (AA 10 01 00 02 AA 1F) 实际接受(AA 90 81 00 82 AA 9F )
A2:其原因主要为奇偶校验位,查看数据手册stm32的蛇者数据长度是把校验位一并相加,故上图设置的数据长度8位,其实是7位y有效数据位,1位停止位。而接收端设置的是8位有效数据位,1位停止位。所以在发送的时候把校验位覆盖掉了最高位。
将
**
USART_InitStructure.USART_WordLength = ***USART_WordLength_8b***;
USART_InitStructure.USART_Parity = ***USART_Parity_Even***;
**
USART_InitStructure.USART_WordLength = ***USART_WordLength_9b***;
USART_InitStructure.USART_Parity = ***USART_Parity_Even***;
按如上设置即可
背景说明:
STM32上对接一款串口传感器,该串口采用串口如下
波特率:115200
停止位:1
校验位:偶校验(Even)
硬件流控:无
数据位:8bit
笔者使用STM32F103C8系列单片机,使用2路串口
串口1:PA9 PA10 //打印调试数据
串口2:PA2 PA3 //串口传感器通讯
遇到问题说明:
1、STM32串口1、2输出时,一直丢失第一个字节数据。
2、STM32串口2与协议无法不一致,其效果如下文档 (CC 10 01 00 00 CC 1F) 实际接受(CC )
Q1:STM32串口1、2输出时,一直丢失第一个字节数据。
A1:
增加如下代码中粗体字段,具体原因为stm32的usart的sr寄存器的TC初始化为1,导致第一次发送时,直接被后一个数据取代,故无法打印。
int fputc(int ch, FILE *f)
{
USART_ClearFlag(USART1,USART_FLAG_TC);
USART_SendData(USART1, (uint8_t) ch);
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
return (ch);
}
Q2:STM32串口2与协议无法不一致,其效果如下文档 (AA 10 01 00 02 AA 1F) 实际接受(AA 90 81 00 82 AA 9F )
A2:其原因主要为奇偶校验位,查看数据手册stm32的蛇者数据长度是把校验位一并相加,故上图设置的数据长度8位,其实是7位y有效数据位,1位停止位。而接收端设置的是8位有效数据位,1位停止位。所以在发送的时候把校验位覆盖掉了最高位。
将
**
USART_InitStructure.USART_WordLength = ***USART_WordLength_8b***;
USART_InitStructure.USART_Parity = ***USART_Parity_Even***;
**
USART_InitStructure.USART_WordLength = ***USART_WordLength_9b***;
USART_InitStructure.USART_Parity = ***USART_Parity_Even***;
按如上设置即可
举报