第二章 HART软件设计 — HART协议代码

本文介绍HART协议帧的结构,包括导言字节、起始字节、地址、命令、数据总长度、状态字节、数据字节和校验位。以MSP430F149单片机为例,阐述了串口配置,并讲解了主循环函数中的数据接收、发送和解析。HART协议常用于智能变送器和阀门定位器,与Modbus类似,适用于4-20mA电流环路产品。
摘要由CSDN通过智能技术生成

第二章 HART软件设计 — HART协议代码

在这里插入图片描述

一、HART协议帧

上文我们简单介绍了HART硬件设计,这章我再简单的介绍一下HART协议
在这里插入图片描述
HART协议的帧格式以8位为一个字节进行编码,对每个字节加上一个起始位、一个奇偶校验位和一个停止位以串行方式进行传输。通常采用UART(通用异步接收/发送器)来完成字节的传输。由于数据的有无和长短不恒定,所以HART数据的长度不能超过25个字节。
(1)PREAMBLE 导言字节,一般是5~20个FF十六进制字节。
(2)START 起始字节,他将告之使用的结构为“长”还是“短”、消息源、是否是“突发”模式消息。主机到从机为短结构时,起始位为02,长帧时为82。
(3)ADDR 地址字节,他包含了主机地址和从机地址,短结构中占1字节,长结构中占5字节。
(4)COM 命令字节,他的范围为253个,用HEX的0~FD表示。31,127,254,255为预留值。
(5)BCNT 数据总长度,他的值表示的是BCNT下一个字节到最后(不包括校验字节)的字节数。接收设备用他可以鉴别出校验字节,也可以知道消息的结束。因为规定数据最多为25字节,所以他的值是从0~27。
(6)STATUS 状态字节,他也叫做“响应码”,顾名思义,他只存在于从机响应主机消息的时候,用2字节表示。他将报告通讯中的错误、接收命令的状态(如:设备忙、无法识别命令等)和从机的操作状态。
(7)DATA 数据字节,首先我想说明的是并非所有的命令和响应都包含数据字节,他最多不超过25字节(随着通讯速度的提高,正在要求放宽这一标准)。
(8)CHK 奇偶校验,方式是纵向奇偶校验,从起始字节开始到奇偶校验前一个字节为止。另外,每一个字节都有1位的校验位,这两者的结合可以检测出3位的突发错误。
举例:
短帧
主机到从机
FF FF FF FF FF 02 80 00 00 82
FF FF FF FF FF 导言字节
02 代表短帧
80 地址
00 命令
00 数据长度
82 校验位
从机回复
FF FF FF FF FF 06 80 00 0E 00 00 FE 00 57 05 05 05 02 00 00 11 00 04 33
FF FF FF FF FF 导言字节
06 定界符
80 地址
00 命令
0E 数据长度
00 00 表示OK
FE 数据的头字节
00 制造商ID
57 制造商设备类型
05 请求的前导符数
05 通用命令文档版本号
05 变送器规范版本号
02 设备软件版本号
00 设备硬件版本号
00 设备标志
11 00 04 设备序号
33 校验位
在这里插入图片描述
详细指令含义要参要HART协议的命令手册,这里不一一举例
在这里插入图片描述

二、单片机串口配置

本文以MSP430F149示例

void UART1_Init(void)
{
   
  U1CTL|= CHAR | PENA;             //复位SWRST,8位数据模式
  U1TCTL|=SSEL1;                      //SMCLK为串口时钟
  U1BR1=baud_h;                       //BRCLK=4MHZ,Baud=BRCLK/N
  U1BR0=baud_l;                        //N=UBR+(UxMCTL)/4
  U1MCTL=0;                        	    //微调寄存器为0,波特率1200bps
  ME2|=UTXE1;                         //UART1发送使能
  ME2|=URXE1;                         //UART1接收使能
  U1CTL&=~SWRST;
  IE2|=URXIE1;                        //接收中断使能位
 
  P3SEL|= BIT6 + BIT7;            //设置IO口为第二功能模式,启用UART功能
  P3DIR|= BIT6;                       //设置TXD1口方向为输出           
}

HART协议帧是一个标准UART帧,该帧包含一个起始位、8位数据、一个奇偶校验和一个停止位。
要注意校验允许位。
波特率是1200b/s

三、主循环函数

等待接收数据

