
u8 USART_RX_BUF[9];//定义接收数组,看传感器返回的有多少字节数据 u8 USART_RX_STA=0;//数组标志位,如第0位、第一位 static char start=0; //开始接收数据标志位 void USART1_IRQHandler(void) { u8 Res=0;//定义一个数来接收每次读取的数据 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断,每一个字节都会中断一次 { Res =USART_ReceiveData(USART1); //读取接收到的字节数据 //接收数据时不要随便加入占用时间的命令,如串口打印,会影响下面数据字节的接收 if(Res == 0x40) //如果接收的第一位数据是0XFF(这个是查看传感器的手册得知的,这里相当于进行校验) { start=1; //开始接收数据标志位,一旦第一个接收正确,就就继续向下接收 } if(start== 1) { USART_RX_BUF[USART_RX_STA] = Res ; //把接收到的数据存到数组里面 USART_RX_STA++;//数组标志位加1 if(USART_RX_STA >= 9 && (USART_RX_BUF[1]==0x41))//这里还校验了接收的第二个数据 { printf("PM2.5:%c\n",USART_RX_BUF[4]);//通过串口1打印接收数组里的数据 USART_RX_STA=0;//重新开始接收 USART_RX_BUF[0] = 0; start=0; } } while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET); } if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) == SET) { USART_ClearFlag(USART1,USART_FLAG_ORE); } } 定义的接收数组u8 USART_RX_BUF[9];,如何在主循环直接调用 while(1) { printf("PM2.5:%c\n",USART_RX_BUF[4]); delay_ms(10000); } |
原来变量在调用的文件那里加extern |
这个代码写的,如果发送的第二帧数据不是0x41,不是要一直接收数据缓存到USART_RX_BUF数组,然后超过USART_RX_BUF数组溢出,导致程序跑飞 |
中断中尽量不要增加太多的处理,数据接收放入到缓冲区,外部处理最好。要不然会影响中断的时间。而且也不要在中断中加打印,除非特殊情况,比如调试的时候,或者加的是错误中断中。 |
求助,使用51单片机和VL6180X传感器测距,结果一直是0是什么原因,能读到ID为0xB4
在使用nucleo H7开发版 USART2发送数据测试的时候,RTS脚产生与TX脚一样的伴随波形,波形与TX脚一致
STM32G070RET6,中断优先级配置没有效果
STM32H743VIT6 HAL 串口DMA发送掉帧
STM32G474CBT6 串口通信问题
I2C从模式编程之STOP中断
使用STM32L451CEU6型号的芯片,在用usart(PA9、PA10)进行串口通信时,发送0x55在PC端可以收到正确的数据,但是发送0x80会收到0x00的数据,发送0x01会收到0x7F的数据,串口助手的配置和CubeMX上的配置参数是一样的(都是115200,8N1),请问各位这个是什么原因呀?
STM32H7,0x00000000地址的内容引发hardfault
使用HAL_UARTEx_RxEventCallback实现的uart数据接收不会被清理,一直累加
STM32调试内部flash时候,有个疑问?