精华内容
下载资源
问答
  • stm32 rs485 modbus协议

    2019-05-07 12:03:34
    最近项目用到modbus协议,用的串口是rs485,这是测试中的程序,测试通过,现在贴出来,大家相互学习。
  • c#与485MODBUS串口通信源代码,通过串口读取设备数据,c#的源代码,比如读取PLC数据(AD采集的或设置的),可以控制PLC(支持MODBUS)动作,485通信可以达到500M(稳定通信),也可和单片机通信,我资源里有关于8051...
  • 485标准Modbus RTU通讯控制 外置键盘控制 多种速度给定 内置旋钮、外部模拟电压或PWM(0~5V)、通讯给定、 键盘给定、 多段速度、简易PLC控制 加/减速度控制 0.3s~10s 可通过旋钮调节、通讯调节和键盘调节 电子刹车...
  • STM32F103-RS485MODBUS从站

    2017-10-30 14:21:58
    STM32F103-RS485MODBUS从站,很好的学习练习代码,适合有新手
  • 松下PLC 485 MODBUS通讯

    2018-05-04 14:27:13
    松下PLC 读温控器 温度MODBUS通讯,采用循环读取1-16个站号的温度,并写入到对应的PLC DT寄存器中。
  • labview 485 modbus上位机

    2020-10-22 18:27:36
    labview开发环境,兼容串口通信、485通信,基于modbus协议的通信上位机,CRC12校验方式,源代码
  • 485 ModbusRTU通讯协议(完整版),PDF 网上找到的的最全的资料,可直接使用----
  • 485 modbus

    2021-07-20 11:25:09
    串口配置485modbus协议常常需要花费很多的时间,这里整理了一份使用STM32F05/107,采用FreeRTOS设计的modbus协议,使用小端模式;有需求的点以下链接 STM32 105/107 modbus 兼容 GD同型号芯片-淘宝网 (taobao.com)...

    ST程序模板 兼容GD同型号

    串口配置485的modbus协议常常需要花费很多的时间,这里整理了一份使用STM32F05/107,采用FreeRTOS设计的modbus协议,使用小端模式;有需求的点以下链接

    STM32 105/107 modbus 兼容 GD同型号芯片-淘宝网 (taobao.com)


    https://item.taobao.com/item.htm?spm=a230r.1.14.6.f8c860017sxaoe&id=650442456791&ns=1&abbucket=17#detail

    兼容GD同型号芯片。

    程序核心功能:FreeRTOS + 4路485 modbus协议(小端) + 4路串口配置为DMA;

    辅 助 功 能   :配置了 IO口输入输出完善的底层函数;

                          配置了IO模拟SPI通用函数;

                          配置了IO模拟IIC通用函数;

                         …………

    展开全文
  • 东元电机7200CX RS-485 MODBUS 通讯机能应用手册pdf,东元电机7200CX RS-485 MODBUS 通讯机能应用手册
  • 目的是找到一种在Arduino Uno上实现RS485的简单方法,然后使其适应ESP8266。
  • fuji控制器PXR系列通信功能(RS485 MODBUS)使用说明书
  • 很全面的Modbus协议与485通信应用
  • 用于Domoticz的Modbus读/写插件 作者:Sebastiaan Ebeltjes / DomoticX.nl 在Domoticz版本上成功测试:2020.2稳定 您可以使用以下命令更新domoticz: cd /home/pi/domoticz | ./updaterelease cd /home/pi/domoticz...
  • 485 modbus-rtu.zip

    2021-05-17 09:46:48
    三菱plc485通讯rs指令和adprw指令用法
  • 485MODBUS.rar

    2020-03-08 18:10:06
    STM32 MODBUS协议主机 RS485通讯 c语言代码。我自己之前做的有个项目调试,希望对大家有帮助
  • S7-1200PLC+CM1241+RS485Modbus+Master组态说明
  • RS485 Modbus协议解析

    千次阅读 2019-09-24 20:09:00
    在工作中,当我们采集采用RS485主从式半双工通讯的传感器时,会接触到Modbus协议。有时我们手上没有实物,只能通过协议文档手册,编写完代码后,自己用RS485来模拟发送验证。下面就说说如何快速组装数值发送验证,...

        在工作中,当我们采集采用RS485主从式半双工通讯的传感器时,会接触到Modbus协议。有时我们手上没有实物,只能通过协议文档手册,编写完代码后,自己用RS485来模拟发送验证。下面就说说如何快速组装数值发送验证,以及解析数值。

    标准Modbus协议结构如下:

    主机发送读寄存器协议数据结构形式为:

    设备地址           1字节

    读寄存器命令   1字节

    寄存器地址       2字节

    读寄存器个数   2字节

    CRC校验(低字节在前,高字节在后)   2字节

     

    例(主机发送数据到传感器):01 03 00 12 00 02 64 0E

    解析:

    01    表示设备地址

    03    表示读寄存器指令

    00 12 表示寄存器的起始地址

    00 02 表示读取两个寄存器

    64 0E 表示CRC校验码

     

    从机返回寄存器是数据结构形式为:

    设备地址   1字节

    读寄存器命令   1字节

    读取字节个数   N字节

    XX *N   N个所读取字节数据

    CRC校验(低字节在前,高字节在后)

     

    例(传感器发送回给主机):01 03 04 41 E6 28 F6 91 BE

    解析:

    01          表示设备地址

    03          表示读寄存器指令

    04          表示有四个16进制数据

    41 E6 28 F6  表示传感器的有效数据

    91 BE       表示CRC校验码

     

    1.若厂家对传感器的数据存储采用标准单精度浮点数方式,则对于一串采集回来的16进制数据,要转成浮点数是比较麻烦的,可以看下先用科学计数法方式存储计算:

    方式1:如解析上述的返回值41 E6 28 F6

    计算 41 E6 28 F6 (采用科学计数法方式存储计算)

    转为二进制:01000001111001100010100011110110‬

    红色’0’:表示符号位,1为负,0为正

    10000011:表示指数位,转为十进制为2^0+2^1+2^7=131 131-127=4 说明指数位为4

    则表示为((1.11001100010100011110110)*2^4)=11100. 1100010100011110110=

    2^2+2^3+2^4. 2^-1+2^-2+..=28.77

    41 E6 28 F6 转为十进制为28.77

     

    方式2:采用工具快速转换,如下图所示

    有了该工具,想要自己模拟发送任意数值的modbus协议数据,也是非常方便的。

    比如主机发送了01 03 00 12 00 02 64 0E 采集命令,想要模拟传感器数值为12.34

    通过工具转换如下:

    则可组装modbus协议数据为01 03 04 41 45 70 A4 , 对于后面两位crc校验可以采用如下工具,可以得到:

    可知组装的完整mobdus协议数据为01 03 04 41 45 70 A4 DB A1

    2.若厂家对传感器的数据处理是采用16进制转整数方式处理,就像如下图所示:

    这种形式的16进制传感器数据,可以采用电脑的计算器快速计算得到。

    如计算00 9B

    16进制模拟负值,可以采用计算器

    如模拟-50,计算器输入如下0-50

    再点击计算器上的xor

    则16进制FF CE 则表示负数-50

    展开全文
  • 宏晶STC单片机与触屏通信(485modbus协议),读写触屏数据。
  • 串口通信485modbus

    2017-05-20 16:33:54
    串口通信485modbus
  • 每个功能都是用2个文件写的,方便移值,学会这种写法,新手少走很多弯路 方便移植的好处就是---辛苦一次,一劳永逸 电脑或者其他设备通过485Modbus读取DS18B20温度和控制LED
  • 适用对象: 1. 程序开发人员;  适用场合: 1. 用户自己开发 PC 端 Modbus 通讯软件; 2. 可以结合:Modscan32 软件说明书,开发后台软件更方便;
  • 基于RS485 modbus-RTU协议分析

    千次阅读 2018-05-18 20:30:50
    通过查找手册得到如下信息Modbus地址单位功能0x3F00V实时母线电压这边采用半双工 RS485两线模式电脑连接端采用485转串口,在设备管理器里可以看到设备使用COM2端口。这里需要读取寄存器参数。使用功能码0x...

             最近学习modbus-RTU通讯协议。手头刚好有个步科的步进电机驱动器FM-860采用RS-485通讯,modbus-RTU协议



    该驱动器有个寄存器是存取电源电压的。通过查找手册得到如下信息

    Modbus地址单位功能
    0x3F00V实时母线电压



    这边采用半双工 RS485两线模式


    电脑连接端采用485转串口,在设备管理器里可以看到设备使用COM2端口。

    这里需要读取寄存器参数。使用功能码0x03


    设备地址功能码modbus地址起始地址高位modbus地址起始地址低位读取个数高字节读取个数低字节CRC校验(两字节)
    0x010x030x3F0x0000010x88 0x1E

    CRC校验计算可以通过工具计算得来


    因为发送时先发送低位再发送高位,所以0x88 在前0x1E在后

    下面就发送给驱动器来获得参数值。

    我先开一个串口监视软件来监控串口数据。


    点开监控后再打开串口调试工具。设置好参数。发送数据01 03 3F 00 00 01 88 1E


    这时驱动器已经返回参数了。再看串口监视器也有数据。两个数据一致。


    再来分析得到的数据01 03 02 00 17 F8 4A 

    根据modbus响应报文格式 

    01设备地址

    03查询功能码

    02返回byte数据个数

    00 17参数数据

    F8 4A校验码CRC 

    数据0x17转换成十进制为23。所以电压为23V。

    我们再通过官方的调试软件看下是否正确。


    结果一致。

    下面通过逻辑分析仪看看485的时序,是如何传递数据的

    下面为截取的时序图,

    1.发送

    485两线制,差分信号,所以电平是相对称的。

    看第一个箭头由高到低表示起始位。

    后面红框8个白点表示8位数据,第一个高电平后面都是低电平,值为10000000。由于数据由前向后发送,所以转换成十六进制要倒过来就是0x01。

    看第三个箭头处高电平为停止位。

    后面数据依次类推: 11000000=0x03    11111100=0x3F   00000000=0x00    00000000=0x00  10000000=0x01 
    00010001=0x88      01111000=0x1E      
    与我们发送的码是一致的。

    2.接收

    同理分析可得 01 03 02 00 17 F8 4A。


    最后通过LABVIEW写个简单的上位机监控该参数,采用NI的modbus库。

    通过调整电源电压值,可以观测到驱动器电压曲线波动



    labview中modbus 地址为10进制,所以0x3F00要转换成16128


                           

                                 

                                 


                              

                           







    展开全文
  • 基于STM32F103单片机开发,采用RS485总线的MODBUSRTU通讯例程,接受和发送使能控制。带CRC校验计算函数。纯原创。
  • STM32F4 485 modbus

    2018-07-11 13:21:23
    编写了stm32f4的主从机的485通信,编写的modbus协议,能够实现主机向从机发送命令,和从机向主机发送数据,通过设定不同从机地址,读取不同从机的数据,两个stm32f4可以直连,可以直接使用,欢迎大家一起交流讨论
  • Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。modbus协议简单解析如下: 1、主机对从机写数据操作 如果单片机接收到一...

    Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现。modbus协议简单解析如下:
    1、主机对从机写数据操作
    如果单片机接收到一个报文那么就对报文进行解析执行相应的处理,如上面报文:
    01 06 00 01 00 17 98 04
    从机地址 功能号 数据地址 数据 CRC校验

    假如本机地址是 1 ,那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:
    HoldDataReg[1] = 0x0017;
    MODBUS主机就完成了一次对从机数据的写操作,实现了通讯。

    2、主机对从机读数据操作
    主机进行读HoldDataReg[1] 操作,则报文是:
    01 03 00 01 00 01 D5 CA
    从机地址 功能号 数据地址 读取数据个数 CRC校验
    那么单片机接收到这串数据根据数据计算CRC校验判断数据是否正确,如果判断数据无误,则结果是:返回信息给主机,返回的信息也是有格式的:
    返回内容:
    01 03 02 0017 F8 4A
    从机地址 功能号 数据字节个数 两个字节数据 CRC校验
    MODBUS主机就完成了一次对从机数据的读操作,实现了通讯。

    上传的程序是根据手把手教你51单片机的例程修改而来,能实现读/写操作(03,06码),成功通过modbus调试精灵测试,读写通讯正常!
    由于刚接触modbus通讯协议,之前一直出现通讯超时的问题,找了网上很多资料,都不得其解,所以把程序拿出来和大家分享。希望和大家相互学习、共同进步!

    #include “rs485.h”
    #include “SysTick.h”
    #include “crc16.h”
    #include “led.h”

    /*******************************************************************************

    • 函 数 名 : RS485_Init
    • 函数功能 : USART2初始化函数
    • 输 入 : bound:波特率
    • 输 出 : 无
      *******************************************************************************/
      u8 USART2_RX_BUF[64]; //接收缓冲,最大64字节
      u8 USART2_RX_CNT=0; //接收字节计数器
      u8 flagFrame=0; //帧接收完成标志,即接收到一帧新数据
      unsigned char regGroup[5]; //Modbus寄存器组,地址为0x00~0x04

    void RS485_Init(u32 bound)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG|RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA\G时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
        
        /*  配置GPIO的模式和IO口 */
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;        //TX-485        //串口输出PA2
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;                  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;        
        GPIO_Init(GPIOA,&GPIO_InitStructure);                /* 初始化串口输入IO */
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;        //RX-485           //串口输入PA3
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;            //模拟输入
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;        //CS-485
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;           //推挽输出
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOG,&GPIO_InitStructure);
        
        //USART2 初始化设置
        USART_InitStructure.USART_BaudRate = bound;//波特率设置
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式
        USART_Init(USART2, &USART_InitStructure); //初始化串口2
        
        USART_Cmd(USART2, ENABLE);  //使能串口 2
        
        USART_ClearFlag(USART2, USART_FLAG_TC);
                
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接受中断
    
        //Usart2 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;                //子优先级2
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、
        
        RS485_TX_EN=0;                                //默认为接收模式        
    

    }

    //1ms定时

    void TIM2_Init()
    {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//使能TIM4时钟
        
        TIM_TimeBaseInitStructure.TIM_Period=1000;   //自动装载值 
        TIM_TimeBaseInitStructure.TIM_Prescaler=72-1; //分频系数
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
        
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //开启定时器中断
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
        
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;//定时器中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //子优先级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        
        
        TIM_Cmd(TIM2,ENABLE); //使能定时器        
    

    }

    //计算发送的数据长度,并且将数据放到*buf数组中
    u8 UartRead(u8 *buf, u8 len)
    {
    u8 i;
    if(len>USART2_RX_CNT) //指定读取长度大于实际接收到的数据长度时
    {
    len=USART2_RX_CNT; //读取长度设置为实际接收到的数据长度
    }
    for(i=0;i<len;i++) //拷贝接收到的数据到接收指针中
    {
    *buf=USART2_RX_BUF[i]; //将数据复制到buf中
    buf++;
    }
    USART2_RX_CNT=0; //接收计数器清零
    return len; //返回实际读取长度
    }

    u8 rs485_UartWrite(u8 *buf ,u8 len) //发送
    {
    u8 i=0;
    GPIO_SetBits(GPIOG,GPIO_Pin_3); //发送模式
    delay_ms(3); //3MS延时
    for(i=0;i<=len;i++)
    {
    USART_SendData(USART2,buf[i]); //通过USARTx外设发送单个数据
    while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET); //检查指定的USART标志位设置与否,发送数据空位标志
    }
    GPIO_ResetBits(GPIOG,GPIO_Pin_3); //设置为接收模式

    }

    //串口驱动函数,检测数据帧的接收,调度功能函数,需在主循环中调用
    void UartDriver()
    {
    unsigned char i=0,cnt;
    unsigned int crc;
    unsigned char crch,crcl;
    static u8 len;
    static u8 buf[60];
    if(flagFrame) //帧接收完成标志,即接收到一帧新数据
    {
    flagFrame=0; //帧接收完成标志清零
    len = UartRead(buf,sizeof(buf)); //将接收到的命令读到缓冲区中
    if(buf[0]==0x01) //判断地址是不是0x01
    {
    crc=GetCRC16(buf,len-2); //计算CRC校验值,出去CRC校验值
    crch=crc>>8; //crc高位
    crcl=crc&0xFF; //crc低位
    if((buf[len-2]==crch)&&(buf[len-1]==crcl)) //判断CRC校验是否正确
    {
    switch (buf[1]) //按功能码执行操作
    {
    case 0x03: //读数据
    if((buf[2]==0x00)&&(buf[3]<=0x05)) //寄存器地址支持0x0000~0x0005
    {

                                                        if(buf[3]<=0x04) 
                                                        {
                                                                i=buf[3];//提取寄存器地址
                                                                cnt=buf[5];  //提取待读取的寄存器数量
                                                                buf[2]=cnt*2;  //读取数据的字节数,为寄存器*2,因modbus定义的寄存器为16位
                                                                len=3;                                                        
                                                                while(cnt--)
                                                                {
                                                                        buf[len++]=0x00;                                //寄存器高字节补0
                                                                        buf[len++]=regGroup[i++];                //低字节
                                                        }
                                                        
                                                }
                                                        break;
                                        }
                                                else  //寄存器地址不被支持时,返回错误码
                                                {   
                                                        buf[1]=0x83;  //功能码最高位置1
                                                        buf[2]=0x02;  //设置异常码为02-无效地址
                                                        len=3;
                                                        break;
                                                }
                                        case 0x06:           //写入单个寄存器
                                                if((buf[2]==0x00)&&(buf[3]<=0x05))   //寄存器地址支持0x0000-0x0005
                                                {
                                                        if(buf[3]<=0x04)
                                                        {
                                                                i=buf[3];                                //提取寄存器地址
                                                                regGroup[i]=buf[5];                //保存寄存器数据
                                                                led3=0;
                                                        }
                                                        len -=2;                 //长度-2以重新计算CRC并返回原帧
                                                        break;
                                                }
                                                else  
                                                {                                                        //寄存器地址不被支持,返回错误码
                                                        buf[1]=0x86;           //功能码最高位置1
                                                        buf[2]=0x02;           //设置异常码为02-无效地址
                                                        len=3;
                                                        break;
                                        }
                                        default:    //其他不支持的功能码
                                                    buf[1]=0x80;     //功能码最高位置1
                                                        buf[2]=0x01;     //设置异常码为01—无效功能
                                                        len=3;
                                                        break;
                                }
                            crc=GetCRC16(buf,len);           //计算CRC校验值
                                buf[len++]=crc>>8;           //CRC高字节
                                buf[len++]=crc&0xff;        //CRC低字节
                                rs485_UartWrite(buf,len);  //发送响应帧
                        }
                }
        }
    

    }

    void UartRxMonitor(u8 ms) //串口接收监控
    {
    static u8 USART2_RX_BKP=0; //定义USART2_RC_BKP暂时存储诗句长度与实际长度比较
    static u8 idletmr=0; //定义监控时间
    if(USART2_RX_CNT>0)//接收计数器大于零时,监控总线空闲时间
    {
    if(USART2_RX_BKP!=USART2_RX_CNT) //接收计数器改变,即刚接收到数据时,清零空闲计时
    {
    USART2_RX_BKP=USART2_RX_CNT; //赋值操作,将实际长度给USART2_RX_BKP
    idletmr=0; //将监控时间清零
    }
    else 接收计数器未改变,即总线空闲时,累计空闲时间
    {
    //如果在一帧数据完成之前有超过3.5个字节时间的停顿,接收设备将刷新当前的消息并假定下一个字节是一个新的数据帧的开始
    if(idletmr<5) //空闲时间小于1ms时,持续累加
    {
    idletmr +=ms;
    if(idletmr>=5) //空闲时间达到1ms时,即判定为1帧接收完毕
    {
    flagFrame=1;//设置命令到达标志,帧接收完毕标志
    }
    }
    }
    }
    else
    {
    USART2_RX_BKP=0;
    }
    }

    /*******************************************************************************

    • 函 数 名 : USART2_IRQHandler
    • 函数功能 : USART2中断函数
    • 输 入 : 无
    • 输 出 : 无
      *******************************************************************************/
      void USART2_IRQHandler(void)
      ……………………

    ………………………

    展开全文
  • 单片机串口通信485modbus.doc
  • C#读取串口数据封装, RS485、232 MODBUS通讯协议,亲测可用
  • RS485MODBUS V3.O STM8S103、R421A08、R221A04 和 R413D08 是继电器板,可通过 USB 端口从您的计算机进行控制。 它们允许您控制任何 12 伏电器,例如 LED 灯。 您可以额外安装一个 12 伏激活的 120/220 伏继电器。 ...
  • 【STM32】RS485 Modbus协议 采集传感器数据

    千次阅读 多人点赞 2020-06-28 16:46:00
    1、传感器:为液压传感器,12vDC,RS485数据输出,采用Modbus协议通信 2、根据传感器属性,电路主要是两部分,通信和电源 (1)485电路:由于485是半双工通信,需要控制收发,所以索性在把电路设计成自动收发电路 接...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,016
精华内容 2,406
关键字:

485modbus