STM32
直播中

小芳

13年用户 927经验值
私信 关注
[问答]

STM32F407ZGT6是如何使用串口通信发送指令给传感器的

STM32F407ZGT6是如何使用串口通信发送指令给传感器的?其过程是怎样的?

回帖(1)

王国花

2021-11-16 09:32:34
  前言
  STM32F407ZGT6使用串口通信发送指令给传感器,让传感器返回测得的数据。
  1.过程
  
  大家看我这个程序,在main函数前面我定义了一个read_instruction数组,存放读取传感器的指令,在while循环中有一个按键检测,当按下key0的时候,单片机发送这个指令给传感器,理论上传感器接收到指令会返回测量的数据,但switch下面的这个if语句跳过了,说明if(USART_RX_STA&0x8000)没满足条件,也就是USART_RX_STA没有变成1。
  首先确认我传感器没问题,如下图:
  
  用串口助手发送16进制11 02 07 DB给传感器返回这串数据(共56个数据),所以传感器没问题。
  其次是代码有没有问题,如下图:
  
  按下单片机key0,串口助手接收到单片机发送的11 02 0B 07 DB,说明发送代码没问题。
  下面看接收代码:
  
  单片机RX接收到串口助手发的11 02 0B 07 DB会触发中断,这个USART_RX_STA寄存器就置1了(当然发送任何数USART_RX_STA都会被置1,因为只要接收就触发中断),所以LED1就被点亮了。
  总结:1、传感器被我用串口助手验证了没问题;
  2、单片机的发送程序也用串口助手验证了,能发送;
  3、单片机接收函数用串口助手验证了,只要接收到就点亮LED1;
  所以就是单片机RX接收传感器发送的数据USART_RX_STA寄存器不会置1,这到底是什么原因?
  2.看串口中断函数
  打开usart.c文件,找到下图这个函数:
  
  函数就是RX有数据进来就中断,开始读数据,但是这串数据必须要以0x0d和0x0a结尾,用串口助手发的数据默认被加上了0x0d 0x0a,所以你用串口助手发任意的数这个函数都会把USART_RX_STA寄存器置1,而传感器发送给单片机RX的数据不是以0x0d 0x0a结尾就不会置1(虽然触发中断了,但数据不是0x0d 0x0a结尾呀)。
  因此,想让USART_RX_STA寄存器置1,就需要在RX接收到的数据后面加上0x0d 0x0a,但传感器返回的数据不是我能定的呀,结尾没法加呀。
  所以只能改这个中断函数:
  
  我就直接把这个函数注释掉,自己写判断让USART_RX_STA寄存器置1,由于传感器返回的数据是56个,所以定义个标志flag2,当它等于56的时候就把USART_RX_STA寄存器置1,说明数据接收完了。然后下面的用液晶显示的函数也就实现了hhh.。。.
  
  总结
  以上是在调代码的时候遇到的问题,第一次发博客,希望对大家有所帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分