STM32 USART调试笔记
来源:互联网 发布:php云人才系统采集 编辑:程序博客网 时间:2024/05/02 06:13
硬件环境:STM32f103
IDE:MDK
固件库:3.5
实现功能:串口接收一串字符串放入定义的缓冲区。当空闲终端发生时,去除字符串中的关键字。
前期遇到问题:
1.接收到的数据再RXNE中断中,逐个存取数组中。再次访问数组时。数组中的数据不见了,并且Rev_Num与实际发送到的字符串个数并不符合。需要连续发送多次,才能正确接收。之后buf[]内的数据又被清除。(没有在其他程序中处理这个数组)
代码如下:
char Rev[250]={0};//数据缓存区u16 RX_Num=0;char temp;char buf[500];void USART1_IRQHandler(void){ char x; if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET) { USART_ClearFlag(USART2, USART_FLAG_ORE); x = USART_ReceiveData(USART1); } if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { USART_ClearITPendingBit(USART1,USART_IT_RXNE); x=USART_ReceiveData(USART1); buf[RX_Num]=x; //USART_SendData(USART1,Rev[RX_Num]); RX_Num++; // while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); } else if(USART_GetITStatus(USART1,USART_IT_IDLE)!=RESET) { x=USART1->SR; x=USART1->DR; Tri_D_LED; Rev_Count=RX_Num; RX_Num=0;//一帧数据接收完成,清空RX_Num,准备下一帧数据的接收 temp=getRev_data(Rev); printf("%d:%s",Rev_Count,buf); printf("this is:%c\n\r",temp); switch (temp) { case '0':ledoff;break;//修改@17/4/8 16:03 case '1':ledon;break; default:ledoff;break; }// USART_ClearITPendingBit(USART1,USART_IT_IDLE); }}
快速点击发送之后:就正常了,之后还是不正常
调试了一上午,最后发现出现这种情况的竟然是我非常寄希望的空闲中断造成的。去掉了之后算是正常时。直接截取服务器返回给单片机的数据。还可以。
总结:当传输大量数据时,串口中断里最好只做数据接收,避免数据处理。能用dma就用dma。
1 0
- STM32 USART调试笔记
- STM32调试笔记之USART-波特率
- stm32 USART 学习笔记!
- stm32学习笔记-USART
- STM32:USART串口通信笔记
- STM32学习笔记一一USART
- STM32 USART 普通串口应用,调试总结
- STM32 USART串口发送软件调试
- STM32笔记---DMA(USART)的演示
- STM32串行通信USART讲解笔记
- STM32学习笔记(2):USART
- STM32学习笔记:USART串口的…
- STM32 USART
- STM32 USART
- STM32-USART
- STM32笔记(三)ADC、DMA、USART的综合练习
- STM32学习笔记(7):USART串口的使用
- STM32学习笔记(7):USART串口的使用
- 自定义圆环进度条
- Python爬取百度旅游网站的景点
- Javaoop——异常
- 常用的字符串处理函数
- JS数据类型检测的四种方法
- STM32 USART调试笔记
- 快速排序
- V型积木
- 贪吃蛇---STC89C52(已修复BUG版)
- 异常-(1)
- BZOJ P2127 happiness
- Java面向对象
- #6 Div2 E. Exposition(RMQ+最长连续子序列变形)
- 浙大17年校赛(ZOJ 3956)Course Selection System[01背包]