【自用】A22-模组

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值