HART协议命令与UART串口解析

HART协议详解:
https://blog.csdn.net/weixin_53403301/article/details/127362347

#include<stdio.h>
#include<stdint.h>
#include <string.h>typedef struct
{uint8_t PREAMBLE[5];uint8_t START;uint8_t ADDR[5];uint8_t COM;uint8_t BCNT;uint8_t STATUS[2];uint8_t DATA[25];uint8_t CHK;
}HART_Struct;HART_Struct trans_HART_to_Struct(uint8_t * buf)
{HART_Struct HART_Stu;uint8_t i=0;uint8_t START_Num=0;uint8_t COM_Num=0;uint8_t CHK_Num=0;uint8_t Check_Sum=0;  if(buf[0]==0xFF){                for(i=0;i<6;i++){            if(buf[i]!=0xFF){HART_Stu.START=buf[i];START_Num=i;                break;}START_Num=i;}if(START_Num<2){return HART_Stu;}for(i=0;i<START_Num;i++){HART_Stu.PREAMBLE[i]=buf[i];}if(HART_Stu.START<0x10){COM_Num=START_Num+2;            }else{COM_Num=START_Num+6;            }for(i=0;i<COM_Num-START_Num-1;i++){HART_Stu.ADDR[i]=buf[START_Num+1+i];}HART_Stu.COM=buf[COM_Num];HART_Stu.BCNT=buf[COM_Num+1];CHK_Num=COM_Num+HART_Stu.BCNT+2;HART_Stu.CHK=buf[CHK_Num];for(i=START_Num;i<CHK_Num;i++){Check_Sum=Check_Sum^buf[i];}if(HART_Stu.CHK==Check_Sum){if(HART_Stu.BCNT>0){if(HART_Stu.BCNT>1 && (HART_Stu.START&0x0F)==0x06){                  for(i=0;i<2;i++){HART_Stu.STATUS[i]=buf[COM_Num+2+i];}for(i=0;i<HART_Stu.BCNT-2;i++){HART_Stu.DATA[i]=buf[COM_Num+4+i];}}else{for(i=0;i<HART_Stu.BCNT;i++){HART_Stu.DATA[i]=buf[COM_Num+2+i];}}}else{return HART_Stu;}}else{return HART_Stu;}}else{return HART_Stu;}return HART_Stu;
}int8_t trans_HART_to_Buf(HART_Struct HART_Stu,uint8_t * buf)
{uint8_t i=0;uint8_t START_Num=0;uint8_t COM_Num=0;uint8_t CHK_Num=0;uint8_t Check_Sum=0;if(HART_Stu.PREAMBLE[0]==0xFF){for(i=0;i<6;i++){            if(HART_Stu.PREAMBLE[i]!=0xFF){buf[i]=HART_Stu.START;START_Num=i;                break;}            START_Num=i;}if(START_Num<2){return -1;}for(i=0;i<START_Num;i++){buf[i]=HART_Stu.PREAMBLE[i];}        if(HART_Stu.START<0x10){COM_Num=START_Num+2;}else{COM_Num=START_Num+6;}CHK_Num=COM_Num+HART_Stu.BCNT+2;buf[START_Num]=HART_Stu.START;for(i=0;i<COM_Num-START_Num-1;i++){buf[START_Num+1+i]=HART_Stu.ADDR[i];}buf[COM_Num]=HART_Stu.COM;buf[COM_Num+1]=HART_Stu.BCNT;buf[CHK_Num]=HART_Stu.CHK;if(HART_Stu.BCNT>1 && (HART_Stu.START&0x0F)==0x06){for(i=0;i<2;i++){buf[COM_Num+2+i]=HART_Stu.STATUS[i];}for(i=0;i<HART_Stu.BCNT-2;i++){buf[COM_Num+4+i]=HART_Stu.DATA[i];}}else{for(i=0;i<HART_Stu.BCNT;i++){            buf[COM_Num+2+i]=HART_Stu.DATA[i];}}for(i=START_Num;i<CHK_Num;i++){Check_Sum=Check_Sum^buf[i];}if(HART_Stu.CHK==Check_Sum){return 1;}else{return -2;}}else{return -1;}return 0;
}int main(void)
{unsigned char list[41]={0xFF,0xFF,0xFF,0xFF,0xFF,0x86,0xA6,0x06,0xBC,0x61,0x4E,0x01,0x07,0x00,0x00,0x06,0x40,0xB0,0x00,0x00,0x45};HART_Struct a;uint8_t buf[41];    memset(buf,0,sizeof(buf)/sizeof(buf[0]));a=trans_HART_to_Struct(list);printf("%02X\n",a.CHK);printf("%d\n",trans_HART_to_Buf(a,buf));printf("%02X\n",buf[8]);for(uint8_t i=0;i<41;i++){if(buf[i]==list[i]){}else{printf("ERROR\n");break;}}
}

