From 0224d3d45a970bba6d2310f8a401df8bbae55d26 Mon Sep 17 00:00:00 2001 From: zhyinch <zhyinch@gmail.com> Date: 星期二, 15 十二月 2020 10:41:28 +0800 Subject: [PATCH] V1.40 增加1fff重置时间,开机就变成0x1ffff --- 源码/核心板/Src/application/modbus.c | 70 +++++++++++++++++++---------------- 1 files changed, 38 insertions(+), 32 deletions(-) diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/modbus.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/modbus.c" index a0ed72f..014df59 100644 --- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/modbus.c" +++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/modbus.c" @@ -1,9 +1,10 @@ #include "modbus.h" #include "Rcc_Nvic_Systick.h" +#include "global_param.h" /////////////////////////////////////////////////////////// //u32 RS485_Baudrate=9600;//通讯波特率 //u8 RS485_Parity=0;//0无校验;1奇校验;2偶校验 -u8 RS485_Addr=1;//从机地址 +u8 RS485_Addr=2;//从机地址 //u16 RS485_Frame_Distance=4;//数据帧最小间隔(ms),超过此时间则认为是下一帧 u8 cmd_mode = 0; @@ -24,9 +25,11 @@ void Modbus_RegMap(void) { u16 i; - for(i=0;i<MODBUS_SIZE;i++) + //RS485_Addr=g_com_map[DEV_ID]; + for(i=0;i<MODBUS_SIZE/2;i++) { - Modbus_HoldReg[i]=i; + Modbus_HoldReg[2*i]=1; + Modbus_HoldReg[2*i+1]=0xffff; } //输入开关量寄存器指针指向 // Modbus_InputIO[0]=(vu32*)&PEin(4);//KEY0 //&PEin(4):取PE4的地址,(vu32*)&PEin(4)将PE4地址强制转换为uw32类型的地址,Modbus_InputIO[0]=(vu32*)&PEin(4); 将转换好的地址送给地址指针Modbus_InputIO[0]; @@ -184,19 +187,22 @@ //发送n个字节数据 //buff:发送区首地址 //len:发送的字节数 -void RS485_SendData(u8 *buff,u8 len) -{ - RS485_TX_ON;//切换为发送模式 - delay_us(100); - while(len--) - { - while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送区为空 - USART_SendData(USART1,*(buff++)); - } - while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//等待发送完成 - RS485_TX_OFF;//开启接收模式 - delay_us(100); -} +//void RS485_SendData(u8 *buff,u8 len) +//{ +// RS485_TX_ON;//切换为发送模式 +// #ifdef BAUDRATE_19200 +// delay_ms(5); +// #else +// delay_ms(1); +// #endif +// while(len--) +// { +// while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//等待发送区为空 +// USART_SendData(USART1,*(buff++)); +// } +// while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//等待发送完成 +// RS485_TX_OFF;//开启接收模式 +//} ///////////////////////////////////////////////////////////////////////////////////// @@ -324,7 +330,7 @@ RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x04; //异常码 - RS485_SendData(RS485_TX_BUFF,3); + UART_PushFrame(RS485_TX_BUFF,3); cmd_mode = 0;//协议处理完成 } } @@ -333,7 +339,7 @@ RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //异常码 - RS485_SendData(RS485_TX_BUFF,3); + UART_PushFrame(RS485_TX_BUFF,3); cmd_mode = 0;//协议处理完成 } } @@ -342,7 +348,7 @@ RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x01; //异常码 - RS485_SendData(RS485_TX_BUFF,3); + UART_PushFrame(RS485_TX_BUFF,3); cmd_mode = 0;//协议处理完成 } } @@ -380,14 +386,14 @@ calCRC=CRC_Compute(RS485_TX_BUFF,ByteNum+3); RS485_TX_BUFF[ByteNum+3]=(calCRC>>8)&0xFF; RS485_TX_BUFF[ByteNum+4]=(calCRC)&0xFF; - RS485_SendData(RS485_TX_BUFF,ByteNum+5); + UART_PushFrame(RS485_TX_BUFF,ByteNum+5); } else//寄存器地址+数量超出范围 { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //异常码 - RS485_SendData(RS485_TX_BUFF,3); + UART_PushFrame(RS485_TX_BUFF,3); } } @@ -418,14 +424,14 @@ calCRC=CRC_Compute(RS485_TX_BUFF,ByteNum+3); RS485_TX_BUFF[ByteNum+3]=(calCRC>>8)&0xFF; RS485_TX_BUFF[ByteNum+4]=(calCRC)&0xFF; - RS485_SendData(RS485_TX_BUFF,ByteNum+5); + UART_PushFrame(RS485_TX_BUFF,ByteNum+5); } else//寄存器地址+数量超出范围 { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //异常码 - RS485_SendData(RS485_TX_BUFF,3); + UART_PushFrame(RS485_TX_BUFF,3); } } @@ -448,14 +454,14 @@ calCRC=CRC_Compute(RS485_TX_BUFF,6); RS485_TX_BUFF[6]=(calCRC>>8)&0xFF; RS485_TX_BUFF[7]=(calCRC)&0xFF; - RS485_SendData(RS485_TX_BUFF,8); + UART_PushFrame(RS485_TX_BUFF,8); } else//寄存器地址超出范围 { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //异常码 - RS485_SendData(RS485_TX_BUFF,3); + UART_PushFrame(RS485_TX_BUFF,3); } } @@ -483,14 +489,14 @@ calCRC=CRC_Compute(RS485_TX_BUFF,6); RS485_TX_BUFF[6]=(calCRC>>8)&0xFF; RS485_TX_BUFF[7]=(calCRC)&0xFF; - RS485_SendData(RS485_TX_BUFF,8); + UART_PushFrame(RS485_TX_BUFF,8); } else//寄存器地址+数量超出范围 { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //异常码 - RS485_SendData(RS485_TX_BUFF,3); + UART_PushFrame(RS485_TX_BUFF,3); } } @@ -513,14 +519,14 @@ calCRC=CRC_Compute(RS485_TX_BUFF,RegNum*2+3); RS485_TX_BUFF[RegNum*2+3]=(calCRC>>8)&0xFF; //CRC高地位不对吗? // 先高后低 RS485_TX_BUFF[RegNum*2+4]=(calCRC)&0xFF; - RS485_SendData(RS485_TX_BUFF,RegNum*2+5); + UART_PushFrame(RS485_TX_BUFF,RegNum*2+5); } else//寄存器地址+数量超出范围 { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //异常码 - RS485_SendData(RS485_TX_BUFF,3); + UART_PushFrame(RS485_TX_BUFF,3); } } @@ -542,7 +548,7 @@ calCRC=CRC_Compute(RS485_TX_BUFF,6); RS485_TX_BUFF[6]=(calCRC>>8)&0xFF; RS485_TX_BUFF[7]=(calCRC)&0xFF; - RS485_SendData(RS485_TX_BUFF,8); + UART_PushFrame(RS485_TX_BUFF,8); } //Modbus功能码16处理程序 /////////////////////////////////////////////////////////////////////////////////////////////////已验证程序OK @@ -569,14 +575,14 @@ calCRC=CRC_Compute(RS485_TX_BUFF,6); RS485_TX_BUFF[6]=(calCRC>>8)&0xFF; RS485_TX_BUFF[7]=(calCRC)&0xFF; - RS485_SendData(RS485_TX_BUFF,8); + UART_PushFrame(RS485_TX_BUFF,8); } else//寄存器地址+数量超出范围 { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //异常码 - RS485_SendData(RS485_TX_BUFF,3); + UART_PushFrame(RS485_TX_BUFF,3); } } -- Gitblit v1.9.3