找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4561|回复: 7
打印 上一主题 下一主题
收起左侧

stm32+rs485-modbus通讯实验源程序

  [复制链接]
跳转到指定楼层
楼主
ID:515526 发表于 2019-5-21 16:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本实验完成了stm32对uart4串口配置,使用rs485通讯,完成和上位机数据交换,使用modbus协议

单片机源程序如下:
  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "lcd.h"
  6. #include "usart.h"         
  7. #include "rs485.h"

  8. //Modbus寄存器和单片机寄存器的映射关系
  9. vu32 *Modbus_InputIO[100];//输入开关量寄存器指针(这里使用的是位操作)
  10. vu32 *Modbus_OutputIO[100];//输出开关量寄存器指针(这里使用的是位操作)
  11. /***********************************************
  12. 函数功能:配置io输出口
  13. *************************************************/
  14. void  DO_Init(void)
  15. {        
  16.         GPIO_InitTypeDef GPIO_InitStructure;

  17.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOC, ENABLE );          //使能GPIOE
  18.                      
  19.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;  //PE8-PE15 作为推挽输出引脚  
  20.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                            //推挽输出
  21.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  22.         GPIO_Init(GPIOE, &GPIO_InitStructure);                      //初始化GPIOE
  23.   GPIO_ResetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
  24.        
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_13;                                 //
  26.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  27. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
  28. GPIO_Init(GPIOC, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOD.5
  29. GPIO_ResetBits(GPIOC,GPIO_Pin_8|GPIO_Pin_13);                                                 //PC.10 输出高
  30. }

  31. //CRC校验 自己后面添加的

  32. const u8 auchCRCHi[] = {
  33. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  34. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  35. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
  36. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  37. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  38. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  39. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  40. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  41. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  42. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  43. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  44. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  45. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;


  46. const u8 auchCRCLo[] = {
  47. 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
  48. 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
  49. 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
  50. 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
  51. 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
  52. 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
  53. 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
  54. 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
  55. 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
  56. 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
  57. 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
  58. 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
  59. 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;


  60. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  61. /**************************************************************
  62. 函数功能:生成CRC校验码
  63. **************************************************************/
  64. u16 CRC_Compute(u8 *puchMsg, u16 usDataLen)
  65. {
  66.         u8 uchCRCHi = 0xFF ;
  67.         u8 uchCRCLo = 0xFF ;
  68.         u32 uIndex ;
  69.         while (usDataLen--)
  70.         {
  71.                 uIndex = uchCRCHi ^ *puchMsg++ ;
  72.                 uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
  73.                 uchCRCLo = auchCRCLo[uIndex] ;
  74.         }
  75.         return ((uchCRCHi<< 8)  | (uchCRCLo)) ;
  76. }


  77. u16 RegNum;
  78. u8 RS485_TX_BUFF[10];//发送缓冲区
  79. u8 RS485_RX_BUFF[10];//接收缓冲区
  80. u16 calCRC;         
  81. u16 startRegAddr;    //寄存器起始地址
  82. u16 recCRC;
  83.         void Modbus_05_Solve(void)
  84. {
  85.         if(startRegAddr<100)
  86.         {
  87.                 if((RS485_RX_BUFF[4]==0xFF)||(RS485_RX_BUFF[5]==0xFF)) *Modbus_OutputIO[startRegAddr]=0x01;
  88.                 else *Modbus_OutputIO[startRegAddr]=0x00;

  89.                 RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
  90.                 RS485_TX_BUFF[1]=RS485_RX_BUFF[1];
  91.                 RS485_TX_BUFF[2]=RS485_RX_BUFF[2];
  92.                 RS485_TX_BUFF[3]=RS485_RX_BUFF[3];
  93.                 RS485_TX_BUFF[4]=RS485_RX_BUFF[4];
  94.                 RS485_TX_BUFF[5]=RS485_RX_BUFF[5];

  95.                 calCRC=CRC_Compute(RS485_TX_BUFF,6);
  96.                 RS485_TX_BUFF[6]=calCRC&0xFF;
  97.                 RS485_TX_BUFF[7]=(calCRC>>8)&0xFF;
  98.                 RS485_Send_Data(RS485_TX_BUFF,8);
  99.         }
  100.         else
  101.         {
  102.                 RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
  103.                 RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80;
  104.                 RS485_TX_BUFF[2]=0x02;
  105.                 RS485_Send_Data(RS485_TX_BUFF,3);
  106.         }
  107. }

  108. //Modbus功能码15处理函数
  109. void Modbus_15_Solve(void)
  110. {
  111.          DO_Init();
  112.         RegNum=(((u16)RS485_RX_BUFF[4])<<8)|RS485_RX_BUFF[5];//获取寄存器数量
  113.         if((startRegAddr+RegNum)<100)//寄存器地址+数量在范围内
  114.         {        
  115.             if(RS485_RX_BUFF[6]==0x01)
  116.                                                          {
  117.                                                           switch(RS485_RX_BUFF[7])
  118.                                                                 {
  119.                                                                
  120.                                                                         case                0x01:
  121.                     {                                                                       
  122.                                                                  GPIO_ResetBits(GPIOE,GPIO_Pin_8);
  123.                              delay_ms(100);                            //开机功能
  124.                        GPIO_SetBits(GPIOE,GPIO_Pin_8);
  125.                                                                          break;
  126.                                                              }
  127.                                                                         case  0x02:
  128.                                                                          {
  129.                                                                         GPIO_ResetBits(GPIOE,GPIO_Pin_10);
  130.                               delay_ms(100);                     //关机
  131.                         GPIO_SetBits(GPIOE,GPIO_Pin_10);
  132.                                                                          break;
  133.                                                                          }
  134.                                                                         case  0x04:
  135.                                                                          {
  136.                                                                          GPIO_ResetBits(GPIOE,GPIO_Pin_9);
  137.                                delay_ms(100);                            //激励封锁
  138.                          GPIO_SetBits(GPIOE,GPIO_Pin_9);
  139.                                                                                   break;
  140.                                                                          }
  141.                                                                         case 0x08:
  142.                                                                          {
  143.                                                                         GPIO_ResetBits(GPIOE,GPIO_Pin_11);
  144.                               delay_ms(500);                      //复位
  145.                         GPIO_SetBits(GPIOE,GPIO_Pin_11);
  146.                                                                                  break;
  147.                                                                          }
  148.                                                                  }
  149.                                                                  }
  150.                                                         else
  151.                                                         {
  152.                                                         RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
  153.                 RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80;
  154.                 RS485_TX_BUFF[2]=0x02; //异常码
  155.                RS485_Send_Data(RS485_TX_BUFF,3);
  156.                                                        
  157.                                                         }

  158.                 RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
  159.                 RS485_TX_BUFF[1]=RS485_RX_BUFF[1];
  160.                 RS485_TX_BUFF[2]=RS485_RX_BUFF[2];
  161.                 RS485_TX_BUFF[3]=RS485_RX_BUFF[3];
  162.                 RS485_TX_BUFF[4]=RS485_RX_BUFF[4];
  163.                 RS485_TX_BUFF[5]=RS485_RX_BUFF[5];
  164.                 calCRC=CRC_Compute(RS485_TX_BUFF,6);
  165.                 RS485_TX_BUFF[6]=calCRC&0xFF;
  166.                 RS485_TX_BUFF[7]=(calCRC>>8)&0xFF;
  167.                RS485_Send_Data(RS485_TX_BUFF,8);
  168.         }
  169.         else//寄存器地址+数量不在范围内
  170.         {
  171.                 RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
  172.                 RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80;
  173.                 RS485_TX_BUFF[2]=0x02; //异常码
  174.                RS485_Send_Data(RS485_TX_BUFF,3);
  175.         }
  176. }

  177. int main(void)
  178. {         
  179.         u8 key;
  180.         u8 i=0;
  181.         u8 rs485buf[10];
  182.        
  183.         delay_init();                     //延时函数初始化          
  184.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  185.         uart_init(115200);                 //串口初始化为115200
  186.         LED_Init();                                  //初始化与LED连接的硬件接口
  187.         LCD_Init();                                   //初始化LCD        
  188.         KEY_Init();                                //按键初始化                          
  189.         RS485_Init(9600);        //初始化RS485串口波特率9600
  190.         while(1)
  191.         {
  192.   RS485_Receive_Data(rs485buf,&key);
  193.                 if(key)//接收到有数据
  194.                 {
  195.                         if(key>10)key=10;//最大是10个数据.
  196.                         for(i=0;i<key;i++)
  197.                         {
  198.                         RS485_RX_BUFF[i]=rs485buf[i];
  199.                         }
  200.        
  201.                 if(RS485_RX_BUFF[0]==0x01)//地址正确
  202.                 {
  203.                         if((RS485_RX_BUFF[1]==00)||(RS485_RX_BUFF[1]==02)||(RS485_RX_BUFF[1]==0x03)||(RS485_RX_BUFF[1]==0x05)||(RS485_RX_BUFF[1]==0x06)||(RS485_RX_BUFF[1]==0x15)||(RS485_RX_BUFF[1]==0x16))
  204.                   {
  205.                                 startRegAddr=(((u16)RS485_RX_BUFF[2])<<8)|RS485_RX_BUFF[3];//获取寄存器地址
  206.                                 if(startRegAddr<1000)//寄存器地址在范围内
  207.                                 {
  208.                                                                                                        
  209.                                         calCRC=CRC_Compute(RS485_RX_BUFF,8);//计算所接收到数据的CRC
  210.                                         recCRC=RS485_RX_BUFF[9]|(((u16)RS485_RX_BUFF[8])<<8);//????CRC(?????,?????)
  211.                                         if(calCRC==recCRC)//CRC正确
  212.                                         {
  213.                                                 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  214.                                                 switch(RS485_RX_BUFF[1])//判断功能码
  215.                                                 {
  216.                                                    

  217.                                                         case 0x05://写单个输出开关量
  218.                                                         {
  219.                                                                 Modbus_05_Solve();
  220.                                                                 break;
  221.                                                         }

  222.                                                         case 0x15://写多个输出开关量
  223.                                                         {
  224.                                                                 Modbus_15_Solve();
  225.                                                                 break;
  226.                                                         }

  227.                                                    

  228.                                                 }
  229.                                                 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  230.                                         }
  231.                                         else//CRC错误
  232.                                         {
  233.                                                 RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
  234.                                                 RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80;
  235.                                                 RS485_TX_BUFF[2]=0x04; //异常码
  236.                                                 RS485_Send_Data(RS485_TX_BUFF,3);
  237.                                         }        
  238.                                 }
  239.                                 else//寄存器地址超出范围
  240.                                 {
  241.                                         RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
  242.                                         RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80;
  243.                                         RS485_TX_BUFF[2]=0x02; //异常码
  244.                                        RS485_Send_Data(RS485_TX_BUFF,3);
  245.                                 }                                                
  246.                         }
  247.                         else//功能码错误
  248.                         {
  249.                                 RS485_TX_BUFF[0]=RS485_RX_BUFF[0];
  250.                                 RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80;
  251.                                 RS485_TX_BUFF[2]=0x01; //异常码
  252.                                 RS485_Send_Data(RS485_TX_BUFF,3);
  253.                         }
  254.           }

  255.         
  256.                 RS485_RX_CNT=0;//清零
  257.                 RS485_TX_EN=0;//开始接收               
  258.         }               
  259.                
  260.                
  261.                
  262.         }
  263. }
复制代码

所有资料51hei提供下载:



485-modbus通讯实验.7z

236.41 KB, 下载次数: 250, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:405302 发表于 2019-7-9 15:11 | 只看该作者
我想用单片机和触摸屏用modbus通讯,能实现吗
回复

使用道具 举报

板凳
ID:714728 发表于 2020-3-24 14:11 | 只看该作者
学习一下,谢谢
回复

使用道具 举报

地板
ID:379340 发表于 2023-12-6 17:00 | 只看该作者
  recCRC=RS485_RX_BUFF[9]|(((u16)RS485_RX_BUFF[8])<<8);
这里是不是错了,校验码是低位在前,高位在后,
回复

使用道具 举报

5#
ID:379340 发表于 2023-12-6 17:02 | 只看该作者
if(RS485_RX_BUFF[0]==0x01)//地址正确
                {
                        if((RS485_RX_BUFF[1]==00)||(RS485_RX_BUFF[1]==02)||(RS485_RX_BUFF[1]==0x03)||(RS485_RX_BUFF[1]==0x05)||(RS485_RX_BUFF[1]==0x06)||(RS485_RX_BUFF[1]==0x15)||(RS485_RX_BUFF[1]==0x16))
                  {
                                startRegAddr=(((u16)RS485_RX_BUFF[2])<<8)|RS485_RX_BUFF[3];//获取寄存器地址
                                if(startRegAddr<1000)//寄存器地址在范围内
                                {
                                                                                                       
                                        calCRC=CRC_Compute(RS485_RX_BUFF,8);//计算所接收到数据的CRC
                                        recCRC=RS485_RX_BUFF[9]|(((u16)RS485_RX_BUFF[8])<<8);//????CRC(?????,?????)
                                        if(calCRC==recCRC)//CRC正确
                                        {
                                                /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                switch(RS485_RX_BUFF[1])//判断功能码
                                                {
                                                   

                                                        case 0x05://写单个输出开关量
                                                        {
                                                                Modbus_05_Solve();
                                                                break;
                                                        }

                                                        case 0x15://写多个输出开关量
                                                        {
                                                                Modbus_15_Solve();
                                                                break;
                                                        }

                                                   

                                                }
                                                //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                        }这里是发送10个字节,


//Modbus功能码15处理函数
void Modbus_15_Solve(void)//这里是发送8个字节,没有明白可以解释一下吗
回复

使用道具 举报

6#
ID:379340 发表于 2023-12-6 17:03 | 只看该作者
//Modbus功能码15处理函数
void Modbus_15_Solve(void)这里发送8个字节。主函数里面发送10个字节,没有理解,可以解释一下吗,谢谢
回复

使用道具 举报

7#
ID:874002 发表于 2024-1-2 16:02 | 只看该作者
if(key>10)key=10;//最大是10个数据.后面的校验都是按照10校验的,如果接收到的字节小于10个,校验位也应该相应地调整吧
回复

使用道具 举报

8#
ID:874002 发表于 2024-1-9 16:48 | 只看该作者
18758774924 发表于 2023-12-6 17:00
recCRC=RS485_RX_BUFF[9]|(((u16)RS485_RX_BUFF[8])

是低位在前高位在后,低位在前先发,先收到低位,那发的时候当然计算calCRC的校验码其实是低位在前面高位在后面正好相反的,也就是说你要理解了calCRC其实不是真正的crc1234,而是3412,所以这里没有反,反而是前面 void Modbus_05_Solve(void)函数里的6和7反了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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