单片机MODBUS通讯处理C语音代码
提供参考思路,不足之处请留言指正
#include "BSP_uart.h"
#include "flash_rw.h"
#include "main.h"
#include "cmsis_os.h"
__IO uint8_t uart1_rx_counter;
// uint8_t uart1_receive_len_max=32;
uart1_data uart1_rx_buffer;
uart2_data uart2_rx_buffer;
uint8_t uart1_receive_flag = 0;
__IO uint8_t uart2_rx_counter = 0;
// void hal_debug_printf(const char *fmt, ...) //调试打印信息 484打印
//{
// uint8_t length;
// memset(uart2_tx_buffer,0,uart2_send_len_max);
// va_list ap;
// va_start(ap,fmt);
// vsprintf((char*)uart2_tx_buffer,fmt,ap);
// va_end(ap);
// length=strlen((const char*)uart2_tx_buffer);
// hal_uart2_send((uint8_t *)uart2_tx_buffer,length);
//}
void CHARToHexString(uint8_t *buf, uint8_t len, uint8_t *out)
{
#define IntToASCII(c) (c) > 9 ? ((c) + 0x37) : ((c) + 0x30);
char temp;
int i = 0;
for (i = 0; i < len; i++)
{
temp = buf[i] & 0xf0;
out[2 * i + 0] = IntToASCII(temp >> 4);
temp = buf[i] & 0x0f;
out[2 * i + 1] = IntToASCII(temp);
// /* space */
// out[3 * i + 2] = 0x20;
}
}
// void hal_uart1_printf(const char *fmt, ...) //串口1打印函数
//{
//
// unsigned int length;
// memset(uart1_tx_buffer,0,uart1_send_len_max);
// va_list ap;
// va_start(ap,fmt);
// vsprintf(uart1_tx_buffer,fmt,ap);
// va_end(ap);
//
// length=strlen((const char*)uart1_tx_buffer);
// HAL_UART_Transmit(&huart1, (uint8_t *)uart1_tx_buffer, length, 100);
// }
void hal_uart1_send(uint8_t *data) // 串口发送数据
{
unsigned int length;
length = strlen((const char *)data);
HAL_UART_Transmit(&huart1, (uint8_t *)data, length, 100);
}
void hal_uart1_485_send(uint8_t *data, uint8_t length)
{
HAL_GPIO_WritePin(UART2_485_RT_GPIO_Port, UART2_485_RT_Pin, GPIO_PIN_SET);
HAL_UART_Transmit(&huart2, (uint8_t *)data, length, 100);
HAL_GPIO_WritePin(UART2_485_RT_GPIO_Port, UART2_485_RT_Pin, GPIO_PIN_RESET);
}
void hal_uart2_485_send(uint8_t *data, uint8_t length) // 串口发送数据
{
HAL_GPIO_WritePin(UART1_485_RE_GPIO_Port, UART1_485_RE_Pin, GPIO_PIN_SET);
HAL_UART_Transmit(&huart1, (uint8_t *)data, length, 100);
HAL_GPIO_WritePin(UART1_485_RE_GPIO_Port, UART1_485_RE_Pin, GPIO_PIN_RESET);
}
/****************通信处理************************************************************************/
//*****************modbus程序处理****************************************************
uint16_t GetCrcData(uint8_t *buffer, uint8_t len)
{
uint16_t wcrc = 0XFFFF; // 16位crc寄存器预置
uint8_t temp;
uint8_t i = 0, j = 0; // 计数
uint8_t CRC_L; // 定义数组
uint8_t CRC_H;
for (i = 0; i < len; i++) // 循环计算每个数据
{
temp = *buffer & 0X00FF; // 将八位数据与crc寄存器亦或
buffer++; // 指针地址增加,指向下个数据
wcrc ^= temp; // 将数据存入crc寄存器
for (j = 0; j < 8; j++) // 循环计算数据的
{
if (wcrc & 0X0001) // 判断右移出的是不是1,如果是1则与多项式进行异或。
{
wcrc >>= 1; // 先将数据右移一位
wcrc ^= 0XA001; // 与上面的多项式进行异或
}
else // 如果不是1,则直接移出
{
wcrc >>= 1; // 直接移出
}
}
}
CRC_L = wcrc & 0xff; // crc的低八位
CRC_H = wcrc >> 8; // crc的高八位
return ((CRC_L << 8) | CRC_H);
}
u8 sum(uint8_t *buffer, uint8_t len)
{
uint8_t sumTemp = 0;
for (uint8_t i = 0; i < len; i++)
{
sumTemp += buffer[i];
}
return sumTemp;
}
uint8_t myadd = 0x01;
uint8_t bcd_decimal_code(uint8_t decimal)
{
return (decimal + (decimal / 10) * 6);
}
uint8_t decimal_bcd_code(uint8_t BCD)
{
return (BCD - (BCD >> 4) * 6);
}
u16 decimal_bcd2byte_code(uint16_t BCD_H, uint16_t BCD_L)
{
u16 temp;
temp = decimal_bcd_code(BCD_H) * 100 + decimal_bcd_code(BCD_L);
return temp;
}
uint16_t bcd_decimal2byte_code(uint16_t decimal_h)
{
u16 temp;
temp = bcd_decimal_code(decimal_h / 100);
temp <<= 8;
temp += bcd_decimal_code(decimal_h % 100);
return temp;
}
/*
if(osMutexWait(myMutex01Handle,osWaitForever)==osOK)
{
printf("2");
printf("3");
printf("4");
osMutexRelease(myMutex01Handle);
}
*/
extern osMutexId_t myMutex01Handle;
void u1_read_devices(uint8_t add, uint16_t reg)
{
uint8_t sendtemp[9];
uint16_t crc;
if (osMutexWait(myMutex01Handle, osWaitForever) == osOK)
{
sendtemp[0] = add;
sendtemp[1] = 3;
sendtemp[2] = 2; // 数据长度
sendtemp[3] = reg & 0xff;
sendtemp[4] = reg >> 8;
// keyN.reg=reg;
crc = GetCrcData(sendtemp, 5);
sendtemp[5] = crc >> 8;
sendtemp[6] = crc & 0xff;
hal_uart1_485_send(sendtemp, 7);
osDelay(200);
osMutexRelease(myMutex01Handle);
}
}
// void u1_sendRead(uint8_t add,uint16_t reg ,uint16_t val)
//{
// uint8_t sendtemp[9];
// uint16_t crc;
// if(osMutexWait(myMutex01Handle,osWaitForever)==osOK)
// {
// sendtemp[0]=add;
// sendtemp[1]=3;
// sendtemp[2]=4;//数据长度
// sendtemp[3]=reg&0xff;
// sendtemp[4]=reg>>8;
// sendtemp[5]=val&0xff;
// sendtemp[6]=val>>8;
// // keyN.reg=reg;
// crc=GetCrcData(sendtemp,7);
// sendtemp[7]=crc>>8;
// sendtemp[8]=crc&0xff;
// hal_uart1_485_send(sendtemp, 9) ;
// osDelay(100);
// osMutexRelease(myMutex01Handle);
//
//
// }
//}
void u1_sendWrite(uint8_t add, uint16_t reg, uint16_t val)
{
if (osMutexWait(myMutex01Handle, osWaitForever) == osOK)
{
uint8_t sendtemp[9];
uint16_t crc;
sendtemp[0] = add;
sendtemp[1] = 6;
sendtemp[2] = 4;
sendtemp[3] = reg & 0xff;
sendtemp[4] = reg >> 8;
sendtemp[5] = val & 0xff;
sendtemp[6] = val >> 8;
// keyN.reg=reg;
crc = GetCrcData(sendtemp, 7);
sendtemp[7] = crc >> 8;
sendtemp[8] = crc & 0xff;
hal_uart1_485_send(sendtemp, 9);
osDelay(200);
osMutexRelease(myMutex01Handle);
}
}
// #define USART1_Sned_Char_Buff(x,y) HAL_UART_Transmit(&huart2, x, y, 100)
_system_reg devices[3];
void uart1_JieXi()
{
uint16_t crc;
if (uart1_receive_flag)
{
uart1_receive_flag = 0;
if (uart1_rx_buffer.addr <= 3)
{
if (uart1_rx_buffer.len >= 30 || uart1_rx_buffer.len < 2)
return;
crc = uart1_rx_buffer.val.vals[uart1_rx_buffer.len - 2];
crc <<= 8;
crc |= uart1_rx_buffer.val.vals[uart1_rx_buffer.len - 1];
if (GetCrcData((uint8_t *)&uart1_rx_buffer, uart1_rx_buffer.len + 3) == crc) // crc校验成功 通讯
{
uart1_rx_buffer.addr--;
switch (uart1_rx_buffer.cmd)
{
case 3:
switch (uart1_rx_buffer.reg)
{
case type_dianYa_dangQian:
devices[uart1_rx_buffer.addr].dianYa_dangQian = uart1_rx_buffer.val.u16_val;
break;
case type_shezhi_dianYa:
devices[uart1_rx_buffer.addr].shezhi_dianYa = uart1_rx_buffer.val.u16_val;
break;
case type_dianLiu_dangQian:
devices[uart1_rx_buffer.addr].dianLiu_dangQian = uart1_rx_buffer.val.u16_val;
break;
case type_shezhi_dianLiu:
devices[uart1_rx_buffer.addr].shezhi_dianLiu = uart1_rx_buffer.val.u16_val;
break;
case type_dianYa_k:
devices[uart1_rx_buffer.addr].dianYa_k = uart1_rx_buffer.val.u16_val;
break;
case type_dianLiu_k:
devices[uart1_rx_buffer.addr].dianLiu_k = uart1_rx_buffer.val.u16_val;
break;
case type_biaoZhun_dianYa:
devices[uart1_rx_buffer.addr].biaoZhun_dianYa = uart1_rx_buffer.val.u16_val;
break;
case type_biaoZhun_dianLiu:
devices[uart1_rx_buffer.addr].biaoZhun_dianLiu = uart1_rx_buffer.val.u16_val;
break;
case type_lingDian_dianYaAD:
devices[uart1_rx_buffer.addr].lingDian_dianYaAD = uart1_rx_buffer.val.u16_val;
break;
case type_lingDian_dianLiuAD:
devices[uart1_rx_buffer.addr].lingDian_dianLiuAD = uart1_rx_buffer.val.u16_val;
break;
case type_pinLv:
devices[uart1_rx_buffer.addr].pinLv = uart1_rx_buffer.val.u16_val;
break;
case type_xiangWei:
devices[uart1_rx_buffer.addr].xiangWei = uart1_rx_buffer.val.u16_val;
break;
case type_qiTing:
devices[uart1_rx_buffer.addr].qiTing = uart1_rx_buffer.val.u16_val;
break;
case type_dianYa_xiangWei:
devices[uart1_rx_buffer.addr].dianYa_xiangWei = uart1_rx_buffer.val.u16_val;
// {
// for(int s=0;s<72;s++)
// {
//
// arm_sin_cos_f32(s*2.5,&sintemp,&costemp);
// dmabuff3[s]= dmabuff1[s]=sintemp*4500;
// dmabuff3[s+72]=dmabuff1[s+72]=0;
//
// dmabuff4[s+72]= dmabuff2[s+72]=sintemp*4500;
// dmabuff4[s]=dmabuff2[s]=0;
//
//
// }
//
// }
break;
case type_dianLiu_xiangWei:
devices[uart1_rx_buffer.addr].dianLiu_xiangWei = uart1_rx_buffer.val.u16_val;
break;
//**********电流标定数据读取************************************************************
case type_dianLiu_zhenShi_1:
case type_dianLiu_zhenShi_2:
case type_dianLiu_zhenShi_3:
case type_dianLiu_zhenShi_4:
case type_dianLiu_zhenShi_5:
case type_dianLiu_zhenShi_6:
case type_dianLiu_zhenShi_7:
case type_dianLiu_zhenShi_8:
case type_dianLiu_zhenShi_9:
case type_dianLiu_zhenShi_10:
case type_dianLiu_zhenShi_11:
case type_dianLiu_zhenShi_12:
case type_dianLiu_zhenShi_13:
case type_dianLiu_zhenShi_14:
case type_dianLiu_zhenShi_15:
case type_dianLiu_zhenShi_16:
// sendRead(uart1_rx_buffer.reg,biaoding_dianLiu[uart1_rx_buffer.reg-type_dianLiu_zhenShi_1].zhen1);
break;
//**********电压标定数据读取************************************************************
case type_dianYa_zhenShi_1:
case type_dianYa_zhenShi_2:
case type_dianYa_zhenShi_3:
case type_dianYa_zhenShi_4:
case type_dianYa_zhenShi_5:
case type_dianYa_zhenShi_6:
case type_dianYa_zhenShi_7:
case type_dianYa_zhenShi_8:
case type_dianYa_zhenShi_9:
case type_dianYa_zhenShi_10:
case type_dianYa_zhenShi_11:
case type_dianYa_zhenShi_12:
case type_dianYa_zhenShi_13:
case type_dianYa_zhenShi_14:
case type_dianYa_zhenShi_15:
case type_dianYa_zhenShi_16:
// sendRead(uart1_rx_buffer.reg,biaoding_dianYa[uart1_rx_buffer.reg-type_dianYa_zhenShi_1].zhen1);
break;
}
break;
case 6:
switch (uart1_rx_buffer.reg)
{
case type_shezhi_dianYa:
devices[uart1_rx_buffer.addr].shezhi_dianYa = uart1_rx_buffer.val.u16_val;
break;
case type_shezhi_dianLiu:
devices[uart1_rx_buffer.addr].shezhi_dianLiu = uart1_rx_buffer.val.u16_val;
// Test_Write(add_xt_setDianLiu,sysset.shezhi_dianLiu);
break;
case type_dianYa_k:
devices[uart1_rx_buffer.addr].dianYa_k = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
// set_XiangWei_DianYa(sysset.dianYa_k);
//
// Flash_Write_u32(add_xt_dianYa_K,sysset.dianYa_k);
break;
case type_dianLiu_k:
devices[uart1_rx_buffer.addr].dianLiu_k = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
if (devices[uart1_rx_buffer.addr].dianLiu_k > 3600)
devices[uart1_rx_buffer.addr].dianLiu_k = 3600;
break;
case type_biaoZhun_dianYa:
devices[uart1_rx_buffer.addr].biaoZhun_dianYa = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
// Flash_Write_u32(add_xt_biaoZhun_dianYa,sysset.biaoZhun_dianYa);
// XTset_biaoZhun_dianYa_respond(sysset.biaoZhun_dianYa);
// set_XiangWei_DianYa(sysset.dianYa_k+sysset.biaoZhun_dianYa);
break;
case type_biaoZhun_dianLiu:
devices[uart1_rx_buffer.addr].biaoZhun_dianLiu = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
// Test_Write(add_xt_biaoZhun_dianLiu,sysset.biaoZhun_dianLiu);
// XTset_biaoZhun_dianLiu_respond(sysset.biaoZhun_dianLiu);
break;
case type_lingDian_dianYaAD:
devices[uart1_rx_buffer.addr].lingDian_dianYaAD = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
break;
case type_lingDian_dianLiuAD:
devices[uart1_rx_buffer.addr].lingDian_dianLiuAD = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
break;
case type_pinLv:
devices[uart1_rx_buffer.addr].pinLv = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
break;
case type_xiangWei:
devices[uart1_rx_buffer.addr].xiangWei = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
break;
case type_qiTing:
devices[uart1_rx_buffer.addr].qiTing = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
case type_dianYa_xiangWei:
devices[uart1_rx_buffer.addr].dianYa_xiangWei = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
break;
case type_dianLiu_xiangWei:
devices[uart1_rx_buffer.addr].dianLiu_xiangWei = uart1_rx_buffer.len == 6 ? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
break;
//**********电流标定****************************************************
/*
type_dianLiu_zhenShi_1=16,
type_dianLiu_AD_1,
add_xt_dianLiu_biaoDing_1
add_xt_dianLiu_biaoDing_1_ad */
case type_dianLiu_zhenShi_1:
case type_dianLiu_zhenShi_2:
case type_dianLiu_zhenShi_3:
case type_dianLiu_zhenShi_4:
case type_dianLiu_zhenShi_5:
case type_dianLiu_zhenShi_6:
case type_dianLiu_zhenShi_7:
case type_dianLiu_zhenShi_8:
case type_dianLiu_zhenShi_9:
case type_dianLiu_zhenShi_10:
case type_dianLiu_zhenShi_11:
case type_dianLiu_zhenShi_12:
case type_dianLiu_zhenShi_13:
case type_dianLiu_zhenShi_14:
case type_dianLiu_zhenShi_15:
case type_dianLiu_zhenShi_16:
// biaoding_dianLiu[uart1_rx_buffer.reg-type_dianLiu_zhenShi_1].zhen1=uart1_rx_buffer.len==6? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
// biaoding_dianLiu[uart1_rx_buffer.reg-type_dianLiu_zhenShi_1].zhen1_ad=sysset.dianLiu_yuanShi;
break;
//**********电压标定****************************************************
case type_dianYa_zhenShi_1:
case type_dianYa_zhenShi_2:
case type_dianYa_zhenShi_3:
case type_dianYa_zhenShi_4:
case type_dianYa_zhenShi_5:
case type_dianYa_zhenShi_6:
case type_dianYa_zhenShi_7:
case type_dianYa_zhenShi_8:
case type_dianYa_zhenShi_9:
case type_dianYa_zhenShi_10:
case type_dianYa_zhenShi_11:
case type_dianYa_zhenShi_12:
case type_dianYa_zhenShi_13:
case type_dianYa_zhenShi_14:
case type_dianYa_zhenShi_15:
case type_dianYa_zhenShi_16:
// biaoding_dianYa[uart1_rx_buffer.reg-type_dianYa_zhenShi_1].zhen1=uart1_rx_buffer.len==6? uart1_rx_buffer.val.u32_val : uart1_rx_buffer.val.u16_val;
// biaoding_dianYa[uart1_rx_buffer.reg-type_dianYa_zhenShi_1].zhen1_ad=sysset.dianYa_yuanShi;
break;
}
break;
}
}
}
}
}
uint8_t jiaoYanHe(uint8_t *rev, uint8_t len)
{
uint8_t add = 0;
for (uint8_t i = 0; i < len; i++)
{
add += rev[i];
}
return add;
}