找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4551|回复: 2
收起左侧

STM32 Modbus RTU Master slave源程序sth11驱动

[复制链接]
ID:558219 发表于 2019-6-9 15:29 | 显示全部楼层 |阅读模式
STM32 KEIL编写 Modbus RTU Master slave程序源码

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #include "modbus.h"
  3. #include "Init_Config.h"
  4. // Mudbus 功能码
  5. #define ReadCoilSta                0x01                // 读位COIL,对应PLC的DO状态
  6. #define ReadHoldReg                0x03                // 读字,对应PLC的AO状态
  7. #define ForceSingleCoil 0x05                // 写位,只写一位COIL,对应PLC的DO输出
  8. #define PresetSingleReg        0x06            // 写字,对单一寄存器赋值,对应PLC的AO输出
  9. #define SlaveID 0x01                                // 从机ID号
  10. unsigned int crc16(unsigned char* puchMsg,unsigned char usDataLen);
  11. unsigned char  n=17,c[17]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
  12. // 变量声明
  13. // 保存接收与发送消息的数组
  14. unsigned char        aRxBuff[8];                    // 接收缓冲区
  15. unsigned char        aTxBuff[17];                // 发送缓冲区
  16. volatile unsigned char        nTxBuff = 0;                        // 发送计数
  17. unsigned char   CommIndex=0;                                // 数据位置索引,从0开始,到CommIndexEnd结束
  18. unsigned char   CommIndexEnd=7;                // 接收长度
  19. unsigned char   RecFinishF=0;                                // 是否接收完成标志
  20. unsigned long        RecTimer=0;                                // 通信间隔时间
  21. unsigned char         FreOneH=0x00;                                        //变频器一高位
  22. unsigned char         FreOneL=0x00;
  23. unsigned char         FreTwoH=0x00;                                        //变频器二高位
  24. unsigned char         FreTwoL=0x00;
  25. unsigned char         Run=0x00;                                        //启动
  26. unsigned char         Stop=0x00;                                        //停止
  27. unsigned char         FrePOne=0x00;                                        //点动变频器一
  28. unsigned char         FrePTwo=0x00;                                        //点动变频器二
  29. unsigned char         FrePROne=0x00;                                        //点加变频器一
  30. unsigned char         FrePDOne=0x00;                                        //减
  31. unsigned char         FrePRTwo=0x00;                                        //点加变频器二
  32. unsigned char         FrePDTwo=0x00;                                        //减
  33. unsigned char         FreR=0x00;                                                //变频器统调加
  34. unsigned char         FreD=0x00;                                                //减
  35. /* Table Of CRC Values for high-order unsigned char */
  36. unsigned char auchCRCHi[] = {
  37. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
  38. 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  39. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
  40. 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
  41. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81,
  42. 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  43. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
  44. 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  45. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
  46. 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  47. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01,
  48. 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  49. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
  50. 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  51. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01,
  52. 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  53. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
  54. 0x40
  55. };

  56. /* Table of CRC values for low-order unsigned char    */
  57. unsigned char auchCRCLo[] = {
  58. 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
  59. 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
  60. 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
  61. 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
  62. 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
  63. 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
  64. 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE,
  65. 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
  66. 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
  67. 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
  68. 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB,
  69. 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
  70. 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
  71. 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
  72. 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88,
  73. 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
  74. 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
  75. 0x40
  76. };
  77. /*###############################################NO
  78. purpose:                        计算CRC16的值
  79. function name:                crc16
  80. return data:                unsigned int
  81. parameters:                        par1:
  82.                                                 name:                 puchMsg
  83.                                                 type:                 unsigned char*
  84.                                                 meaning:        将要计算CRC16值的
  85.                                                                         所有数据
  86.                                         par2:
  87.                                                 name:                usDataLen
  88.                                                 type:                unsigned char
  89.                                                 meaning:        将要计算CRC16值的
  90.                                                                         数据个数                                               
  91. finished time:                2007/5/16
  92. amended time:       
  93. NO###############################################*/


  94. unsigned int crc16(unsigned char* puchMsg,unsigned char usDataLen)
  95. {
  96. unsigned char uchCRCHi = 0xFF ;
  97.   unsigned char uchCRCLo = 0xFF ;
  98.   unsigned int  uIndex  ;
  99.    while (usDataLen--)
  100.      {
  101.         uIndex = uchCRCHi ^ *puchMsg++;
  102.         uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
  103.         uchCRCLo = auchCRCLo[uIndex] ;
  104.      }
  105.         return (((unsigned int)(uchCRCHi) << 8) | uchCRCLo) ;
  106. }

  107. void InitVar_my(void)
  108. {
  109.         RecFinishF=0;
  110.         CommIndex=0;
  111.         CommIndexEnd=7;  // First enlarge recieve lenght
  112.         RecTimer=0;                            
  113. }

  114. void ParseRecieve(void)         //包解析
  115. {
  116.   unsigned int  uIndex ;
  117.         unsigned int crc16tem;
  118.         unsigned char i = 0;
  119.         sendnum=1;
  120.                
  121.         if (aRxBuff[0] == SlaveID)  // 从机ID是否正确
  122.         {
  123.     crc16tem=((unsigned int)(aRxBuff[CommIndexEnd-1]) << 8) | aRxBuff[CommIndexEnd]; // calculate CRC check, erase two CRC byte
  124.     uIndex=crc16(aRxBuff,CommIndexEnd-1);
  125.     if (crc16tem==uIndex)// crc16检校正确
  126.                 {         
  127.                         switch (aRxBuff[1])                                // 判断功能码
  128.                         {
  129.                         case ReadCoilSta:                                 // 0x01
  130.                                 aTxBuff[0]=SlaveID;
  131.                                 aTxBuff[1]=ReadCoilSta;
  132.                                 aTxBuff[2]=0x01;   //字节数         
  133.                                 nTxBuff=4;
  134.                                 switch (aRxBuff[3])                         //判断起始地址
  135.                                 {
  136.                         /*        case 0x32:                   //画面0                                                                   
  137.                                   aTxBuff[3]=Run|Stop|PPback|PPfo|FrePOne|FrePTwo;
  138.                                   break;
  139.                                 case 0x3c:                             //画面1
  140.                                   aTxBuff[3]=TemR|TemD|SignSwD|SignSwS;
  141.                                   break;*/
  142.                                 case 0x46:                             //变频器设定
  143.                                   aTxBuff[3]=FrePROne|FrePDOne|FrePRTwo|FrePDTwo|FreR|FreD;
  144.                                   break;                       
  145.                                 }                         
  146.                                 crc16tem=crc16(aTxBuff,nTxBuff);
  147.                                 aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
  148.                                 aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
  149.                         /*        for(i = 0; i < nTxBuff+1; i++)
  150.                         {
  151.                               c[i]=aTxBuff[i];
  152.                                         }  */
  153. //                                USART1_Putc(c,n);
  154.                 USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
  155.                                 USART_SendData(USART1, aTxBuff[0]);  
  156.                            // sendnum=1;
  157.                                 break;       

  158.                         case ReadHoldReg:                                // 0x03                读取寄存器值
  159.                                 aTxBuff[0]=SlaveID;
  160.                                 aTxBuff[1]=ReadHoldReg;
  161.                                 aTxBuff[2]=aRxBuff[5]*2;                //每个数据占16位 要读的寄存器数量*2 相应的第3个字节
  162.                                 nTxBuff=3;
  163.                         /*        if(aRxBuff[3]==0x0a)
  164.                                  {
  165.                                    aTxBuff[nTxBuff++]=IntendDisH;                       
  166.                                    aTxBuff[nTxBuff++]=IntendDisL;                 //设定袋长
  167.                                    aTxBuff[nTxBuff++]=IntendNumH;                                                              
  168.                                    aTxBuff[nTxBuff++]=IntendNumL;                 //整本数设定
  169.                                    aTxBuff[nTxBuff++]=FailNumH;                                                              
  170.                                    aTxBuff[nTxBuff++]=FailNumL;                     //脱标次数
  171.                                       aTxBuff[nTxBuff++]=AutoRunH;                       
  172.                                    aTxBuff[nTxBuff++]=AutoRunL;                 //自启动时间                                                                    
  173.                                    aTxBuff[nTxBuff++]=IntendSignH;                       
  174.                                    aTxBuff[nTxBuff++]=IntendSignL;                 //追标长度                                  
  175.                                    aTxBuff[nTxBuff++]=TemH;                       
  176.                                    aTxBuff[nTxBuff++]=TemL;                     //切刀加温
  177.                                    crc16tem=crc16(aTxBuff,nTxBuff);
  178.                                    aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
  179.                                    aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
  180.                                    for(i = 0; i < nTxBuff+1; i++)
  181.                         {
  182.                               c[i]=aTxBuff[i];
  183.                                         }
  184. //                                   USART1_Putc(c,n);
  185.                                    USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
  186.                                    USART_SendData(USART1, aTxBuff[0]);  
  187.                                sendnum=1;
  188.                                  }
  189.                                 if(aRxBuff[3]==0x00)
  190.                                   {
  191.                                    aTxBuff[nTxBuff++]=RecNumH;                       
  192.                                    aTxBuff[nTxBuff++]=RecNumL;                     //计数
  193.                                       aTxBuff[nTxBuff++]=GroupH;                       
  194.                                    aTxBuff[nTxBuff++]=GroupL;                     //批次
  195.                                    aTxBuff[nTxBuff++]=IntendVelH;                       
  196.                                    aTxBuff[nTxBuff++]=IntendVelL;                 //速度
  197.                                    aTxBuff[nTxBuff++]=FreOneH;                       
  198.                                    aTxBuff[nTxBuff++]=FreOneL;                     //变频器一速度
  199.                                    aTxBuff[nTxBuff++]=TemH;                       
  200.                                    aTxBuff[nTxBuff++]=TemL;                         //切刀加热
  201.                                    aTxBuff[nTxBuff++]=FreTwoH;                       
  202.                                    aTxBuff[nTxBuff++]=FreTwoL;                     //变频器二速度
  203.                                   
  204.                                    crc16tem=crc16(aTxBuff,nTxBuff);
  205.                                    aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
  206.                                    aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
  207.                                    for(i = 0; i < nTxBuff+1; i++)
  208.                         {
  209.                               c[i]=aTxBuff[i];
  210.                                         }
  211. //                                   USART1_Putc(c,n);
  212.                                    USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
  213.                                    USART_SendData(USART1, aTxBuff[0]);  
  214.                                sendnum=1;
  215.                                   }

  216.                                   */
  217.                                   if(aRxBuff[3]==0x01)
  218.                                   {
  219.                                    aTxBuff[nTxBuff++]=0x01;                       
  220.                                    aTxBuff[nTxBuff++]=0x02;                      //温度高低
  221.                                       aTxBuff[nTxBuff++]=0x03;                       
  222.                                    aTxBuff[nTxBuff++]=0x04;                                  //湿度高低
  223.                                    crc16tem=crc16(aTxBuff,nTxBuff);                        //crc校验函数
  224.                                    aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
  225.                                    aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff); //生成校验码 高位加低位
  226.                         /*           for(i = 0; i < nTxBuff+1; i++)        //将相应数据发送出去
  227.                         {
  228.                               c[i]=aTxBuff[i];
  229.                                         }          */
  230.                                         for(i=0;i<9;i++)
  231.                                 {
  232.               USART_SendData(USART1,aTxBuff[i]);
  233.                                   while (!(USART1->SR & USART_FLAG_TXE));
  234.                              }
  235.                         //          USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
  236.                                 /*        USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
  237.                                         USART_Cmd(USART1, ENABLE);                                       
  238.                                         USART_SendData(USART1,aTxBuff[0]); */
  239.                                 //        sendnum=1;

  240.                                   }
  241.                                  if(aRxBuff[3]==0x14)
  242.                                  {                                  
  243.                                    aTxBuff[nTxBuff++]=FreOneH;                       
  244.                                    aTxBuff[nTxBuff++]=FreOneL;                     //变频器一
  245.                                       aTxBuff[nTxBuff++]=FreTwoH;                       
  246.                                    aTxBuff[nTxBuff++]=FreTwoL;                         //变频器二

  247.                                    crc16tem=crc16(aTxBuff,nTxBuff);
  248.                                    aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
  249.                                    aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
  250.                                    for(i = 0; i < nTxBuff+1; i++)
  251.                         {
  252.                               c[i]=aTxBuff[i];
  253.                                         }
  254. //                                   USART1_Putc(c,n);
  255.                                    USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
  256.                                    USART_SendData(USART1, aTxBuff[0]);  
  257.                              //  sendnum=1;
  258.                                  }
  259.                                 /* if(aRxBuff[3]==0x1e)
  260.                                  {                                  
  261.                                    aTxBuff[nTxBuff++]=IntendVelH;                       
  262.                                    aTxBuff[nTxBuff++]=IntendVelL;                 //送料速度
  263.                                       aTxBuff[nTxBuff++]=PluseNOH;                       
  264.                                    aTxBuff[nTxBuff++]=PluseNOL;                         //步进脉冲数
  265.                                    aTxBuff[nTxBuff++]=LineH;                       
  266.                                    aTxBuff[nTxBuff++]=LineL;                         //曲线选择
  267.                                    aTxBuff[nTxBuff++]=CheckH;                       
  268.                                    aTxBuff[nTxBuff++]=CheckL;                         //修轮
  269.                                    crc16tem=crc16(aTxBuff,11);
  270.                                    aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
  271.                                    aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
  272.                                    for(i =0; i <nTxBuff+1; i++)
  273.                         {
  274.                               c[i]=aTxBuff[i];
  275.                                         }
  276. //                                   USART1_Putc(c,n);
  277.                                    USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
  278.                                    USART_SendData(USART1, aTxBuff[0]);  
  279.                                sendnum=1;
  280.                                  } */
  281.                              break;

  282.                         case ForceSingleCoil:                                // 0x05
  283.                                 aTxBuff[0]=SlaveID;
  284.                                 aTxBuff[1]=ForceSingleCoil;       
  285.                                 aTxBuff[2]=aRxBuff[2];
  286.                                 aTxBuff[3]=aRxBuff[3];
  287.                                 nTxBuff=6;
  288.                                 switch (aRxBuff[3])                           //判断地址码
  289.                                 {
  290.                                 /*case  0x32:                                           //启动
  291.                                   if(aRxBuff[4] == 0x00)
  292.                                   {
  293.                                    aTxBuff[4]=0x00;
  294.                                    Run=0x00;                                                             
  295.                                    }               
  296.                                   else if(aRxBuff[4]==0xFF)
  297.                                   {
  298.                                     aTxBuff[4]=0xFF;
  299.                                         Run=0x01;
  300.                                         Stop=0x00;                                                                               
  301.                                    }
  302.                                    break;
  303.                                 case  0x33:                                           //停止
  304.                                   if(aRxBuff[4] == 0x00)
  305.                                   {
  306.                                    aTxBuff[4]=0x00;
  307.                                    Stop=0x00;
  308.                                                                                                
  309.                                    }
  310.                                   else if(aRxBuff[4]==0xFF)
  311.                                    {
  312.                                     aTxBuff[4]=0xFF;
  313.                                         Stop=0x02;
  314.                                         Run=0x00;                                                                               
  315.                                    }
  316.                                    break;
  317.                                 case  0x34:                                           //点退
  318.                                    if(aRxBuff[4] == 0x00)
  319.                                    {
  320.                                    aTxBuff[4]=0x00;
  321.                                    PPback=0x00;                                                             
  322.                                    }
  323.                                    else if(aRxBuff[4]==0xFF)
  324.                                    {
  325.                                     aTxBuff[4]=0xFF;
  326.                                         if(Stop==0x02)
  327.                                            {
  328.                                              PPback=0x04;
  329.                                                  //此处加退料                                                                                                                        
  330.                                        }
  331.                                         if(Run==0x01)
  332.                                            {
  333.                                                    PPback=0x04;
  334.                                                 RecNumL-=0x01;
  335.                                            }
  336.                                         }
  337.                                     break;
  338.                                 case  0x35:                                           //点进
  339.                                    if(aRxBuff[4] == 0x00)
  340.                                    {
  341.                                    aTxBuff[4]=0x00;
  342.                                    PPfo=0x00;                                                             
  343.                                    }
  344.                                    else if(aRxBuff[4]==0xFF&&Stop==0x02)
  345.                                    {
  346.                                     aTxBuff[4]=0xFF;
  347.                                         PPfo=0x08;
  348.                                          //此处加送料                               
  349.                                     }                 
  350.                                     break;         */
  351.                                 case  0x36:                                           //点动变频器1
  352.                                    if(aRxBuff[4] == 0x00)
  353.                                    {
  354.                                    aTxBuff[4]=0x00;
  355.                                    FrePOne=0x00;                                                             
  356.                                    }
  357.                                    else if(aRxBuff[4]==0xFF)
  358.                                    {
  359.                                     aTxBuff[4]=0xFF;
  360.                                         FrePOne=0x10;
  361.                                     }
  362.                                     break;
  363.                                 case  0x37:                                           //点动变频器2
  364.                                    if(aRxBuff[4] == 0x00)
  365.                                    {
  366.                                    aTxBuff[4]=0x00;
  367.                                    FrePTwo=0x00;                                                             
  368.                                    }
  369.                                    else if(aRxBuff[4]==0xFF)
  370.                                    {
  371.                                     aTxBuff[4]=0xFF;
  372.                                         FrePTwo=0x20;
  373.                                     }
  374.                                     break;
  375.                         /*        case  0x3c:                                           //切刀加温
  376.                                    if(aRxBuff[4] == 0x00)
  377.                                    {
  378.                                    aTxBuff[4]=0x00;
  379.                                    TemR=0x00;                                                             
  380.                                    }
  381.                                    else if(aRxBuff[4]==0xFF)
  382.                                    {
  383.                                     aTxBuff[4]=0xFF;
  384.                                         TemR=0x01;
  385.                                         if(TemL<0xDC)
  386.                                         TemL+=0x01;
  387.                                         else TemL+=0x00;
  388.                                     }
  389.                                     break;
  390.                                 case  0x3d:                                           //切刀降温
  391.                                    if(aRxBuff[4] == 0x00)
  392.                                    {
  393.                                    aTxBuff[4]=0x00;
  394.                                    TemD=0x00;                                                             
  395.                                    }
  396.                                    else if(aRxBuff[4]==0xFF)
  397.                                    {
  398.                                     aTxBuff[4]=0xFF;
  399.                                         TemD=0x02;
  400.                                         if(TemL>0)
  401.                                         TemL-=0x01;
  402.                                         else TemL-=0;
  403.                                     }
  404.                                     break;
  405.                                 case  0x3e:                                           //追标深
  406.                                    if(aRxBuff[4] == 0x00)
  407.                                    {
  408.                                    aTxBuff[4]=0x00;
  409.                                    SignSwD=0x00;                                                             
  410.                                    }
  411.                                    else if(aRxBuff[4]==0xFF)
  412.                                    {
  413.                                     aTxBuff[4]=0xFF;
  414.                                         SignSwD=0x04;
  415.                                         SignSwS=0x00;
  416.                                     }
  417.                                     break;
  418.                                 case  0x3f:                                           //追标浅
  419.                                    if(aRxBuff[4] == 0x00)
  420.                                    {
  421.                                    aTxBuff[4]=0x00;
  422.                                    SignSwS=0x00;                                                             
  423.                                    }
  424.                                    else if(aRxBuff[4]==0xFF)
  425.                                    {
  426.                                     aTxBuff[4]=0xFF;
  427.                                         SignSwS=0x08;
  428.                                         SignSwD=0x00;
  429.                                     }
  430.                                     break;*/
  431.                                 case  0x46:                                           //变频器一加
  432.                                    if(aRxBuff[4] == 0x00)
  433.                                    {
  434.                                    aTxBuff[4]=0x00;
  435.                                    FrePROne=0x00;                                                             
  436.                                    }
  437.                                    else if(aRxBuff[4]==0xFF)
  438.                                    {
  439.                                     aTxBuff[4]=0xFF;
  440.                                         FrePROne=0x01;
  441.                                         FreOneL+=0x01;                                       
  442.                                     }
  443.                                     break;
  444.                                 case  0x47:                                           //变频器一减
  445.                                    if(aRxBuff[4] == 0x00)
  446.                                    {
  447.                                    aTxBuff[4]=0x00;
  448.                                    FrePDOne=0x00;                                                             
  449.                                    }
  450.                                    else if(aRxBuff[4]==0xFF)
  451.                                    {
  452.                                     aTxBuff[4]=0xFF;
  453.                                         FrePDOne=0x02;
  454.                                         FreOneL-=0x01;                               
  455.                                     }
  456.                                     break;
  457.                                 case  0x48:                                           //变频器二加
  458.                                    if(aRxBuff[4] == 0x00)
  459.                                    {
  460.                                    aTxBuff[4]=0x00;
  461.                                    FrePRTwo=0x00;                                                             
  462.                                    }
  463.                                    else if(aRxBuff[4]==0xFF)
  464.                                    {
  465.                                     aTxBuff[4]=0xFF;
  466.                                         FrePRTwo=0x04;
  467.                                         FreTwoL+=0x01;                               
  468.                                     }
  469.                                     break;
  470.                                 case  0x49:                                           //变频器二减
  471.                                    if(aRxBuff[4] == 0x00)
  472.                                    {
  473.                                    aTxBuff[4]=0x00;
  474.                                    FrePDTwo=0x00;                                                             
  475.                                    }
  476.                                    else if(aRxBuff[4]==0xFF)
  477.                                    {
  478.                                     aTxBuff[4]=0xFF;
  479.                                         FrePDTwo=0x08;
  480.                                         FreTwoL-=0x01;
  481.                                     }
  482.                                     break;
  483.                                 case  0x4A:                                           //统调加
  484.                                    if(aRxBuff[4] == 0x00)
  485.                                    {
  486.                                    aTxBuff[4]=0x00;
  487.                                    FreR=0x00;                                                             
  488.                                    }
  489.                                    else if(aRxBuff[4]==0xFF)
  490.                                    {
  491.                                     aTxBuff[4]=0xFF;
  492.                                         FreR=0x10;
  493.                                         FreOneL+=0x01;
  494.                                         FreTwoL+=0x10;                                       
  495.                                     }
  496.                                     break;
  497.                                 case  0x4b:                                           //统调减
  498.                                    if(aRxBuff[4] == 0x00)
  499.                                    {
  500.                                    aTxBuff[4]=0x00;
  501.                                    FreD=0x00;                                                             
  502.                                    }
  503.                                    else if(aRxBuff[4]==0xFF)
  504.                                    {
  505.                                     aTxBuff[4]=0xFF;
  506.                                         FreD=0x20;
  507.                                         FreOneL-=0x01;
  508.                                         FreTwoL-=0x10;
  509.                                     }
  510.                                     break;                               
  511.                                 }                                                                                                                              
  512.                                 aTxBuff[5]=0x00;
  513.                                 crc16tem=crc16(aTxBuff,nTxBuff);
  514.                                 aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
  515.                                 aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
  516.                                 for(i = 0; i < nTxBuff+1; i++)
  517.                         {
  518.                               c[i]=aTxBuff[i];
  519.                                         }
  520. //                                USART1_Putc(c,n);
  521.                                 USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
  522.                                 USART_SendData(USART1, aTxBuff[0]);  
  523.                             sendnum=1;
  524.                             break;
  525.                        
  526.                         case PresetSingleReg:                                // 0x06
  527.                                 for(i=0;i<6;i++)
  528.                                   {aTxBuff[i]=aRxBuff[i];}                       
  529.                                 nTxBuff=6;
  530.                                 switch (aRxBuff[3])                           //判断地址码
  531.                                 {
  532.                                 case 0x14:                                           //变频器一速度
  533.                                  FreOneH=aRxBuff[4];
  534.                                  FreOneL=aRxBuff[5];
  535.                                  break;
  536.                                 case 0x15:                                           //变频器二速度
  537.                                  FreTwoH=aRxBuff[4];
  538.                                  FreTwoL=aRxBuff[5];
  539.                                  break;
  540.                         /*        case 0x0f:                                           //切刀加温
  541.                                  TemH=aRxBuff[4];
  542.                                  TemL=aRxBuff[5];
  543.                                  break;
  544.                                 case 0x0b:                                           //整本数设定
  545.                                  IntendNumH=aRxBuff[4];
  546.                                  IntendNumL=aRxBuff[5];
  547.                                  break;
  548.                                 case 0x0a:                                           //设定袋长
  549.                                  IntendDisH=aRxBuff[4];
  550.                                  IntendDisL=aRxBuff[5];
  551.                                  break;
  552.                                 case 0x1e:                                           //速度
  553.                                  IntendVelH=aRxBuff[4];
  554.                                  IntendVelL=aRxBuff[5];
  555.                                  break;
  556.                                 case 0x0e:                                           //追标长度
  557.                                  IntendSignH=aRxBuff[4];
  558.                                  IntendSignL=aRxBuff[5];
  559.                                  break;
  560.                                 case 0x0c:                                           //脱标次数
  561.                                  FailNumH=aRxBuff[4];
  562.                                  FailNumL=aRxBuff[5];
  563.                                  break;
  564.                                 case 0x0d:                                           //自动起机
  565.                                  AutoRunH=aRxBuff[4];
  566.                                  AutoRunL=aRxBuff[5];
  567.                                  break;
  568.                                 case 0x1f:                                           //步进脉冲数
  569.                                  PluseNOH=aRxBuff[4];
  570.                                  PluseNOL=aRxBuff[5];
  571.                                  break;
  572.                                 case 0x20:                                           //曲线选择
  573.                                  LineH=aRxBuff[4];
  574.                                  LineL=aRxBuff[5];
  575.                                  break;
  576.                                 case 0x21:                                           //修轮
  577.                                  CheckH=aRxBuff[4];
  578.                                  CheckL=aRxBuff[5];
  579.                                  break;        */

  580.                                 }                                                                                                                                                                                                                                                                                                       
  581.                                 crc16tem=crc16(aTxBuff,nTxBuff);
  582.                                 aTxBuff[nTxBuff++]=(unsigned char)(crc16tem>>8);
  583.                                 aTxBuff[nTxBuff]=(unsigned char)(crc16tem & 0x00ff);
  584.                                 for(i = 0; i < nTxBuff+1; i++)
  585.                         {
  586.                               c[i]=aTxBuff[i];
  587.                                         }
  588. //                                USART1_Putc(c,n);
  589.                                 USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
  590.                 USART_SendData(USART1, aTxBuff[0]);  
  591.                            // sendnum=1;
  592.                             break;
  593.                        
  594.                         }
  595.                 }
  596.         }
  597. }
