思路:
这个考了一个RTC的配置,RTC我只配过一次,所以有些生疏,还是不能大意,一些偏僻的考点还是要多练,在获取RTC时间的时候也遇到一些bug,这个后续会用一篇博客将最近遇到的BUG都总结一下
主要的难点还是通信协议问题因为B板在收到串口的通信的时候要立即给A板发指令,A板还要将信息传递给B板,B板子还要接收消息,然后用串口发送给用户,这个通信之间要处理适当,不要产生通信干扰
其中串口通信和接收就比较宽松,只要程序不陷入死循环,串口发出的数据一般都是能收到的,串口通信的发送和接收都采用等待阻塞,如果有数据传输,那么就会阻塞住直到数据被全部接收完,如果这个时间没有数据,程序也会等待一会,一般设置的是0xff也就是255ms
即:串口会阻塞255ms在这期间数据能被接收完整即可,如果只是一条简单的if语句那么电脑执行时间大概是ns级的,当串口波特率为9600的时候传输一个数据所要的时间大概是1/9600大概104us换算成ns大概是104000ns如果程序中没有其他延时的话够整个程序执行一个周期了。所以串口收发时间是很充裕的,串口发送是有数据在255ms内发送完,没数据直接跳过不阻塞
那么问题的关键自然就来到LORA收发了,LORA通信原理之前我已经详细说过,不再多赘述,重点在于LORA一般情况下都处于接收数据的状态,数据传递过来会被放到FIFO数据线上,LORA_RX只是取数据线上的数据,所以本质上讲LORA不是实时传输
,数据传输过来会被储存起来,等待LORA_Rx取出
但是要注意在调用LORA_Tx的时候,整个系统会在这期间进入发送状态,发送的时候也需要将数据放入FIFO数据线上,这就意味着,如果数据没有被取出,LORA_Tx会清除之前的数据,将自己发送的数据放入数据线,且发送过程中不接收别的设备发送的数据
所以有FIFO中数据必须要即时取出,且LORA_Rx和LORA_Tx不能同时在主函数中循环,因为LORA_Tx会破坏接收到但还未取出的数据,所以必须要将LORA_Tx与前者分开
解决通信冲突的方法:
主函数一直调用LORA_Rx确保数据能被即时取出,LORA_Tx在发送数据数组不为空的时候才发送,且发送完后立即将发送数据数组清空
串口通信也可以采用同样的方式,既可以避免通信矛盾也可以防止数据的重复发送