将uint16_t crc16_modbus_8005(unsigned char *buf, unsigned int len) { uint16_t crc16 = crc16_modbus_a001(buf, len); return ((crc16 & 0x00ff) << 8) | ((crc16 & 0xff00) >> 8); //high-low convert } uint16_t crc16_modbus_a001(unsigned char *buf, unsigned int len) { uint16_t crc16 = 0xffff; uint16_t tmp; int i, j; for (j=0; j<len; j++) { crc16 = buf[j] ^ crc16; for (i=0; i<8; i++) { tmp = crc16 & 0x0001; crc16 = crc16 >> 1; if (tmp) crc16 = crc16 ^ 0xa001; } } return crc16; }这段程序改写成MK22FN512VLH12单片机使用官方库的fsl_crc.h文件中
时间: 2024-03-09 18:50:58 浏览: 112
以下是使用fsl_crc.h文件中的CRC模块实现的代码:
```c
#include "fsl_crc.h"
uint16_t crc16_modbus_8005(unsigned char *buf, unsigned int len)
{
crc_config_t config;
uint16_t crc16;
/* 初始化CRC模块配置 */
CRC_GetDefaultConfig(&config);
config.polynomial = 0xA001;
config.seed = 0xFFFF;
config.reflectIn = true;
config.reflectOut = true;
/* 计算CRC16 */
CRC_Init(CRC0, &config);
CRC_WriteData(CRC0, buf, len);
crc16 = CRC_Get16bitResult(CRC0);
/* 高低位转换 */
return ((crc16 & 0x00ff) << 8) | ((crc16 & 0xff00) >> 8);
}
```
需要注意的是,该代码中使用了CRC模块的反射输入和反射输出功能,因为Modbus协议中使用的CRC算法是反向的。同时,CRC模块的多项式和种子值也需要设置为对应的值。
相关问题
uint16_t crc16_modbus_8005(unsigned char *buf, unsigned int len) { uint16_t crc16 = crc16_modbus_a001(buf, len); return ((crc16 & 0x00ff) << 8) | ((crc16 & 0xff00) >> 8); //high-low convert }是属于上面那一种CRC算法
这个函数 `crc16_modbus_8005` 并不是上面提到的两种 CRC 算法,它是基于 Modbus 标准的 CRC-16 算法,使用的生成多项式是 x^16 + x^15 + x^2 + 1,初始值为 0xFFFF。该算法常用于串行通信协议中的错误检测和校验。此函数中的 `crc16_modbus_a001` 函数实际上是计算 Modbus 标准的 CRC-16 校验值的函数。最后的高低字节转换代码是将计算出的 CRC-16 校验值进行了高低字节的交换。
void voice_app_uart_send(uint8_t c) { rcv_protocol send_ata; uint8_t *tmp_ptr = NULL; uint16_t tmp = 0; send_ata.head = 0xAA; send_ata.type = 0x01; send_ata.date = c; send_ata.end = 0xBB; tmp_ptr = (uint8_t *)&send_ata; unsigned char i = 0; printf("Send data len:%ld\n", sizeof(send_ata)); printf("Send uart data:"); printf_buf(tmp_ptr, sizeof(send_ata)); printf("\n"); #if VOICE_UART_ENABLE voice_uart_send((uint8_t *)&send_ata, sizeof(send_ata)); #endif }
这段代码是用于发送数据到一个串口设备的函数。其中定义了一个结构体`rcv_protocol`,表示要发送的数据包的协议格式。在函数中,先将收发协议的头和尾部分别赋值为0xAA和0xBB,然后将数据c赋值给`send_ata.date`字段,最后通过指针tmp_ptr将整个数据包转换成字节流形式,并输出到控制台进行调试。最后调用`voice_uart_send`函数将数据包发送出去。
阅读全文