void HartOperationMain(void)
{
   
	// 判断数据是否发送完成
	if((HartTransferFlag & COMM_STATE_TX_COMPLETE) == COMM_STATE_TX_COMPLETE)
	{
   
		// 清除发送完成标志
		HartTransferFlag &= (~COMM_STATE_TX_COMPLETE);
		
		// 数据发送完成,进行数据接收
		HartStartReceiveCommand();
	}
	
	// 判断数据是否接收完成
	if((HartTransferFlag & COMM_STATE_RX_COMPLETE) == COMM_STATE_RX_COMPLETE)
	{
   
		// 清除接收完成标志
		HartTransferFlag &= (~COMM_STATE_RX_COMPLETE);
		
//		// 数据接收完成,进行数据解析处理,如有需要,生成新的命令
//		HartFrameResolution();
		
		// 如解析数据成功,发送生成的命令帧
		if(HartFrameResolution() == TRUE)
		{
   
			// 侦听载波,确保传输路径上的数据已经传输完成
			//while((Get_OCD & 0x01) == 0x01);
			
			// 开始发送数据
			HartStartSendCommand();
		}
		else    // 如解析数据失败,继续接收数据
		{
   
			HartTransferFlag = COMM_STATE_READY;
			
			HartStartReceiveCommand();	// 开始接收数据
		}
	}	
	return;
}

发送数据

void HartStartSendCommand(void)
{
   
    // 判断通讯接口是否为空闲状态
    if((HartTransferFlag | COMM_STATE_READY) == COMM_STATE_READY)
    {
   
      // 设置计数差异为0,开始计时,用于判断通讯是否超时
      TimerOutSoftCountus = TimerSoftCountus;
      
      // 置为调制状态
      INRTS_Low;
      
      delay_ms(5);
      // 设置为调制状态后,延时5ms,等待信号主机HART达到解调要求
      //for(nTime = TimerSoftCountus; TimerSoftCountus - nTime < 5*1e3;);
      
      // 清除空闲标志,设置发送忙标志
      HartTransferFlag &= (~COMM_STATE_READY);
      HartTransferFlag |= COMM_STATE_BUSY_TX;
      
      // 设置通讯标志,即发送的数据结构
      CommunicationFlag = BllWethFlag | DataOutFlag | DataCouFlag;
      
      // 发送数据
      sendData(HartSenBuffer,HartSenCount);
      //sendData(testRead,0x16);
      delay_ms(20);
      //sendData(HartSenBuffer,HartSenCount);
      //HAL_UART_Transmit_IT(&HartUsart, HartSenBuffer, HartSenCount);//stm32如果用了HAL库 就用这个发送
      // 数据发送完成,清除发送忙标志
      HartTransferFlag &= (~COMM_STATE_BUSY_TX);
      
      // 设置数据发送完成标志
      HartTransferFlag |= COMM_STATE_TX_COMPLETE;
    }
	
    return ;
}

数据解析

uint32_t HartFrameResolution(<
  • 38
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include "use.h" #include "Ver.H" #include #include #include #include "include.h" /******************************************************************* 1、菜单中这几个参数项需要读出和修改: P1中的:L,H,E,dr,P P2中的:Ed,SF,bo 一共7个参数项; ---这7个参数项不知道用什么命令来进行读写? 请你帮助考虑一下。 2、HART命令中,有如下命令应该要用到: ⑴ 0#命令---读标识码 (好像是个广播命令) ⑵ 3#命令---读主变量电流(测量值) ⑶ 6#命令---置随选地址(确定工作模式) ⑷ 15#命令---读主变量输出信息(上下限值) ⑸ 40#命令---进入/退出电流模式 ⑹ 41#命令---执行设备自检 ⑺ 42#命令---执行设备复位 ******************************************************************/ //前面的4个地址是固定的,后面一个是可以改的!用MP1.ADR 代替了! //#define adr0 0x02 //#define adr1 0x23 //#define adr2 0x34 //#define adr3 0x45 //#define MAX_0xff 5 //前导符的个数! //#define HART_VER 5 // 版本 //---------------------------------------------------------------------------------- //static unsigned char fHART_LONG_ADR=0; //=0 短地址标至;=1 是长地址! //static unsigned char cnt_0xff=MAX_0xff; //主机发送0XFF的个数,从机回复添加相同的个数 ! //************************************************************************** extern unsigned char cnt_0xff; //主机发送0XFF的个数,从机回复添加相同的个数 ! extern unsigned char fHART_LONG_ADR; //=0 短地址标至;=1 是长地址! //--------------------------------------------------------------------------------------------- unsigned char HART_Get_FF(unsigned char *p){ memset(p,0xff,cnt_0xff); return cnt_0xff;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值