⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hart.c

📁 本人上载的几个.c文件为自己所写的代码,是关于自动化设备广泛使用的HART协议的主机与从机之间的通信过程(通过串口). hart.c-----包含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 + -