UART接收:单片机接收电脑发送的数据
程序设计步骤
1.配置USART1的PA9,PA10为串口收发引脚
2.配置USART的波特率、奇偶校验位、停止位、时钟
3.勾选NVIC Setting中的使能USART1的中断
4.将source生成的.c和.h文件移植到目标工程
4.1 USART初始化部分需要移植NVIC初始化内容
4.2 在it.c中添加USART1_IRQHandler中断服务函数
4.3在主函数中启动HAL_UART_Receive_IT(&huart1,rx_buf,1);
4.4在回调函数HAL_UART_RxCpltCallback实现串口接收处理,并在里面再次使能HAL_UART_Receive_IT(&huart1,rx_buf,1);
3.使能USART1的NVIC
选择优先级分组为组4(1 1 1 1) = 0xF范围0~15
4.将source生成的.c和.h文件移植到目标工程
4.2 在it.c中添加USART1_IRQHandler中断服务函数
定义数组uart_buf[2]用来存放单片机接收到的数据
在main中打开串口接收中断
意思是串口1接收一个字节到uart_buf里,每接收一个字节就产生一次中断
一个字节是8位,所以我们通过写0x00~0xff来控制LED灯亮灭
编写中断回调函数
在串口调试助手中写00~ff来控制LED灯
当电脑向单片机发送ff时,单片机上的LED灯就会按要求亮灭
串口接收固定长度的数据
假设我们的串口接收三个字节长度,每一个字节都能用来控制不同的外设,比如第一个字节写入EEPROM,第二个字节来控制LED灯
我们要定义一个数组rx_buf[10]来存放uart_buf接收到的数据,定义一个变量rx_cnt , 让rx_buf[rx_cnt++] = uart_buf[0]; 串口每接收到一个值都放入rx_buf里并移位,这样就能缓存下来串口接收到的数据
让串口固定发送3个字节数据,并用第二个字节的数据控制LED灯
因为我们规定一次要发三个字节,但如果不小心第一次发错了只发了一个字节,后续意识到发错第二次又补发了三个字节,这样就会把第一次发送的一个字节保存下来这样顺序就会错乱
我们需要添加一个判断函数,如果两个字节发送间隔时间>50ms就清除一次rx_buf[]
(因为连续发送的话两个字节的时间间隔是<50ms的)
使用memset函数需要定义string.h