zhyinch
2020-09-06 e3dedf3cc3d29191937ba908d1cee233eb0adb2d
Ô´Âë/ºËÐİå/Src/application/modbus.c
@@ -1,5 +1,6 @@
#include "modbus.h"
#include "Rcc_Nvic_Systick.h"
#include "global_param.h"
///////////////////////////////////////////////////////////
//u32 RS485_Baudrate=9600;//通讯波特率
//u8 RS485_Parity=0;//0无校验;1奇校验;2偶校验
@@ -24,6 +25,7 @@
void Modbus_RegMap(void)
{
   u16 i;
   RS485_Addr=g_com_map[DEV_ID];
   for(i=0;i<MODBUS_SIZE;i++)
   {
      Modbus_HoldReg[i]=i;
@@ -184,19 +186,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 +329,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 +338,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 +347,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 +385,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 +423,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 +453,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 +488,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 +518,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 +547,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 +574,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);
        }
}