复制代码

  1. /******************** (C) COPYRIGHT 2012 WildFire Team **************************
  2. * 文件名  :main.c
  3. * 描述    :实现sht10传感器的modbus与上位机的通讯。         
  4. * 实验平台:奋斗mini开发板
  5. * 库版本  :ST3.5.0
  6. **********************************************************************************/
  7. #include "stm32f10x.h"
  8. #include "Init_Config.h"
  9. #include "modbus.h"
  10. #include "myiic.h"
  11. #include "MeasuerTEMP.h"
  12. #include "Systick.h"
  13. /*
  14. * 函数名:main
  15. * 描述  : 主函数
  16. * 输入  :无
  17. * 输出  : 无
  18. */
  19. int main(void)
  20. {
  21.         RCC_Configuration();

  22.         Init_Config();
  23.        
  24.         SHT10_Config();
  25.          
  26.         SysTick_Init();       

  27. while (1)
  28.     {


  29.         if(Uart0_rev_comflag==0x01)
  30.           {       

  31.           Uart0_rev_comflag=0x00;
  32.           
  33.           ParseRecieve();

  34.          USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

  35.           }          
  36.     }

  37. }
  38. /******************* (C) COPYRIGHT 2012 WildFire Team *****END OF FILE************/
复制代码

所有资料51hei提供下载:
STM32_MODBUS1.7z (186.31 KB, 下载次数: 133)
回复

使用道具 举报

ID:77589 发表于 2022-3-25 10:51 | 显示全部楼层
谢谢!可以参考一下!
回复

使用道具 举报

ID:99525 发表于 2022-5-4 03:59 | 显示全部楼层
这个应该是slave从机,不是master吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表