📄 hart.c
字号:
#include <msp430x16x.h>
#include <string.h>
#define byte unsigned char
extern byte x1;
extern byte send[100];
extern byte pre_num; //前导符数
extern byte short_addr ;
extern byte long_addr[5];
extern byte cmd_num;
extern byte status1,status2;
extern byte send_bytes;
extern byte resp_num;
/*该函数用于从指定的位置开始计算校验和,逐个数据进行异或运算.第一个参数指向要进行校验和计算的
第一个数据,第二个参数是参与计算的数据个数,返回值返回计算的结果.*/
byte Checksum(byte *s , byte nbytes)
{
byte i,check;
byte *p;
for (i=1, check=0, p=s; i<=nbytes; ++i) check ^= *p++;
return(check);
}
/*通过串口发送数据,第一个参数指向需要发送数据的首地址,第二个参数说明需要发送数据的字节数*/
void com_send(byte *send, byte send_bytes)
{
byte *send_ptr;
send_ptr = send;
for(int i=0;i<send_bytes;i++)
{
while ((IFG1 & UTXIFG0) == 0); //等待上一个字节发送完毕
TXBUF0 = *send_ptr++;
}
}
/*该函数用于按HART协议的格式生成待发送的数据帧send[].第一个参数为指向响应数据区首字节的
指针,第二个参数为响应数据的字节数,第三个参数是指向本从机长结构地址,第四个参数是命令号*/
void hart_resp( byte *resp_data, byte resp_num, byte *addr ,byte cmd_num)
{
byte i,j;
byte *r_d;
byte *a;
r_d = resp_data ;
a = addr;
for ( i=0; i<pre_num; ++i) //pre_num是接收到数据帧中前导符的个数,响应时前导府数同主机发送给从机数据帧中前导符个数相同
send[i] = 0xFF;
switch(x1) //判断是长结构还是短结构
{
case 0: return;
case 1: send[i++] = 0x06; //短结构时
send[i++] = short_addr; //使用短地址
break;
case 2: send[i++] = 0x86; //长结构时
for(j=0; j<5; ++j) send[i++] = *a++; //使用长地址
break;
}
send[i++] = cmd_num; //填充命令号
send[i++] = resp_num + 2;//填充字节数
send[i++] = status1 ; //填充状态位1
send[i++] = status2 ; //填充状态位2
for(j=1 ; j<=resp_num; ++j) send[i++] = *r_d++;
send[i] = Checksum((send + pre_num), i-pre_num); //填充校验字节
send_bytes = i+1; //计算数据帧的总长度
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -