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

📄 txd.c

📁 modbus驱动程序.rar
💻 C
字号:
发送文件txd.c



#include "ModBus.h"
//--------公有函数和变量-------
StrTxd xdata sys_txd;
/****************************************/
uint8 lchksum(uint8  data_len);    //求LENTH_SUM函数
void txd_sta(void);    //发送系统告警信息
void txd_man(void);    //发送厂家信息
void txd_uni(uint8 cid2);  //发送系统通信信息
/******************************************/
void package(void);    //数据打包成ASCII码
void chksum (void);    //求校验和
void com(void);        //公共的发送函数
/******************************************/
uint8 lchksum(uint8  data_len)
{
    uint8  sum,temp1;
    sum = 0;
    if (data_len)
    {
        sum = data_len & 0x0f;
        temp1 = (data_len & 0xf0)>>4;
        sum += temp1;
        sum = sum %16;
        sum = (~sum)+1;
        sum = sum <<4;
    }

    return sum;
}
/******************************************/
void package(void)
{
    uint8  i;
    uint8  temp1,temp2;

    sys_txd.pool[0] = FRAME_START;

    for(i = 1;i < POOLLEN; i++)
    {
       if( (sys_txd.combuf[i] == 0xaa ) && (sys_txd.combuf[i+1] == 0x55 ) )  //结束标志
       {
              sys_txd.pool[i*2-1] = FRAME_END;
              break;
          }
        else
        {
              temp1 = sys_txd.combuf[i];
              temp2 = temp1 & 0x0f;
              temp1 = temp1 & 0xf0;
              temp1 = temp1>>4;
              sys_txd.pool[i*2-1] = (temp1>0x09)?(temp1+0x37):(temp1+0x30);
              sys_txd.pool[i*2]  = (temp2>0x09)?(temp2+0x37):(temp2+0x30);
          }
    }
}
/******************************************/
void chksum (void)
{
      uint8  i;
      uint8  sumh,suml,temp;
      uint16  sum = 0;

      for(i = 1;i < POOLLEN;i++ )
    {
         if( sys_txd.pool[i] == FRAME_END )
           {
            temp = i;
           break;
         }
       else
       {
              sum += sys_txd.pool[i];    //溢出部分不用考虑
        }
    }

      sum = (~sum) + 1;//取反+1
      sumh = (uint8)(sum/256);//高8位
      suml = (uint8)sum;
      i = temp;

      temp = (sumh&0xf0)>>4;
      temp = (temp>0x09)?(temp+0x37):(temp+0x30);
      sys_txd.pool[i]  =  temp;

      temp = (sumh & 0x0f);
      temp = (temp>0x09)?(temp+0x37):(temp+0x30);
      sys_txd.pool[i+1] =  temp;

      temp = (suml&0xf0)>>4;
    temp = (temp>0x09)?(temp+0x37):(temp+0x30);
      sys_txd.pool[i+2] = temp;

    temp = (suml&0x0f);
      temp = (temp>0x09)?(temp+0x37):(temp+0x30);
      sys_txd.pool[i+3] = temp;

      sys_txd.pool[i+4] = FRAME_END;

      sys_txd.txd_len = i+4;

      return;
}
/******************************************/
void com(void)
{
    uint8  i;
    uint8  j;
    
    EA = 0;
//    RS485EN = 1;    //使用485通信的时候使用
    for( i = 0;i <= sys_txd.txd_len;i++ )
    {
        SBUF = sys_txd.pool[i];
        while(TI==0);
        TI = 0;
        if( sys_txd.pool[i] == FRAME_END )
        {
            for( j=0;j <= sys_txd.txd_len;j++ )
            {
                 sys_txd.pool[i] = 0;            //对已经发送的数据清0
            }
        }
    }
//    RS485EN = 0;
//    RI = 0;  //注意,如果485的接收使能一直有效,必须要这一行解决
    EA = 1;
}
/******************************************/
void txd_sta(void)
{

    sys_txd.combuf[0] = FRAME_START;              //起始标志
    sys_txd.combuf[1] = VER;                      //版本号
    sys_txd.combuf[2] = ADDR;                      //地址,主机
    sys_txd.combuf[3] = M_CID;                    //设备ID
//------以上是包头---------
    sys_txd.combuf[4] = 0x44;                      //Cid2=0x44,表示发送所有的告警状态
//------length---------
    sys_txd.combuf[5] = lchksum(20); //length checksum//////////////////////
    sys_txd.combuf[6] = 20;          //length id
    /********************************************/
    sys_txd.combuf[7] = 20;          //这里放告警信息
    sys_txd.combuf[8] = 20;          //
    sys_txd.combuf[9] = 20;          //
    sys_txd.combuf[10] = 20;        //
    /********************************************/
    sys_txd.combuf[11] = 0xaa;        //end ;
    sys_txd.combuf[12] = 0x55;    //数据打包成ASCII码
    
    package();              //////////////////////////////
    chksum();                  //除起始和校验和以及结束之外的ASCII码求校验和
    com();
}
/******************************************************/
void txd_man(void)
{
//-----------------------------------------------------------------
    sys_txd.combuf[0] = FRAME_START;              //起始标志
    sys_txd.combuf[1] = VER;                      //版本号
    sys_txd.combuf[2] = ADDR;                      //地址,主机
    sys_txd.combuf[3] = M_CID;                    //设备ID
    //----------以上是包头
//-----------------------------------------------------------------
    sys_txd.combuf[4] =0x51;

    sys_txd.combuf[5] =lchksum(0x40);
    sys_txd.combuf[6] =0x40;

    sys_txd.combuf[7]  = 'L';        //L
    sys_txd.combuf[8]  = 'I';        //I
    sys_txd.combuf[9]  = 'N';        //N
    sys_txd.combuf[10] = 'E';        //E
    sys_txd.combuf[11] = 0;
    sys_txd.combuf[12] = 0x00;
    sys_txd.combuf[13] = 0x00;
    sys_txd.combuf[14] = 0x00;
    sys_txd.combuf[15] = 0x00;
    sys_txd.combuf[16] = 0x00;

    sys_txd.combuf[17] = 0x01;      //1  版本
    sys_txd.combuf[18] = 0x00;      //0

    sys_txd.combuf[19] = 0x41;      //A  厂家
    sys_txd.combuf[20] = 0x41;      //A
    sys_txd.combuf[21] = 0x41;      //A
    sys_txd.combuf[22] = 0x41;      //A
    sys_txd.combuf[23] = 0x41;      //A
    sys_txd.combuf[24] = 0x41;      //A
    sys_txd.combuf[25] = 0x41;      //A
    sys_txd.combuf[26] = 0x41;      //A
    sys_txd.combuf[27] = 0x41;      //A
    sys_txd.combuf[28] = 0x41;      //A
    sys_txd.combuf[29] = 0x00;
    sys_txd.combuf[30] = 0x00;
    sys_txd.combuf[31] = 0x00;
    sys_txd.combuf[32] = 0x00;
    sys_txd.combuf[33] = 0x00;
    sys_txd.combuf[34] = 0x00;
    sys_txd.combuf[35] = 0x00;
    sys_txd.combuf[36] = 0x00;
    sys_txd.combuf[37] = 0x00;
    sys_txd.combuf[38] = 0x00;

    sys_txd.combuf[39] = 0xaa;
    sys_txd.combuf[40] = 0x55;

    package();                //数据打包成ASCII码
    chksum();                  //除起始和校验和以及结束之外的ASCII码求校验和
    com();
}
/******************************************/
void txd_uni(uint8 cid2)
{
//-----------------------------------------------------------------
    sys_txd.combuf[0] = FRAME_START;              //起始标志
    sys_txd.combuf[1] = VER;                      //版本号
    sys_txd.combuf[2] = ADDR;                      //地址,主机
    sys_txd.combuf[3] = M_CID;                    //设备ID
    //----------以上是包头
//-----------------------------------------------------------------
    sys_txd.combuf[4] = cid2;
    sys_txd.combuf[5] = lchksum(0x00);      //length checksum 0x00
    sys_txd.combuf[6] = 0x00;                //length id 00

    sys_txd.combuf[7] = 0xaa;                //length id=00,所以,没有info
    sys_txd.combuf[8] = 0x55;
    package();                //数据打包成ASCII码
    chksum();                  //除起始和校验和以及结束之外的ASCII码求校验和
    com();
}
/******************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -