芯片解密STM8 RS485的modbus通迅(主机及从机)程序代码
芯片解密stm8单片机源程序(从机)如下:
- /* Includes ------------------------------------------------------------------*/
- 芯片解密v#include "stm8s_lib.h"
- 芯片解密#include "functions.h"
- //#include "STM8S103F.h"
- #include "stm8s_tim1.h"
- /* Private typedef -----------------------------------------------------------*/
- /* Private define ------------------------------------------------------------*/
- u16 re_CRC16;
- u8 CRC_Len;
- u8 Data_Len;
- u8 OffsetAdr;
- u8 SlaveAdr;
- u8 ModbusFC;
- ModBusData ModbusRAM[ModBusRAM_LEN_MAX];
- void Respond_ModbusREQ(void);
- void Init_Clock(void);
- /*
- void Init_GPIO(void);
- void Init_GPIO(void)
- {
- GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); //UART1 RX
- GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); //UART1 TX
- }
- */
- void Init_Clock(void)//
- {
- /* Select fCPU = 16MHz*/
- CLK_DeInit();
- CLK_HSICmd(ENABLE);
- CLK_HSECmd(DISABLE);
- CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);//CLK_PRESCALER_CPUDIV1 16mhz
- nop();nop();nop();nop();nop();nop();
- //CLK_CCOConfig(CLK_OUTPUT_CPU); /* For test purpose output Fcpu on MCO pin */
- }
- /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
- void Respond_ModbusREQ(void)
- {
- u8 tmpMODBUS[RX_LEN_MAX];
- u8 i;
-
- ModbusFC = MODBUS[1];
- Data_Len = MODBUS[5];
-
- switch(ModbusFC)
- {
- case 0x03:
- i = 8;
- break;
-
- case 0x10:
- i = (u8)(9 + (Data_Len * 2));
- break;
-
- default:
- i = 0;
- break;
- }
- if(i>0)
- {
- CRC_Len = (u8)(i - 2);
-
- while(i>0)
- {
- tmpMODBUS[i-1] = MODBUS[i-1];
- i--;
- }
-
- re_CRC16 = tmpMODBUS[CRC_Len + 1];
- re_CRC16 = (re_CRC16<<8)+tmpMODBUS[CRC_Len]; //寻找接收的CRC码
- CRC16 = crc16(tmpMODBUS,CRC_Len); //计算接收数据的CRC
- if((re_CRC16 == CRC16)&&(OffsetAdr<ModBusRAM_LEN_MAX))//如果校验正确 判断功能码和数据起始地址
- {
- OffsetAdr = (u8)((tmpMODBUS[3]) * 2); //OffsetAdr = tmpMODBUS[2] * 256 + tmpMODBUS[3];
- Data_Len = (u8)(tmpMODBUS[5] * 2); //读写寄存器数量
- switch(ModbusFC)
- {
- case 0x03: //判断功能码响应指令 发送被召唤数据
- {
- //if(tmpMODBUS[3] == 0x01)
- // {
- tmpMODBUS[2] = Data_Len; //字节数=寄存器数量*2
- for(i=0;i<Data_Len;i++)
- {
- if(i & 0x01)
- tmpMODBUS[3 + i] = (u8)(ModbusRAM[((OffsetAdr+i)>>1)].ModBus16Word % 0x100);
- else
- tmpMODBUS[3 + i] = (u8)(ModbusRAM[((OffsetAdr+i)>>1)].ModBus16Word / 0x100);
- }
-
- CRC_Len = (u8)(3 + Data_Len);
- CRC16 = crc16(tmpMODBUS,CRC_Len); //计算接收数据的CRC
- tmpMODBUS[CRC_Len]=(u8)(CRC16); //LSB
- tmpMODBUS[CRC_Len+1]=(u8)(CRC16>>8); //MSB
- SEND_ON
- for(i=0;i<CRC_Len+2;i++) //发送应答数据 多寄存器读命令返回
- {
- UART1->DR=tmpMODBUS[i];
- while (UART1_GetFlagStatus(UART1_FLAG_TXE) == RESET); //
- }

芯片解密