zhyinch
2022-08-03 9105bf90e4dca008221da442e8077bf4040292bb
Ô´Âë/ºËÐİå/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);
        }
}
@@ -507,20 +512,26 @@
                RS485_TX_BUFF[2]=RegNum*2;
                for(i=0;i<RegNum;i++)
                {
                           if(startRegAddr<100)
                           {
                        RS485_TX_BUFF[3+i*2]=(Modbus_HoldReg[startRegAddr+i]>>8)&0xFF;//           /////////先发送高字节--在发送低字节
                        RS485_TX_BUFF[4+i*2]=(Modbus_HoldReg[startRegAddr+i])&0xFF; //
                           }else{
                                    RS485_TX_BUFF[3+i*2]=(g_com_map[startRegAddr+i-100]>>8)&0xFF;//           /////////先发送高字节--在发送低字节
                        RS485_TX_BUFF[4+i*2]=(g_com_map[startRegAddr+i-100])&0xFF; //
                           }
                }
                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);
        }
}
@@ -529,9 +540,19 @@
//写单个保持寄存器
void Modbus_06_Solve(void)
{
   if(startRegAddr>100)
   {
      if(startRegAddr<600)
      {
         g_com_map[startRegAddr-100]=RS485_RX_BUFF[4]<<8|RS485_RX_BUFF[5];
      }
                            save_com_map_to_flash();
                     delay_ms(500);
                     SCB->AIRCR = 0X05FA0000|(unsigned int)0x04; //软复位回到bootloader
   }else{
        Modbus_HoldReg[startRegAddr]=RS485_RX_BUFF[4]<<8;//高字节在前                    ////////修改为高字节在前,低字节在后
        Modbus_HoldReg[startRegAddr]|=((u16)RS485_RX_BUFF[5]);//低字节在后
    }
        RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
        RS485_TX_BUFF[1]=RS485_RX_BUFF[1];
        RS485_TX_BUFF[2]=RS485_RX_BUFF[2];
@@ -542,7 +563,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 +590,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);
        }
}