针对两个lora模块之间的数据完整性校验,不包含级联情况:
- 消息头同步:
12个字节
消息头标识+该包数据总长度+该数据包的CRC16+本数据的CRC
| 0x5A5A5A5A |len|CRC16|CRC16|
原理:发送端首先发送第一包数据消息头,接收端根据收到的消息头,获取数据包长度,然后接收对应长度的数据包,如果存在一包消息头不对,则请求发送端,重新同步消息头。
2 .数据包切片发送
按照8字节一个发送包切片,
pkts = len/8;
reminder = len%8;
while(1)
{
log_debug_bin((UINT8 *)(pbuff + times * 8), 8, 64, "send one pkt:");
send_len = write(g_lora_uart_fd, pbuff + times * 8, 8);
if (send_len == 8)
{
log_debug("Sent OK sentlen = %d, data_len: %d ", send_len, 8);
}
else
{
log_debug("Sent Failed sentlen = %d, data_len: %d ", send_len, 8);
}
times ++;
msleep(500);
}
if (reminder > 0)
{
if (aux_is_high() == 1)
{
send_len = write(g_lora_uart_fd, pbuff + times* 8, reminder );
if (send_len == reminder)
{
log_debug("Remainder: Sent OK, sentlen = %d, reminder = %d", len, reminder);
}
else
{
log_debug("Remainder: Sent Failed, sentlen = %d, reminder = %d",send_len, reminder);
}
}
}
发送端流程:
3.数据包接收组包
接收消息头:
len = read(g_lora_uart_fd, &(hp.cmd), 12);
log_debug_bin((UINT8 *)&(hp.cmd), len, 64, "Lora recved pkt:");
log_debug("recv cmd=%x len = %d\n",hp.cmd,len);
校验数据长度是否是12字节 头+len+CRC +CRC
循环接收数据
while(1)
{
ret = read(g_lora_uart_fd, pact->pdata + total_len, rem);
rem -= ret;
total_len += ret;
if (total_len == hp.len)
break;
}
4.CRC+len校验
5.请求同步消息头
while(1)
{
if(aux_is_high() == 1)
{
ack.cmd = 0xB5B5B5B5;
ack.len = 4;
send_len = write(g_lora_uart_fd, (UINT8 *)&(ack.cmd), 8);
log_debug("send head ack ackcmd=%x len = %d\n",&(ack.cmd),send_len);
break;
}
msleep(200);
}
接收端流程: