/* * msp_30GM_UltraSonic.c * * Created on: Feb 25, 2025 * Author: bihon */ #include "msp_30GM_UltraSonic.h" #include "msp_Modbus_crc16.h" UART_HandleTypeDef* Huart_30GM; SP_MSP_30GM_Parameters* _UltraSonic_30GM; uint8_t GM_stas[7]; uint8_t Request_Cmd;//指令标志,0:无指令,1:瞬时距离,2:内部温度,3:飞行时间 void GF_30GM_Unscramble_Callback(); int16_t hex2dec(uint8_t highByte,uint8_t lowbyte); uint8_t GF_MSP_30GM_Init(UART_HandleTypeDef* huart,SP_MSP_30GM_Parameters* UltraSonic_30GM) { Huart_30GM = huart; GF_BSP_Interrupt_Add_CallBack(DF_BSP_InterCall_RS485_4_RxCpltCallback, GF_30GM_Unscramble_Callback); HAL_UART_Receive_IT(Huart_30GM,GM_stas,7); _UltraSonic_30GM = UltraSonic_30GM; return 1; } //查询超声波传感器瞬时距离值 void GF_MSP_30GM_Instance_Dist_Inquiry() { uint8_t Inquiry_Order[8]={0X01, 0X04, 0X00, 0X00, 0X00, 0X01, 0X31, 0XCA}; Request_Cmd = 1; GF_BSP_UART_Transmit(4, Inquiry_Order, 8); } //查询超声波传感器内部温度值 void GF_MSP_30GM_Inner_Temp_Inquiry() { uint8_t Inquiry_Order[8]={0X01, 0X04, 0X00, 0X01, 0X00, 0X01, 0X60, 0X0A}; Request_Cmd = 2; GF_BSP_UART_Transmit(4, Inquiry_Order, 8); } //查询超声波传感器飞行时间 void GF_MSP_30GM_Fly_Time_Inquiry() { uint8_t Inquiry_Order[8]={0X01, 0X04, 0X00, 0X02, 0X00, 0X01, 0X90, 0X0A}; Request_Cmd = 3; GF_BSP_UART_Transmit(4, Inquiry_Order, 8); } //超声波传感器返回数据解析 void GF_30GM_Unscramble_Callback() { uint16_t CRC_Check; CRC_Check = (GM_stas[5]<<8|GM_stas[6]); if(CRC_Check == ModBusCRC16(GM_stas, 5))//CRC校验正确 { switch(Request_Cmd) { case 0://无指令 HAL_UART_Receive_IT(Huart_30GM,GM_stas,7); break; case 1://瞬时距离值解析 //16进制数据转化为10进制数据 _UltraSonic_30GM->Inst_Distance = hex2dec(GM_stas[3],GM_stas[4]); Request_Cmd = 0;//指令标志置零 HAL_UART_Receive_IT(Huart_30GM,GM_stas,7);//开启串口接收 break; case 2://内部温度值解析 //16进制数据转化为10进制数据 _UltraSonic_30GM ->Inner_Temp = hex2dec(GM_stas[3],GM_stas[4]); Request_Cmd = 0;//指令标志置零 HAL_UART_Receive_IT(Huart_30GM,GM_stas,7);//开启串口接收 break; case 3://飞行时间解析 //16进制数据转化为10进制数据 _UltraSonic_30GM ->Fly_Time = hex2dec(GM_stas[3],GM_stas[4]); Request_Cmd = 0;//指令标志置零 HAL_UART_Receive_IT(Huart_30GM,GM_stas,7);//开启串口接收 break; default: Request_Cmd = 0;//指令标志置零 HAL_UART_Receive_IT(Huart_30GM,GM_stas,7);//开启串口接收 break; } }else { Request_Cmd = 0;//指令标志置零 HAL_UART_Receive_IT(Huart_30GM,GM_stas,7);//开启串口接收 } } //将两位8进制数转化为16进制数 int16_t hex2dec(uint8_t highByte,uint8_t lowbyte) { return (int16_t)((highByte<<8)|(lowbyte++)); }