HART协议命令与UART串口解析相关推荐

  1. UART串口通讯协议解析

    UART串口通讯协议解析 概述 接口 通信协议 波特率 示例 最后 概述 通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART ...

  2. RS485,uart串口加瑞芬68协议

    文章目录 一.uart串口协议(数据传输协议) 1.简介 (1).RS485:电器特性 (2).传输格式 2.代码 (1).代码vivado备份文件夹里 (2).模块描述(输入输出变量整理) 二.瑞芬 ...

  3. STM32从零到一,从标准库移植到HAL库,UART串口1以DMA模式收发不定长数据代码详解+常见问题 一文解析

    前言 本文的参考资料 感谢提供标准库版本的CSDN同学:这两篇文章至少是我看过的最详细的标准库配置DMA版本.而且代码实测稳定能用. STM32 | DMA配置和使用如此简单(超详细)_...| .. ...

  4. FPGA实现uart串口协议

    reference:正点原子视频教程 具体代码请参考B站正点原子官方 UART串口通信原理 是一种采用异步串行通信方式的通用异步手法传输器. 因为是异步通信所以,使用的时候要进行同步到系统时钟下,不然 ...

  5. 通信协议详解(一):UART串口(协议+数据格式+设计实现)

    uart串口通信协议及verilog实现 文章目录 一.uart串口通信简介 二.串口传输 1.数据协议 2.整体架构 三.串口传输实现 1.发送模块 2.接收模块 四.串口收发仿真 总结 一.uar ...

  6. uart串口通信传输协议

    一.Uart串口通信 uart串口通信是一种异步串行全双工通信方式,tx端用于数据发送:rx端用于数据接收.信号线在空闲时为高电平. 异步通信是按字符传输的.每传输一个字符就用起始位来收.发双方的同步 ...

  7. 【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程

    [嵌入式硬件芯片开发笔记]HART协议调制解调芯片AD5700配置流程 XTAL_EN接地,CLK_CFG的两个引脚由同一个GPIO控制 初始时HART_CLK_CFG输出低电平 由RTS引脚控制调制 ...

  8. ESP32 UART串口通信

    零. 声明 本专栏文章我们会以连载的方式持续更新,本专栏计划更新内容如下: 第一篇:ESP-IDF基本介绍,主要会涉及模组,芯片,开发板的介绍,环境搭建,程序编译下载,启动流程等一些基本的操作,让你对 ...

  9. 何谓”透传“? UART串口WIFI模块做”透传“的目的及其局限性

    前言 本文从UART串口型WIFI模组的"透传"概念的本质入手,解释了"透传"的实际机理,点出了UART串口型模组的"透传",其目的是为了避 ...

  10. 总线协议一(UART/RS232/RS485/IIC/SPI)

    目录 基础概述: 一.UART(为串口通信方式) 二.RS232协议 三.RS485协议 四.I2C总线协议 五.SPI总线 六.I2C和SPI的区别 基础概述: 总线的本质就是一根导线,传递的是电信 ...

最新文章

  1. 手动部署 Ceph Mimic 三节点
  2. MyBatis 实际使用案例-settings
  3. 天猫首页迷思之-jquery实现左侧广告牌图片轮播
  4. kaldi windows安装_kaldi在Windows下的使用
  5. AE合成自动智能剪裁脚本:Auto Crop for Mac
  6. Ros学习——roslaunch
  7. Add-In运行机制解析(下)
  8. vue项目初始化时npm run dev报错webpack-dev-server解决方法
  9. 组装自己的php框架,搭建自己的PHP框架
  10. 煤矿行业设备管理系统
  11. Tomcat默认端口,关闭不必要的安全隐患
  12. php添加开机启动脚本_php-fpm开机自动启动Shell脚本
  13. 使用VSCode创建Java项目
  14. jQuery MiniUI, 企业级Web开发
  15. 颜色对照表(五)(16进制、RGB、CMYK、HSV、中英文名)
  16. 微信无法绑定手机号的解决方案
  17. 南阳oj 57题------6174问题
  18. 2010爆牙笑话第一季!【转】
  19. 1153: 简易版最长序列 C语言
  20. 关于Visual Assistant X助手在定位函数及结构体成员变量不准确的问题

热门文章

  1. 【无线网络技术】星链计划(StarLink)
  2. NLP-文本分类(2)
  3. blackberry 9630CDMA写号教程
  4. HCP数据的下载,以及头动文件和CSF文件的所在位置
  5. linux 卸载nvidia显卡驱动,Ubuntu 16.04 卸载Nvidia显卡驱动和cuda
  6. 计算机方法学,浅谈计算机教学的方法
  7. Android 自定义控件 Demo合集
  8. [e袋购APP]高校物业管理的特点
  9. Redhat开机丢失引导
  10. 硬件设计论坛_零基础学硬件工程师到哪里去培训 上EDA365电子论坛