用C语言做物联网网关开发时,经常需要通过串口、485接口等从一些传感器读取数据,由于网关设备和传感器所处的环境复杂多样,电磁干扰等常常会破坏传输的数据,为了确保传输数据的可靠性,通常会采取一些策略,常用的策略:数据校验+超时重传,具体过程如下:
步骤1~3重点为了讲述如何确保数据可靠传输,真实情景中为了能正确地断包(识别数据包),通常会按照如下结构来定义数据包:
#define MAX_DATA_LEN 100 /* 假设元数据的最大长度为100字节 */
typedef struct tag_data_pack {
uint8_t sop; /* 包起始标识,(Start Of Pack) */
uint8_t len; /* 元数据长度,假设为1字节 */
uint8_t datas[MAX_DATA_LEN + 2]; /* 元数据 + 2字节的校验数据 */
}data_pack_t;
总线式的通信中,通常还会在数据包中加入目标设备的地址,以便于确定数据是发往总线上的哪个设备,数据包的参考结构如下:
用C语言描述如下:
#define MAX_DATA_LEN 100 /* 假设元数据的最大长度为100字节 */
typedef struct tag_data_pack {
uint8_t sop; /* 包起始标识,(Start Of Pack) */
uint8_t addr; /* 目标设备地址,假设为1字节 */
uint8_t len; /* 元数据长度,假设为1字节 */
uint8_t datas[MAX_DATA_LEN + 2]; /* 元数据 + 2字节的校验数据 */
}data_pack_t;
文中涉及的概念:
发送方、接收方、元数据、校验数据、请求数据包、响应数据包、守卫计时器。