📄 packet.cpp
字号:
/*打包程序*/
#define MRTUC _DATAPOLL 0xE1 //定义包类型为数据包
#define MRTUC _DATAPOLLRESPONSE 0xE2 //定义包类型为应答数据包
#define MRTUC _ACTIVATE 0xF1 //定义包类型为请求握手包
#define MRTUC _ACTIVATEREQUEST 0xF2 //定义包类型为应答握手包
#define E$HostID 0x11 //定义目标主机地址
void SCI_Putc( unsigned char data ); //通过SCI输出数据函数
void SCI_Puts(unsigned char *str,unsigned char length) //输出多数据函数
{
while ( length!=0 )
{
SCI_Putc( *str++ ); //通过SCI 发送数据 Length--;
}
}
void CheckActiveFunc(unsigned char unit) //请求握手函数
{
unsigned char buff[8];
buff[0]=0xFF; //引导字节
buff[1]=0xAA; //引导字节
buff[2]=0x55; //引导字节
buff[3] = MRTUC _ACTIVATE; //数据包头字节
buff[4] = 0x03; //数据包长度
buff[5] = E$HostID; //主机地址
buff[6] = unit; //从机地址
buff[7] = 1 + ~(MRTUC _ACTIVATE + 0x03 + E$HostID + unit); //校验字节 SCI_Puts(buff,8); //发送数据包
}
void ResponseActiveRequestFunc(void)
{
unsigned char buff[8];
buff[0]=0xFF;
buff[1]=0xAA;
buff[2]=0x55;
buff[3] = MRTUC _ACTIVATEREQUEST;
buff[4] = 0x03;
buff[5] = E$HostID;
buff[6] = unit;
buff[7] = 1 + ~(MRTUC _ACTIVATEREQUEST +0x03 + E$HostID + unit);
SCI_Puts(buff,8);
}
void DataPollFunc(unsigned char unit)
{
unsigned char buff[8];
buff[0]=0xFF;
buff[1]=0xAA;
buff[2]=0x55;
buff[3] = MRTUC _DATAPOLL;
buff[4] = 0x03;
buff[5] = E$HostID;
buff[6] = unit;
buff[7] = 1 + ~(MRTUC _DATAPOLL + 0x03 + E$HostID + unit);
SCI_Puts(buff,8);
}
void ResponseDataPollFunc(unsigned char unit)
{
unsigned char buff[8];
buff[0]=0xFF;
buff[1]=0xAA;
buff[2]=0x55;
buff[3] = MRTUC _DATAPOLLRESPONSE;
buff[4] = 0x3;
buff[5] = E$HostID;
buff[6] = unit;
buff[7] = 1 + ~(MRTUC _DATAPOLLRESPONSE + 0x3 + E$HostID + unit);
SCI_Puts(buff,8);
}
/*解包程序*/
#define TOTAL_RESPONSE //定义数据包的总数
void SCI_Getc(void); //从SCI buffer 取数据函数
struct ResponseCodeStruct //定义数据包结构体
{
unsigned char Code; //数据包的类型
unsigned char Length; //数据包的长度};
}
const ResponseCodeStruct ResponseCodeTable[TOTAL_RESPONSE]=
{
{ 0, 0 },
{MRTUC _DATAPOLL, 3},
{MRTUC _DATAPOLLRESPONSE, 3},
{MRTUC _ACTIVATE, 3},
{MRTUC _ACTIVATEREQUEST, 3},
};
unsigned char CheckResponseCode( unsigned char code ) //检查数据包类型函数
{
unsigned char i;
for ( i=1; i<TOTAL_RESPONSE; i++ )
{
if ( ResponseCodeTable[i].Code == code )
return i;
}
return 0;
}
void ResetReceivingStatus( void ) //复位接收状态
{
PacketStatus &= ~PC_START; //数据包为开始状态
BufferIndex = 0; //复位接收头字节标志
}
void SerialHandler( void ) //数据解包子程序
{
unsigned char char,i,j;
unsigned char *buff;
if ((PacketStatus & PC_READY)==0 )
{ //检查数据包状态
if ( SCI_Flags & SCI_IQDIRTY)
{ //检查SCI 状态
char = SCI_Getc(); //从buffer 取一字节数据
if ( BufferIndex==0)
{ //检查是否为头字节
if ( (CodeIndex=CheckResponseCode( char ))==0 )
{
CodeIndex=0;
ResetReceivingStatus(); //复位接收状态
}
return; //不正确返回取下一字节
}
CheckSum = 0;
PacketStatus |= PC_START; //定义开始接收数据
}
else if ( BufferIndex==1 )
{
if(char<3|| har>(SCI_IQMASK-1)|| (ResponseCodeTable[CodeIndex]. Length && ResponseCodeTable[CodeIndex].Length!=char) )
{ // 检查长度
CodeIndex=0;
ResetReceivingStatus();
}
return;
}
PacketLength = char + 2;
}
else if ( BufferIndex==2 )
{ // 检查主机地址
if ( char!=E$HostID )
{
CodeIndex=0;
ResetReceivingStatus();
}
return;
}
}
else if ( BufferIndex==3 )
{ // 检查从机地址
if ( char>MAX_UNIT || char==0 )
{
return;
}
else
{
if(E$UNIT!=char)
{
CodeIndex=0;
ResetReceivingStatus();
}
}
PacketBuffer[BufferIndex++] = char;
if ( BufferIndex>=2 )
{
if ( BufferIndex==PacketLength )
{
CheckSum = 1 + ~CheckSum;
if ( char==CheckSum )
{ //校验
PacketStatus |= PC_READY;
}
ResetReceivingStatus();
}
}
CheckSum += char;
}
else
{
if ( (PacketStatus & PC_START) && TimeOut==0 )
{
CodeIndex=0; ResetReceivingStatus();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -