单片机MODBUS通讯处理C语音代码

单片机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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mgg081

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值