一、接收:
1.准备工作:自定义数组作为FIFO接收缓冲区;开启串口接收中断;建立并在主循环或者定时器中断函数中调用 检测FIFO缓冲区是否有数据的函数。
2.流程:STM32作为下位机,当上位机给下位机发送数据时,当下位机收到数据(接收寄存器被赋值),会产生中断,在中断服务函数中,将接收到的数据存入FIFO接收缓冲区中;此时检测函数检测到FIFO缓冲区有不为空(有数据),会将数据以先入先出的顺序读取出来,进行下一步的处理。
二、发送:
1.准备工作:自定义数组作为FIFO发送缓冲区;开启串口发送中断。
2.流程:STM32作为上位机,上位机发送数据,此时会,面临三种情况:1.此时发送寄存器为空,那么就将要发送的数据赋值给发送寄存器,进行发送;2.此时发送寄存器不为空,且FIFO发送缓冲区未满,那么就将要发送的数据存入缓冲区;3.此时发送缓冲区不为空,FIFO发送缓冲区已满。那么就在while循环等待,直至缓冲区有位置后,存入缓冲区。当发送完成后,会生产中断,在中断服务函数中,检查FIFO发送缓冲区是否有数据,如果没有,则失能发送中断;如果有,则按照先入先出的顺序,读取缓冲区的数据,赋值给发送寄存器,进行发送,如此反复,直至最后一个数据被发送完成后,在中断函数中,判断FIFO发送缓冲区为空,则失能发送中断。
三、总结:
FIFO作为缓冲区,一方面,当STM32正在处理上接收到的数据时,此时有数据发送过来,会将其存入FIFO缓冲区(可以理解为一个数组),待STM32处理结束后,从FIFO缓冲区读取数据(先入先出原则),继续进行处理,因此不用担心由于数据处理不及时而导致上位机发送给下位机的数据丢失(正常来说,将收到的数据存入缓冲区的时间比对收到的数据进行数据处理解析的时间更快);另一方面,当STM32正在发送数据时,STM32只需要读取FIFO缓冲区数据,赋值给发送寄存器,待发送成功后,进入串口中断读取FIFO缓冲区数据,赋值给发送寄存器,如此反复,直至FIFO缓冲区为空。在缓冲区仍有数据的时间里,STM32可以去处理其他事情,不用等待数据发完(因为数据发送完成后,会自动进入串口中断读取数据,进行发送)。
如果有哪里描述不对的地方,还望指出
制作不易,如果对你有帮助,给个关注呗......