A22-模组是一款基于机器人自动控制应用而设计的超声波避障传感器,
我使用的是RS485通讯协议
A22.C文件
#include "A22.h"
#include "usart.h"
#include "stdio.h"
#include "gpio.h"
uint8_t rxBuffer[RX_BUFFER_SIZE]; //接收缓冲区
uint8_t txBuffer[TX_BUFFER_SIZE]; //发送缓冲区
#define Send_data() HAL_UART_Transmit_IT(&huart3,txBuffer,8)
uint16_t Modbus_CRC_16_Processing(uint8_t *buff,uint8_t length){
unsigned short tmp = 0xffff;
unsigned short val = 0;
for(int n = 0; n < length; n++)
{
tmp = buff[n] ^ tmp;
// printf("异或数据为:%x\n",tmp);
for(int i = 0;i < 8;i++){ /*此处的8 -- 指每一个char类型又8bit,每bit都要处理*/
// printf("遍历层数为:%d\t\t最后一位的数为:%d",i*n, tmp & 0x01);
// printf("\t当前tmp为:%x\n",tmp );
if(tmp & 0x01){
tmp = tmp >> 1;
tmp = tmp ^ 0xa001;
}
else{
tmp = tmp >> 1;
}
}
// printf("第%d个数据通过crc16校验后为 %x\n",n,tmp);
}
/*将CRC校验的高低位对换位置*/
val = tmp >> 8;
val = val | (tmp << 8);
//printf("交换后为: %X\n",val);
return val;
}
/**
* @brief 处理
* @param[in] address :设备地址
* @param[in] funcode :功能码
# @param[in] modbus :Modbus寄存器地址
# @param[in] quantity:Modbus寄存器数量
*/
void Processing(uint8_t address,uint8_t funcode,uint16_t modbus,uint16_t quantity){
uint16_t temp=0;
txBuffer[0] = address;
txBuffer[1] = funcode;
txBuffer[2] = modbus >> 8;
txBuffer[3] = modbus & 0xFF;
txBuffer[4] = quantity >> 8;
txBuffer[5] = quantity &0xFF;
temp = Modbus_CRC_16_Processing(txBuffer,6);
txBuffer[6] = temp >> 8; //CRC高字节
txBuffer[7] = temp & 0xFF;
Send_data();
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
uint16_t sum;
uint16_t calculatedSum;
uint16_t data;
if(huart == &huart3){
//假设数据已经存放在rxBuffer中,长度为RX_BUFFER_SIZE
if(rxBuffer[0] == Device_address){//检查帧头是否为设备地址
sum = rxBuffer[5]<<8|rxBuffer[6];
calculatedSum = Modbus_CRC_16_Processing(rxBuffer,5);
if(sum == calculatedSum){//校验和正确
data=rxBuffer[3]<<8|rxBuffer[4];
// 使用 UART1 打印接收到的数据
printf("Received Data: %dmm\r\n", data); // 打印接收到的数据
}
else{
// 校验和不正确
printf("Checksum error!\n");
printf(" sum=%d calculated%d\r\n", sum,calculatedSum);
HAL_UART_Receive_IT(&huart3,rxBuffer,7);
}
}
else{
// 帧头不匹配
printf("Invalid frame header!\n");
HAL_UART_Receive_IT(&huart3,rxBuffer,7);
}
}
HAL_UART_Receive_IT(&huart3,rxBuffer,7);
}
#ifndef _A22_H_
#define _A22_H_
#include "main.h"
#define RX_BUFFER_SIZE 7 //假设接收缓冲区大小为10字节
#define TX_BUFFER_SIZE 8
#define Device_address 0x01 //设备地址
#define Write_function 0x06 //写功能码
#define Read_function 0x03 //读功能码
//寄存器数据为高字节在前,低字节在后
#define Processing_value_index 0x0100 //处理值地址
#define Real_value_index 0x0101 //实时值地址
#define Temperature_index 0x0102 //温度值地址
#define Echo_time_index 0x0103 //回波时间地址
void Processing(uint8_t address,uint8_t funcode,uint16_t modbus,uint16_t quantity);
uint16_t Modbus_CRC_16_Processing(uint8_t *buff,uint8_t length);
#endif