在嵌入式项目中,一般需要适当为某个外设或单个功能实现单独编写模块或组件的.c文件,以实现整个系统的高內聚低耦合。
记录一下在当前我负责的一个项目中,需要使用单片机实现单线和产品通讯,完成数据收发的功能的问题。
单片机和产品之间只使用一根数据线和另一根GND
完成数据收发,单片机发数据时产品收,产品发数据时单片机收,收发一一对应,产品不主动发数据,产品在收到指令后,必须在一定时间内给予回应。
在准备做数据接收部分,先在脑海中构思的时候,首先想的是,数据发送完毕,单片机开启中断准备接收和自动完成接收,并将接收数据放在缓冲中。
因为数据一发对应一收,且有时间限制,在思考时对该部分过于注意,导致思想进入漩涡。
认为数据接收自动完成,但需要时间,且时间一定会在指定时间段内完成,所以系统设计应该是APP在发送数据后,延时一定时间来读取即可。
但很快思考发现问题,如果产品没有按照约定返回怎么办?或产品断线?就永远收不到返回!
所以实际方法应该是,在组件内设置接收完成标志位,并在收发函数内进行状态维护。
APP调用组件接口完成指令发送,之后可以调用接口一直轮训该标志位,而轮训只会有三种结果。
1接收完成,那么读取即可。
2没有接收,那么继续下次轮训。
3轮训超时,说明产品没有回复或者通讯断线。