1、通过stm32配置时钟,串口参数。
2、配置串口DMA,normal模式。
3、打开串口中断,如果不开启串口中断,则程序只能发送一次数据,程序不能判断DMA传输是否完成,USART一直处于busy状态。
4、定义局部数组,HAL_UART_Transmit_DMA发送,发现后面几个字节数据错误,把局部数组改为全局数组就没问题。
5、用std库,采用DMA给485发送数据。
程序思路是这样的,进入中断后:
接收陀螺仪的数据,如果收到的第一个字节不是0x55,就不接收。。此时counter是不增加的。。
如果接收到的第一个字节是0x55,counter自增,收到的数据暂存至 Temp。。。
当 counter自增到11时,将Temp收到的数据存至Re_buf,同时counter清零,sign置1
第一行的意思是 表示 如果接收寄存器非空,即有数据,那么判断为接收中断
第五行 是跳出中断
你用示波器抓一下,首先确定问题是发送错误,还是接收错误。抓的时候,要连同CLK一起抓。如果确定收错了,看看中断中是不是做了太多的工作,导致读取的时间晚了,或者中断配置的是否是接受到数据的中断,这个别搞错了。
调试串口时,发现串口会出现频繁跳中断,导致无法执行主循环的问题!
调试发现是串口中断硬件BUG:
1. USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);使能了接收中断,那么ORE中断也同时被开启了。
2. ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到 (没有使能USART_IT_ERR中断时)
解决办法:
1. 初始化时,开启中断
USART_ITConfig(USART1, USART_IT_PE, ENABLE); //开启PE错误接收中断Bit 8PEIE: PE interrupt enable
USART_ITConfig(USART1, USART_IT_ERR, ENABLE); //CR2 开启ERR中断
2. 在STM32中断函数增加USART_IT_ORE等异常中断的处理!
//开启CR3,bit0的EIE: Error interrupt enable, 处理USART_IT_ERR,USART_IT_ORE_ER,USART_IT_NE,USART_IT_FE 错误
if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)
{
//同 @arg USART_IT_ORE_ER : OverRun Error interrupt if the EIE bit is set
ushTemp = USART_ReceiveData(USART1); //取出来扔掉
USART_ClearFlag(USART1, USART_FLAG_ORE);
}
if(USART_GetFlagStatus(USART1, USART_FLAG_NE) != RESET)
{
//同 @arg USART_IT_NE : Noise Error interrupt
USART_ClearFlag(USART1, USART_FLAG_NE);
}
if(USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET)
{
//同 @arg USART_IT_FE : Framing Error interrupt
USART_ClearFlag(USART1, USART_FLAG_FE);
}
if(USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET)
{
//同 @arg USART_IT_PE : Parity Error interrupt
USART_ClearFlag(USART1, USART_FLAG_PE);
}
超时问题。
在指定的时间内没有读出或写入指定数量的字符,那么ReadFile或WriteFile的操作就会结束。
其次,要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。
那那就重新启动机器一次,也有可能是越狱吧,你的你的电脑需要越狱才能保证数据传输不错误,用上越狱软件,我给忘了有可能是手机中病毒了,需要越狱越狱删除一些病毒文件,然后就会好了。就
本文标签:stm32重启后串口接收错误