精华内容
下载资源
问答
  • 交流通讯协议
    千次阅读
    2021-08-09 00:51:46

    充电桩平台通讯协议

    交运工业技术处

    2016 年9 月25 日

    目录

    1. 设备与业务接入模式3

    2. HTTP 原始报文格式4

    3. 平台报文一览5

    4. 平台报文详细6

    4.1. 请求报文6

    4.1.1. 开机报文101006

    4.1.2. 插卡报文102007

    4.1.3. 枪车连接报文103008

    4.1.4. 充电报文105009

    4.1.5. 结算报文1060011

    4.1.6. 状态报文2010012

    4.1.7. 数据请求报文4010014

    4.1.8. 数据发送报文4020015

    4.2. 返回报文16

    4.2.1. 锁机命令报文3010016

    4.2.2. 解机命令报文3020017

    4.2.3. 锁枪命令报文3030018

    4.2.4. 解枪命令报文3040019

    4.2.5. 充电命令报文3050020

    4.2.6. 中止充电命令报文3060021

    4.2.7. 数据更新命令报文3070022

    4.2.8. 召测命令报文3080023

    5. 数据定义24

    5.1. 计费标准数据24

    5.2. 黑名单数据24

    5.3. 白名单数据24

    第2 页

    本协议基于HTTP 协议(详见/Protocols/HTTP/1.0/spec.html)和

    json 数据格式(详见/json-zh.html),适合云平台与管理平台之间数

    据对接,及充电桩与各平台间的数据通信。

    1. 设备与业务接入模式

    HTTP/JSON

    终端 充 HTTP/JSON 充电桩

    HTTP 云

    终端 控 HTTP/JSON 充电桩 HTTP/JSON 站内

    平 管理

    平台

    充电桩

    HTTP/JSON HTTP/JSON

    图 1 业务接入模式

    设计原则

     使用标准HTTP 方法实现资源操作;

     采用json 作为API 输入输出;

     以json 输出错误信息。

    表 1 HTTP 方法

    HTTP 方法 描述

    POST

    GET 不采用

    表 2 返回码表

    HTTP 返回码 含义 内容描述

    200 OK 左示为服务器标准返回码。

    400 Bad Request 服务器端处理结果在HTTP

    更多相关内容
  • KELONGPowersoft交流电源监控管理系统前端智能设备通讯协议通讯协议内部标准,山特UPS串口通讯协议
  • 这是一个(完整w这是一个(完整word版)modbus通讯协议实例,亲测好用,欢迎大家下载交流
  • 基于DSP的CANopen通讯协议的实现、电子技术,开发板制作交流
  • 能够学习智能通讯网关的定义,功能构成,接口通讯支持,常用的协议实现,应用场景,系统集成时候的组网模式。 智能网关主要应用于工业现场设备规约转换,实现不同规约的数据采集与转发,满足工业、电力相关标准与...
  • 什么是通讯协议通讯协议又称通信规程,是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传送速度,传送步骤,检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守,它...

    什么是通讯协议?

    通讯协议又称通信规程,是指通信双方对数据传送控制的一种约定。约定中包括对数据格式,同步方式,传送速度,传送步骤,检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守,它也叫做链路控制规程。

    电脑与电脑之间的沟通必须讲述相同的语言,才能互相传输信息,自然资料在国际互联网上传递,每一份都要符合一定的规格(即是相同的语言),否则中国送出的资料,在美国那边要怎么收下呢?

    这些规格(语言)的规定都是事先在会议上讲好的,一般我们称之为“协议”(英文称为protocol),而这种在网络上负责定义资料传输规格的协议,我们就统称为通讯协议。

    一句话就是,双方按照同样的约定去做一件事情。

    如何定义通讯协议

    这里小飞哥只简单介绍一下思路及比较简单的通讯协议,让小伙伴们有个了解,学会举一反三。

    以MODBUS协议为例,我们看下一般协议的组成部分:

    拿16功能码,写多个寄存器指令为例:

    其中包括了:

    地址码:1字节

    功能码:1字节

    起始地址:2字节

    寄存器数量:2字节(即是数据段长度)

    字节数:寄存器数量 * 2

    寄存器值:数据

    CRC校验:2字节

    总结起来就是包含了地址码、功能码、数据长度、数据、校验码等要素

    数据发出去一般需要接收方有个回音,确认是否接收到数据及数据是否正确,也即是上面的相应PDU、错误响应

    模仿modbus协议,我们来制定字节的通讯协议,这里所说的通讯协议是应用层的,串口本身就是一种协议,采用以下的格式来定义:

    数据头(2字节)+数据长度(1字节)+功能码+数据+校验码(CRC16-MODBUS)

    数据头:可以采用常用的5A A5 AA 55 55 AA等,为什么采用这两个值呢,是有一定讲究的,我们增加数据头的目的是为了确认数据包是我们需要的,这个数据头受干扰出错的话要比较容易识别,从二进制来看

    0xaa是1010 1010

    0x55是0101 0101

    在通讯编码原理中,应该尽可能避免过多的重复0或1,因为当你的传输变成一个长0/1时,一个脉冲干扰就会将你的数据截断,整加误码的机会。

    这样,我们就以以下数据格式为例,进行解析:

    数据格式:

    AA 55 07 01 11 23 88 98 8A 9C

    CRC16-MODBUS校验计算

    这部分就不废话了,直接看代码就可以了,可以用查表法,也可以直接计算

    查表法:

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

    直接计算法:

    uint16_t CRC_Compute(uint8_t *puchMsg, uint16_t usDataLen) 
    { 
     uint8_t uchCRCHi = 0xFF ; 
     uint8_t uchCRCLo = 0xFF ; 
     uint32_t uIndex ; 
     while (usDataLen--) 
     { 
      uIndex = uchCRCHi ^ *puchMsg++ ; 
      uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; 
      uchCRCLo = auchCRCLo[uIndex] ; 
     } 
     return ((uchCRCHi) <<8 | (uchCRCLo) ) ; 
    }
    
    

    协议解析

    重头戏在如何解析协议,其实也简单,可以做一个状态机,不断切换状态就可以啦...

    本节我们使用的是串口中断+队列的方式,对数据进行解析,除此之外,MCU有DMA的话,强烈建议使用DMA以降低MCU负荷,后面再讲结合DMA的方式,还是使用的CUBEMX配置,配置比较简单,就直接掠过啦

    先来定义一些相关的变量,基本上就是一些宏定义和结构体变量之类的,采用命令与功能回调函数绑定的方式

    #define UART_RXBUFFER_SIZE 256
    #define UART_FRAME_SIZE  2
    
    /*命令码*/
    #define CMD_READREG  0x01
    #define CMD_WRITEDREG 0x02
    #define CMD_CONFIGURE 0x03
    #define CMD_IAP     0x04
    /*协议相关*/
    #define FRAME_LEN_POS  2//数据帧长度索引
    #define FRAME_CMD_POS  3//命令码索引
    #define FRAME_HEAD1 0xAA
    #define FRAME_HEAD2 0x55
    
    typedef enum {
     frame_head1status = 0,
     frame_head2status = 0x01,
     frame_lenstatus = 0x02,
     frame_datastatus = 0x03
    }_E_FRAME_STATUS;
    
    
    
    typedef struct {
     uint8_t len;  //数据接收长度
     uint8_t rxbuffer[UART_RXBUFFER_SIZE];//数据接收缓存
    
    }_S_UART_RX;
    
    
    typedef struct{
     uint8_t queue_head;//队列头
     uint8_t queue_tail;//对列尾
    }_S_QUEUE;
    
    typedef struct{
     uint8_t cmd;//命令
     uint8_t (*callback_func)(uint8_t cmd, uint8_t *msg, uint8_t len);//命令对应的函数
    
    }_S_FUNCCALLBACK;
    
    

    在串口中断中我们这么做:

    /**
      * @brief This function handles USART1 global interrupt.
      */
    void USART1_IRQHandler(void)
    {
      /* USER CODE BEGIN USART1_IRQn 0 */
     #if 0
      /* USER CODE END USART1_IRQn 0 */
      HAL_UART_IRQHandler(&huart1);
      /* USER CODE BEGIN USART1_IRQn 1 */
     #else
     if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_RXNE)!= RESET)
     {
      __HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE); //清除标志
      s_uart_rx[s_queue.queue_tail].rxbuffer[(s_uart_rx[s_queue.queue_tail].len)++] = (uint8_t)(USART1->DR & (uint8_t)0x00FF);
     }
     #endif
      /* USER CODE END USART1_IRQn 1 */
    }
    
    

    功能函数中我们主要封装以下几个函数,写的比较草率,核心思想是没问题的哈...

    /***********************************************
    *函数名称:User_UartIRQInit
    *函数功能:串口中断初始化
    *入口参数:CMD
    *返回参数:NULL
    *说明:
    *作用域:内部
    ***********************************************/
    void User_UartIRQInit(uint8_t CMD)
    {
     if(ENABLE==CMD)
     {
      __HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE);
     }
     if(DISABLE==CMD)
     {
      __HAL_UART_DISABLE_IT(&huart1,UART_IT_RXNE);
     }
    }
    

    顶层设计,我们不断轮训串口任务,主要是判断队列中是否有数据:

    /***********************************************
    *函数名称:User_UartPoll
    *函数功能:串口任务轮询
    *入口参数:CMD
    *返回参数:NULL
    *说明:
    *作用域:内部
    ***********************************************/
    uint8_t User_UartPoll(void)
    {
     if(0 == s_uart_rx[s_queue.queue_head].len)
     {
      return 0;
     }
     
     if(s_queue.queue_head == s_queue.queue_tail)
     {
      if(s_queue.queue_tail>UART_RXBUFFER_SIZE-1)
      {
       s_queue.queue_tail = 0;
      }
      else
      {
       s_queue.queue_tail++;
      }
     }
     
     for(uint8_t i = 0;i<s_uart_rx[s_queue.queue_head].len;i++)
     {
      User_UartDataParse(s_uart_rx[s_queue.queue_head].rxbuffer[i]);
     }
    
     s_uart_rx[s_queue.queue_head].len = 0;
     
     if(s_queue.queue_head == s_queue.queue_tail)
     {
      if(s_queue.queue_head>UART_RXBUFFER_SIZE-1)
      {
       s_queue.queue_head = 0;
      }
      else
      {
       s_queue.queue_head++;
      }
     }
     return 1;
    }
    

    重头戏在这个函数,里面是一个状态机,通过判断不同的数据,不断地切换当前状态:

    /***********************************************
    *函数名称:User_UartDataParse
    *函数功能:串口数据解析
    *入口参数:NULL
    *返回参数:NULL
    *说明:
    *作用域:内部
    ***********************************************/
    uint8_t User_UartDataParse(uint8_t data)
    {
     static uint8_t e_frame_status = frame_head1status;
     static uint8_t frame_len = 0;
     static uint8_t index = 0;
     static uint8_t rx_bufftemp[256] = {0};
     uint16_t crc_temp = 0;
    
     
     switch (e_frame_status){
      case frame_head1status: //判断数据头1
       if(data == FRAME_HEAD1)
       {
        e_frame_status = frame_head2status;
        rx_bufftemp[index] = data;
        index++;
       }
       else
       {
        e_frame_status = frame_head1status;
        index = 0;
        memset(rx_bufftemp,0,256);
       }
       break;
      case frame_head2status://判断数据头2
       if(data == FRAME_HEAD2)
       {
        e_frame_status = frame_lenstatus;
        rx_bufftemp[index] = data;
        index++;
       }
       else
       {
        e_frame_status = frame_head1status;
        index = 0;
        memset(rx_bufftemp,0,256);
       }
      break;
      case frame_lenstatus://判断数据长度
       if(data>0 && data <= 255)
       {
        e_frame_status = frame_datastatus;
        rx_bufftemp[index] = data;
        index++;
        
       }
       else
       {
        e_frame_status = frame_head1status;
        index = 0;
        memset(rx_bufftemp,0,256);
       }
       break;
      case frame_datastatus://接收数据
       if(index>0 && index <= 255)
       {
        rx_bufftemp[index] = data;
        index++;
    
        if(index == (rx_bufftemp[FRAME_LEN_POS] + 3))//根据数据长度判断接收一帧数据是否接收完成
        {
         crc_temp = rx_bufftemp[index-2]+(rx_bufftemp[index-1]<<8);
         if(crc_temp == CRC16(rx_bufftemp+FRAME_CMD_POS,index-5))//CRC校验相同
         {
           User_UartFrameParse(rx_bufftemp[FRAME_CMD_POS],rx_bufftemp,index);
           e_frame_status = frame_head1status;
           index = 0;
           memset(rx_bufftemp,0,256);
          User_UartFrameParseEnd();
         }
         else//不同
         {
          //校验值不同数据错误,执行错误逻辑,返回错误码等
         }
        }    
       }
       else
       {
        e_frame_status = frame_head1status;
        index = 0;
        memset(rx_bufftemp,0,256);
       }
      break;
       default:
        e_frame_status = frame_head1status;
        index = 0;
        memset(rx_bufftemp,0,256);
       break;
     }
    }
    

    接下来是对用的功能函数,这部分主要用到了回调函数的方式,命令码与任务绑定,随便定义了4组命令,小伙伴们可以根据自己的需要,修改即可,而不用动框架:

    /***********************************************
    *函数名称:User_ReadRegCallback
    *函数功能:
    *入口参数:
    *返回参数:NULL
    *说明:
    *作用域:内部
    ***********************************************/
    uint8_t User_ReadRegCallback(uint8_t cmd, uint8_t *msg, uint8_t len)
    {
     uint8_t TestData[5] = {0x01,0x02,0x03,0x04,0x05};
     User_UartFrameSend(cmd,TestData,msg,5);
    }
    /***********************************************
    *函数名称:User_WriteRegCallback
    *函数功能:
    *入口参数:
    *返回参数:NULL
    *说明:
    *作用域:内部
    ***********************************************/
    uint8_t User_WriteRegCallback(uint8_t cmd, uint8_t *msg, uint8_t len)
    {
     uint8_t TestData[5] = {0x01};
     User_UartFrameSend(cmd,TestData,msg,5);
    }
    /***********************************************
    *函数名称:User_ConfigCallback
    *函数功能:
    *入口参数:
    *返回参数:NULL
    *说明:
    *作用域:内部
    ***********************************************/
    uint8_t User_ConfigCallback(uint8_t cmd, uint8_t *msg, uint8_t len)
    {
     uint8_t TestData[5] = {0x01,0x02,0x03};
     User_UartFrameSend(cmd,TestData,msg,5);
    }
    /***********************************************
    *函数名称:User_IAPCallback
    *函数功能:
    *入口参数:
    *返回参数:NULL
    *说明:
    *作用域:内部
    ***********************************************/
    uint8_t User_IAPCallback(uint8_t cmd, uint8_t *msg, uint8_t len)
    {
     uint8_t TestData[5] = {0x01,0x02,0x03,0x04};
     User_UartFrameSend(cmd,TestData,msg,5);
    }
    _S_FUNCCALLBACK callback_list[]=
    {
        {   CMD_READREG,User_ReadRegCallback},
        {   CMD_WRITEDREG,User_WriteRegCallback},
        {   CMD_CONFIGURE,User_ConfigCallback},
        {   CMD_IAP,User_IAPCallback},
    
    };
    
    
    /***********************************************
    *函数名称:User_UartFrameParse
    *函数功能:串口功能响应函数
    *入口参数:NULL
    *返回参数:NULL
    *说明:
    *作用域:内部
    ***********************************************/
    void User_UartFrameParse(uint8_t cmd, uint8_t *msg, uint8_t len)
    {
     uint8_t cmd_indexmax = sizeof(callback_list) / sizeof(_S_FUNCCALLBACK);
      uint8_t cmd_index = 0;
     
     for (cmd_index = 0; cmd_index < cmd_indexmax; cmd_index++)
     {
      if (callback_list[cmd_index].cmd == cmd)
      {
       if(callback_list[cmd_index].callback_func != NULL)
       {
        callback_list[cmd_index].callback_func(cmd, msg, len);
       }
      }
     }
    }
    

    然后是回复函数:

    /***********************************************
    *函数名称:User_UartFrameSend
    *函数功能:串口发送数据组包
    *入口参数:NULL
    *返回参数:NULL
    *说明:
    *作用域:内部
    ***********************************************/
    uint8_t User_UartFrameSend(uint8_t cmd,uint8_t *pdata, uint8_t *msg, uint8_t len)
    {
     uint8_t index = 0;
     uint16_t crc_temp = 0;
     
     msg[index++] = FRAME_HEAD1;
     msg[index++] = FRAME_HEAD2;
     msg[index++] = len;
     msg[index++] = cmd;
    
     for(uint8_t i = 0;i<len;i++)
     {
      msg[index++] = pdata[i];
     }
     
     crc_temp = CRC16(msg+FRAME_CMD_POS,index-3);
     msg[index++] = crc_temp & 0x00FF;
     msg[index++] = crc_temp>>8 & 0x00FF;
    
     HAL_UART_Transmit(&huart1,msg,index,100);
     
     return  index;
    }
    
    

    到这里就完结了,还是比较简单的,希望能够帮到对数据解析还有些没迷茫的小伙伴

    经验交流

    扫码添加小飞哥好友即可,回复“进群”,进入嵌入式交流群,快来成为“人类高质量嵌入式开发者”吧

    展开全文
  • UPS通讯协议

    2013-10-22 19:41:29
    为了学习,我们来到这里。本文档是为了学习研究交流只用,版权归EATON所有,反对以此牟利。
  • 新版本科来协议图,含下载

    随着十四五规划的发布和2035年远景目标纲要出台,明确提出迎接数字时代,激活数据要素潜能。数字经济时代正在加速到来,流量是网络社会重要的数据载体,在当下被赋予了前所未有的价值。协议是网络的语言,透彻掌握协议知识,无论是对企业业务运维还是对安全防护而言,都是极为重要的“内家功夫”。

      了解未来四大趋势    速通新图三大看点  

    《网络通讯协议图2022版》是科来历年技术求索的浓缩,科来延续对新趋势与新数字秩序的关注,并将自身对技术趋势的思考深刻倾注于此。

    趋势一:数字化意全面觉醒,业务信任与安全需求扩大

    疫情新常态模式进一步催发了全球生产模式的深刻变革,集中式办公正在向分布式的企业转变,对业务信任与安全提出了更为高阶的挑战。

    科来利用流量分析技术让用户从“上帝”视角审视全局,通过全方向全流量的回溯分析,助力企业打破信息孤立,保障运维效率与安全。

    趋势二决策智能引领趋势,主动智能化运维演变加剧

    传统粗放式管理方式被摈弃,在未来两年,三分之一的大型企业将扩大主动化、智能化运维决策范围,以期在差异化竞争中取得更大优势。

    科来认为,对于企业核心竞争力提升的强有力支撑在于运维成熟度进阶与精细化管理的提升,而这对网络与业务的时效性、连续性也提出了更高的要求。科来以业务为中心的全网全指标真秒级监控能力为用户可持续的稳定高速增长夯实基础。

    趋势三:云能力持续演进,逐步成为IT运维必选项

    Gartner预测,到2025年云原生平台将成为95%以上的新数字化计划的基础,随着技术发展,云能力将持续进化,深刻赋能产业的优化与转型。企业网络云化已成为新趋势,新方向。智慧产业的落地、IT运营模式的升级,离不开虚拟化技术的支撑。

    科来对于云/虚拟化方向协议的梳理,能够有效赋能用户对云网的进一步理解,增强IT对网络的可观测维度,帮助用户提高和扩展云网纵深知识能力。同时,科来创新性提出了云网融合趋势下的运维与安全解决方案,助力用户执掌云端。

    趋势四:5G建进一步提速,移动互联势不可挡

    5G强力突破了人与人、人与机器、机器与机器之间的通信障碍,未来元宇宙的世界或许正在踏步而来,运营商业务进一步扩大与复杂化。

    科来的网络流量分析技术为其提供了强大的运维能力支撑与高可靠的网络安全保障,满足运营商“求全、求准、求稳”的网络需求。

    协议图免费领取方式

    关注科来公众号,回复关键词“协议图”获取资料

    展开全文
  • STM32的串口通讯协议

    千次阅读 2021-10-21 16:16:13
    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 在计算机科学里,大部分复杂...

    目录

    一、串口协议

    1.1 串口通信协议简介

    1.1-1 物理层 

    1.1-2 协议层

    1.2 STM32的USART简介

    二、USB/TTL转232串口方法

    2.1 三种接口简介

    2.2 转换方法

    2.3  "USB/TTL转232"模块工作原理

     三、参考资料


     

       本文主要讲解串口协议和RS-232标准,以及RS232电平与TTL电平的区别;介绍"USB/TTL转232"模块(以CH340芯片模块为例)的工作原理。

    一、串口协议

    1.1 串口通信协议简介

       串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。

       在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层协议层。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。

       物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输,eg:RS232、TTL高低电平。

       协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准,eg:串口数据包:起始位,数据位(8bit)、校验位、停止位。

    1.1-1 物理层 

        串口通讯的物理层有很多标准及变种,我们主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

       使用RS-232标准的串口设备间常见的通讯结构见图

                                                             串口通讯结构图

       在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。

    ①电平标准

       根据通讯使用的电平标准不同,串口通讯可分为TTL标准及RS-232标准

          通讯标准                         电平标准(发送端)
           5V TTL

                          逻辑1:2.4V-5V

                          逻辑0:0~0.5V

          RS-232

                         逻辑1:2.4V-5V

                         逻辑0:0~0.5V

       我们知道常见的电子电路中常使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑1,+15V表示逻辑0。使用RS232与TTL电平校准表示同一个信号时的对比见图

    ②RS-232信号线

       在最初的应用中,RS-232串口标准常用于计算机、路由与调制调解器(MODEN,俗称"猫")之间的通讯 ,在这种通讯系统中,设备被分为数据终端设备DTE(计算机、路由)和数据通讯设备DCE(调制调解器)。我们以这种通讯模型讲解它们的信号线连接方式及各个信号线的作用。

       在旧式的台式计算机中一般会有RS-232标准的COM口(也称DB9接口),见图

       其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的RS-232标准调制的。

       在这种应用场合下,DB9接口中的公头及母头的各个引脚的标准信号线接法见图

    DB9信号线说明(公头,为方便理解,可把DTE理解为计算机,DCE理解为调制调解器)

    序号名称符号数据方向说明
        1   载波检测DCDDTE➡DCEData Carrier Detect,数据载波检测,用于DTE告知对方,本机是否收到对方的载波信号
        2   接收数据RXDDTE⬅DCEReceive Data,数据接收信号,即输入。
        3   发送数据TXDDTE➡DCETransmit Data,数据发送信号,即输出。两个设备之间的TXD与RXD应交叉相连
        4数据终端(DTE) 就绪DTRDTE➡DCEData Terminal Ready,数据终端就绪,用于DTE向对方告知本机是否已准备好
        5    信号地GND-地线,两个通讯设备之间的地电位可能不一样,这会影响收发双方的电平信号,所以两个串口设备之间必须要使用地线连接,即共地。
        6数据设备(DCE)就绪DSRDTE⬅DCEData Set Ready,数据发送就绪,用于DCE告知对方本机是否处于待命状态
        7   请求发送RTSDTE➡DCERequest To Send,请求发送, DTE 请求 DCE 本设备向DCE端发送数据
        8   允许发送CTSDTE⬅DCEClear To Send,允许发送,DCE回应对方的RTS发送请求,告知对方是否可以发送数据
        9   响铃指示RIDTE⬅DCERing Indicator,响铃指示,表示DCE端与线路已接通

       上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXD与TXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可,见图

       串口线中的RTS、CTS、DSR、DTR及DCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。

    1.1-2 协议层

       串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其组成见图

    ①波特率 

       本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号(如前面讲解的DB9接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,上图中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、9600、115200等。

    ②通讯的起始和停止信号

       串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑0的数据位表示,而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。

    ③有效数据

    在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7或8位长。

    ④数据校验

       在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)偶校验(even)0校验(space)1校验(mark)以及无校验(noparity),它们介绍如下:

    • 奇校验要求有效数据和校验位中"1"的个数为奇数,比如一个8位长的有效数据为:01101001,此时总共有4个"1",为达到奇校验效果,校验位为"1",最后传输的数据将是8位的有效数据加上1位的校验位总共9位。
    •  偶校验与奇校验要求刚好相反,要求帧数据和校验位中"1"的个数为偶数,比如数据帧:11001010,此时数据帧"1"的个数为4个,所以偶校验位为"0"。
    • 0校验是不管有效数据中的内容是什么,校验位总为"0",1校验是校验位总为"1"。
    •  在无校验的情况下,数据包中不包含校验位。

    1.2 STM32的USART简介

       STM32芯片具有多个USART外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于USART,它还有具有UART外设(Universal Asynchronous Receiver and Transmitter),它是在USART基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART。

       USART满足外部设备对工业标准NRZ异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。USART支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC规范。

       USART支持使用DMA,可实现高速数据通信,USART在STM32应用最多莫过于"打印"程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑,用于在调试程序是可以把一些调试信息"打印"在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。

       STM32的USART输出的是TTL电平信号,若需要RS-232标准的信号可使用MAX3232芯片进行转换。

    二、USB/TTL转232串口方法

    2.1 三种接口简介

    ①USB接口

    USB通过USB电平工作

    USB电平:电源线是5V,为USB设备提供最大500mA的电流,它与数据线上的电平无关,数据线是差分信号,通常D+和D-在+400mV~-400mV间变化,除去屏蔽层,有4根线,分别是VCC、GND和D+、D-两根信号线。5V是USB的电源电压,给USB device供电用的。信号线对于2.0,D+比D-大200mV时为1,D-比D+大200mV时为0。
     

    ②TTL串口

    在这里插入图片描述

     单片机串口是TTL电平,所以叫TTL串口或UART 串口。

    TTL电平:+5V等价于逻辑“1”,0V等价于逻辑“0”(采用二进制来表示数据时)。这样的数据通信及电平规定方式,被称做TTL(晶体管-晶体管逻辑电平)信号系统。


    ③232串口

    232串口,通过232电平标准工作。 

    R232电平,负逻辑:
    逻辑1(MARK)=-3V~-15V
    逻辑0(SPACE)=+3~+15V

    S232 接口一共有 9 个引脚,分别定义是:
    1、载波检测 DCD;
    2、接收数据 RXD;
    3、发送数据 TXD;
    4、数据终端准备好 DTR;
    5、信号地线 SG;
    6、数据准备好 DSR;
    7、请求发送 RTS;
    8、清除发送 CTS;
    9、振铃提示 RI。我们要让这个串口和我们单片机进行通信,我们只需要关心其中的 2 脚 RXD、3 脚 TXD 和 5 脚 GND 即可,这三个引脚的名字和我们单片机上的串口名字一样,但是却不能直接和单片机对连通信。

    2.2 转换方法

    CH340等芯片是直接将USB信号转换为TTL电平或者TTL电平转换为USB信号。

    MAX232等芯片是将TTL转换为RS232信号或者将RS232信号转换为TTL.

     

    ①USB 转 UART(TTL) 原理:

    只需要在电路上添加一个 USB 转串口芯片,就可以成功实现 USB 通信协议和标准UART 串行通信协议的转换,比如 CH340T 这个芯片

    在这里插入图片描述

     用跳线帽把中间和下边的针短接在一起。右侧的 CH340T 这个电路很简单,把电源、晶振接好后,6 脚和 7 脚的 DP 和 DM 分别接 USB 口的 2 个数据引脚上去,3 脚和 4 脚通过跳线接到单片机的 TXD 和 RXD 上去。

    ②USB转232串口线原理:

    USB接口>>>CH340>>>MAX232>>>9针接口
    信号分析:
    电脑USB接口>>>电脑输出USB电平信号>>>CH340>>>TTL电平>>>MAX232芯片>>>电脑串口接口

    在这里插入图片描述

    在这里插入图片描述 

    在这里插入图片描述 

       其实 RS232 串口和 (TTL串口)UART 串口,它们的协议类型是一样的,只是电平标准不同而已,而 MAX232 这个芯片起到的就是中间人的作用,它把 UART 电平(TTL电平)转换成 RS232 电平,也把 RS232 电平转换成 UART 电平,从而实现标准 RS232接口和单片机 UART 之间的通信连接。
     

    2.3  "USB/TTL转232"模块工作原理

    USB转串口模块可以使用5V、3V3电压供电,需要将跳线帽进行安装。

    可以对USB转串口模块进行测试,将USB的电压引脚用跳帽接上,然后将RXD和TXD两个引脚用跳帽或者杜邦线接上。

     

    然后打开串口终端,点击“手动发送”或者“自动发送”,如果在接收区可以接收到数据,说明USB转串口模块工作正常,否则需要检查接线是否正确、电路板元器件是否损坏。

    下图是USB转串口模块的一些功能模块的标示,USB转串口电路板背后还预留了一些全信号输出的接口,可以将电线直接焊接在这些引脚上来使用预留的功能。
    即便管脚没有这么多,但功能都是差不多的。

     

     USB转串口电路板与单片机的接线图,VCC接线是为了单片机供电,USB转串口的RXD引脚与单片机的TXD引脚相连,USB转串口的TXD引脚与单片机的RXD引脚相连,两者的GND引脚直接相连。

     

     三、参考资料

    串口通讯协议_guankaer的工作室-CSDN博客_串口协议文章转载自http://www.cnblogs.com/firege/p/5805753.html20.1 串口通讯协议简介串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;...https://blog.csdn.net/cool9932/article/details/79419990?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163480459716780366581656%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163480459716780366581656&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-3-79419990.pc_search_result_cache&utm_term=%E4%B8%B2%E5%8F%A3%E5%8D%8F%E8%AE%AE&spm=1018.2226.3001.4187


    USB转TTL串口、USB转232串口、232串口转TTL串口_棒棒的博客-CSDN博客首先认识一下这3中接口:1,USB,通过USB电平工作USB电平:电源线是5V,为USB设备提供最大500mA的电流,它与数据线上的电平无关,数据线是差分信号,通常D+和D-在+400mV~-400mV间变化。2,232串口,通过232电平标准工作232电平:逻辑1(MARK)=-3V~-15V逻辑0(SPACE)=+3~+15V3,单片机串口是TTL电平,所以叫TTL串口。TTL电平:+5V等价于逻辑“1”,0V等价于逻辑“0”(采用二进制来表示数据时)。这样的数据通信及电平规https://blog.csdn.net/weixin_45456099/article/details/107500617?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163499821416780271539896%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163499821416780271539896&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-2-107500617.pc_search_result_cache&utm_term=USB%2FTTL%E8%BD%AC232&spm=1018.2226.3001.4187

     USB转串口CH340接线方法_嵌入式学徒之斋-CSDN博客_ch340接线USB转串口模块可以使用5V电压供电,需要将跳帽按下图安装。  USB转串口模块可以使用3.3V电压供电,需要将跳帽按下图安装。 可以对USB转串口模块进行测试,将USB的电压引脚用跳帽接上,然后将RXD和TXD两个引脚用跳帽或者杜邦线接上。然后打开串口终端,点击“手动发送”或者“自动发送”,如果在接收区可以接收到数据,说明USB转串口模块工作正https://blog.csdn.net/wangjiaweiwei/article/details/49612207?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163499967516780261925154%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=163499967516780261925154&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-49612207.pc_search_result_cache&utm_term=%22USB%2FTTL%E8%BD%AC232%22%E6%A8%A1%E5%9D%97%EF%BC%88%E4%BB%A5CH340%E8%8A%AF%E7%89%87%E6%A8%A1%E5%9D%97%E4%B8%BA%E4%BE%8B%EF%BC%89%E7%9A%84%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E3%80%82&spm=1018.2226.3001.4187

    展开全文
  • PC与三菱PLC之间的RS232通讯协议

    千次阅读 2021-07-29 04:47:58
    1、交流QQ:458362670,PC与三菱PLC之间的RS232通讯协议,一、VC与PLC的串口通讯主要操作: 1、对位元件和字元件状态读操作; 操作对象元件:PLC内部的X、Y、M、S、T、C、D元件 命令通用格式: STX CMD0 AD...
  • 微信公众号“智物客”和您免费分享物联网、智慧城市相关技术和项目解决方案。本文从物联网体系各层协议入手,重点分析了物联网体系常用的通讯协议,在下半部分,笔者将分享物联网体系的通信协议。
  • 通过通讯协议来理解通讯实体之间传送的二进制码的含义(举个例子:我们人们交流沟通所使用的语言) 那么语言包括什么呢?就包括了和通讯协议差不多的性质: 语法 指通信中数据的结构,格式及数据表达的顺序,比如...
  • ODrive 通讯协议

    千次阅读 2019-12-03 14:40:24
    ODrive通讯协议 与ODrive进行通讯需要对通讯端点进行一系列操作。理论上,端点上的数据可以是以任何方式序列化的任何类型的数据。数据包采用默认的序列化方式,对于您自定义的数据包,您必须自己去进行反序列化。...
  • 这是一个串行口RS485通讯协议通讯协议实例,遵循modbus规范亲测好用,欢迎大家下载交流学习;这是一个串行口RS485通讯协议通讯协议实例,遵循modbus规范亲测好用,欢迎大家下载交流学习;这是一个串行口RS485通讯...
  • 串口通讯协议

    万次阅读 多人点赞 2018-03-02 10:02:47
    文章转载自http://www.cnblogs.com/firege/p/5805753.html20.1 串口通讯协议简介串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师...
  • UART串口通讯协议解析

    万次阅读 2021-02-26 11:44:04
    UART串口通讯协议解析概述接口通信协议 概述 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行...
  • 影印版文件大,看的也累,翻译软件也没法用,原版资料更方便
  • 1 通讯步骤 1.1 第一问 OPC Client和OPC Server之间通讯谁是主动的? 答:当然是OPC Client。 1.2 第二问 OPC Client第一次动作做了什么? 答:从大多数OPC Client行为来看,一是自动遍历本机已注册的OPC Server列表...
  • XMPP即时通讯协议

    千次阅读 2016-09-29 16:19:36
    可扩展消息与存在协议)是目前主流的四种IM(IM:instant messaging,即时消息)协议之一,其他三种分别为:即时信息和空间协议(IMPP)、空间和即时信息协议(PRIM)、针对即时通讯和空间平衡扩充的进程开始协议SIP...
  • 目 录 一、 术语... 3 二、 系统架构...... 2.1 系统物理架构......2.1.1 系统建设目标......2.1.2 系统架构说明......2.2 网络安全说明......三、 EMS与储能主站需求响应业务Modbus_EngReq通讯协议... 6 3.1 MODBU...
  • 前言对于应用层通讯协议而言,目前流行的协议虽然可以很好地支持业务的快速迭代,但是不可否认存在安全性、可拓展性等问题。在消息队列或者微服务框架中,利用自定义协议提高通讯效率很常见的现象。是否你也曾想...
  • 附件内容提供的4位数码管串口电压表设计提供说明文档,上位机软件,通讯协议说明都有,基于ATmega48和4位数码管设计,一直想研究,又没有时间细看,主要是通讯协议的部分。现在分享出来,就等你抽空研究分享心得。 4...
  • 大族激光打标机与西门子300以太网通讯协议 技术交流 资源共享 博主QQ:68823886 原创文章,转载请注明:转载自莫如技术团队 本文链接地址:http://mooru.cn/19029.html
  • Modbus通讯协议从一窍不通到原来如此

    千次阅读 多人点赞 2021-07-15 15:23:20
    分解模块概念(细节步骤,包括什么东西,怎么定义和运作的) 通信就是交流协议就是交流的规范或者语言。Modbus简单来说就是主机和远程设备的交流语言。工业上,比如我想获得工厂温度、湿度信息,那我先通过传感器...
  • 水资源SZY206-2016通讯协议应用心得

    千次阅读 2019-07-19 20:14:16
    水资源SZY206-2016通讯协议是国家制定的水资源监控标准数据通讯协议,用于遥测终端机与网络平台之间数据通讯。我将此协议用于公司产品--遥测终端机上,并取得南京水文局检测报告,对于此协议的了解也算颇为熟悉。 ...
  • RS458和modbus通讯协议

    千次阅读 2019-03-09 22:01:39
    458和modbus 协议分为硬件层协议和...458通讯是在硬件层实现的通讯协议,可以使用仪表进行测量,它需要解决的是0和1传输的问题.例如MCU输出的是TTL电平(0v,5v),假设MCU使用一根先实现数据传输,而458就是把这根线的传...
  • 详解去中心化的DIM即时通讯协议

    千次阅读 2019-08-22 17:41:25
    DIM打造的去中心化即时通讯协议能够用于跨链吗?和Cosmos的跨链或Polkadot的跨链协议有什么区别? Moky:您提到的这两个协议主要是用来解决不同区块链之间的数据交换问题的,而且它们也都是基于区块链的。换句话说...
  • 网络通讯协议和分层

    2017-10-14 18:20:15
    网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合, 是一种网络通用语言,为连接不同操作系统和不同硬件体系结构的互联网络引提供通信支持。   例如,网络中一个微机用户和一个大型主机的...
  • 直流桩通讯协议—1.0 GBT 27930简析

    千次阅读 2021-07-27 16:31:12
      GBT 27930是基于SAE J1939协议的,举一个具体的报文例子来说明它的应用。其他的报文都是类似的,举一反三即可。 1、动力蓄电池充电参数报文BCP   首先这个报文的PGN是000600H,注意,这里的PGN其实指的是PF段...
  • 【知识分享】Modbus通信协议详解

    千次阅读 2022-06-04 14:07:19
    通信就是双方或多方的交流,通信协议就是规定双方或多方需要共同遵守的交流方式。比如现在规定两个人需要用数字来代表文字,目前只定义了1表示“我”,2表示“你”,3表示“他”,然后现在两个人中有个人说了1,另一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,086
精华内容 15,234
热门标签
关键字:

交流通讯协议