今天看了一下5.150的代码没找到有CRC校验的,后面从3.70里面看到有疑似CRC的代码。
static void app_neb_msg_tx_insert_CRC(uint8_t * p_params, uint16_t length)
static bool app_neb_msg_crc_check(uint8_t * p_params, uint16_t length)
1)这两个是CRC校验的吗?
3)怎么使用?
Keywords:
Device:
看你CRC是怎么定义的。像OTA里面是用字节异或的方式。
而你提到的两个函数,是采用字节加的方式。
我看了下CRC的代码。有2个疑问
我看到两个指针都分别要减去uint8_t和uint16_t的字节数
1)第一个疑问:
static void app_neb_msg_tx_insert_CRC(uint8_t * p_params, uint16_t length)
{
uint8_t crc = 0x00;
uint8_t * p_crc = p_params + length - sizeof(uint8_t);
uint8_t * p_start = p_params - sizeof(uint16_t);
// Add all bytes in the packet
while(p_start < p_crc)
{
crc += *(p_start++);
}
// 1s complement
crc = ~crc;
*p_crc = crc;
}
是不是指针p_params指向的内存字节段长为length,最后一位要包括一个字节的CRC。
所以p_crc就等于p_params+length-sizeof(uint8_t)?
2)第二个疑问
uint8_t * p_start = p_params - sizeof(uint16_t);
p_start指针要从p_params起减掉2个字节。这是要干嘛?
是说p_params前面2个字节的内容也要一起校验吗?
1.因为GTL的数据格式是,可以查UM-B-017
Type(2)/DST_ID(2) /SRC_ID(2)/PAR_LEN(2)/Parameters(N)
查看函数app_neb_msg_tx_confirm。里面p_msg指向Parameters字段的首地址。
所以,
问题1:看到函数app_neb_msg_tx_insert_CRC(p_msg ,msg->param_length + 4)
长度“+4” 只前面3个字节,再加1个字节的CRC放在末尾
问题2,对,需要加上前面的PAR_LEN(2 bytes)