📄 txd.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 + -