📄 sendtext.c
字号:
//报文处理
#include "AT89X51.h"
#include "main.h"
#include <intrins.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
//
extern bit timerHap; //定时器到时
//输出数组
extern uchar ACK_BUF[LENMAX]; //Command in length=3 数据(命令) 接收 缓冲区
extern uchar DLE_BUF[DLELENMAX]; //state out length=3 数据(状态) 发送 缓冲区
extern uchar IN_LENGTH; //接收字符个数统计变量
extern uchar CMDIN[LENMAX]; //Command in length=3 数据(命令) 接收 缓冲区
extern bit RECE_flag; //接收标志位(1=成功接收)
//校验和
uchar checksum(uchar *ACK_BUF,uchar length)
{
uchar i;
uint sum=0;
for(i=0;i<length;i++)
{
sum=sum+ACK_BUF[i];
}
i=sum%256;
return i;
}
//函数加入DLE
uchar ADD_DLE_BUF(uchar *ACK_BUF,uchar length)
{
uchar i,j=1;
uchar ACKBUFF[LENMAX];
//
ACKBUFF[0]=length;
//
ACK_BUF[length]=checksum(ACK_BUF,length);
//
for(i=0;i<(length+1);i++)
{ACKBUFF[i+1]=ACK_BUF[i];}
//
for(i=0;i<(length+2);)//
{
if(ACKBUFF[i]==0x02 || ACKBUFF[i]==0x03 || ACKBUFF[i]==0x10)
{
DLE_BUF[j]=0x10;
j=j+1;
DLE_BUF[j]=ACKBUFF[i];
}
else
{ DLE_BUF[j]=ACKBUFF[i]; }
i++;j++;
}
DLE_BUF[0]=STX;
//j=j+1; 不用了
DLE_BUF[j]=ETX;
return (j+1);
}
//发送报文//ACK_BUF=响应报文
void sendtext(uchar *ACK_BUF,uchar length)
{
uchar LastLen;
LastLen=ADD_DLE_BUF(ACK_BUF,length);
send_string_com(DLE_BUF,LastLen);
}
//接收报文处理
BOOL dealrecetext()
{
if(RECE_flag)//一次完整接收了
{
if(CMDIN[1]!=(IN_LENGTH-4))
{ACK_BUF[2]=CE_BADPARAM; return FALSE;}
if( CMDIN[IN_LENGTH-2] != checksum(CMDIN+2,(IN_LENGTH-4)))
{ACK_BUF[2]=CE_CHECKERROR; return FALSE;}
// if( CMDIN[2] < 0x20) //loop
// {ACK_BUF[2]=CE_BADREQUEST; return FALSE;}
return TRUE;
}
}
///////////////////////////////////
void execCommand()
{
if(dealrecetext())
{
switch(CMDIN[2])
{
case 0x80://
REPORT();
break;
case 0x21://
ReadeBox();
break;
case 0x22://
DETECT();
break;
case 0x23://
ONOFF24V();
break;
case 0x24://
CONTROL();
break;
default:
break;
}
}
else //异常情况
{
ACK_BUF[0]=CE_BADPARAM;
ACK_BUF[1]=0x00;
ACK_BUF[3]=0x01;
sendtext(ACK_BUF,4);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -