本帖最后由 逸雨 于 2020-10-12 09:51 编辑
问题图片
然后初始化代码如下USART_InitStructure.USART_BaudRate = bound;//ò»°ãéèÖÃÎa9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
USART_InitStructure.USART_Parity = USART_Parity_Odd;//ÎTÆæÅ¼D£Ñéλ
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //êÕ·¢Ä£ê½
主函数
while(1)
{
printf("123456\n\r");
delay(200000);
}
通过查找资料得到因为要加一位奇偶校验位所以数据字长要设置为9位
USART_InitStructure.USART_BaudRate = bound;//ò»°ãéèÖÃÎa9600;
USART_InitStructure.USART_WordLength = USART_WordLength_9b;//×Ö3¤Îa8λêy¾Y¸ñê½
USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
USART_InitStructure.USART_Parity = USART_Parity_Odd;//ÎTÆæÅ¼D£Ñéλ
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //êÕ·¢Ä£ê½
这样就可以解决了,
在解决这个问题是还发现了一个每次上电就会丢失一个数据,通过百度发现在下面加上这句代码就可以了
void USART_SendByte(USART_TypeDef* USARTx, uint8_t Data){
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
USART_SendData(USARTx,Data);
}
while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);//此句必须加,不加发送不正常
//而且必须加载sendata前面 加在后面时第一次上电首字节丢失
第二种方法
stm32 串口发送字符串第一个字节丢失的问题 使用stm32f205调试串口通讯时,发现一个问题,上电后串口发送字符串的第一个字节会丢失,发送测试数据hello,接收端收到的数据为:ello,第一个字符丢失。用示波器抓取波形,发现第一个数据的波型也是丢失的。 出现问题的代码如下: while(str != 0) { USART_SendData(USART1, str); i++; /* Loop until the end of transmission */ while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} }
原因: 1.通过DEBUG查看,在执行USART1_init();串口初始化完成后:TXE,TC是置1的。
2.RM0033中有一段描述, 两者的区别在于:往USART_DR中写数据的时候TXE直接被清零。TC清零则需要先读取USART_SR,然后写USART_DR。 在出现错误的代码执行之前加一句: USART_GetFlagStatus(USART1, USART_FLAG_TC); 就不存在错误了。 当然,直接清零也可以:USART_ClearFlag( USART1, USART_FLAG_TC ); 或者用USART_FLAG_TXE标志来判断。 这样可以直接在串口初始化完成的时候直接加上USART_GetFlagStatus(USART1, USART_FLAG_TC);这个代码这样就不会出现上电丢失一个数据了,
|