139 lines
2.3 KiB
C
139 lines
2.3 KiB
C
#include "stdafx.h"
|
|
#include "frame.h"
|
|
#include "crc.h"
|
|
|
|
/*
|
|
帧的通用表达
|
|
*/
|
|
static u16 send_serial = 0;
|
|
static u16 recv_serial = 0;
|
|
|
|
static u16 get_sendserial()
|
|
{
|
|
|
|
return (send_serial++);
|
|
}
|
|
/*
|
|
static void serialserial_add(u8 * value)
|
|
{
|
|
send_serial ++;
|
|
value[0] = send_serial&0xFF;
|
|
value[1] = (send_serial>>8)&0xFF;
|
|
}
|
|
*/
|
|
static u16 get_recvserial()
|
|
{
|
|
return recv_serial;
|
|
}
|
|
|
|
void set_recvserial(u16 serial)
|
|
{
|
|
recv_serial = serial;
|
|
}
|
|
|
|
/*
|
|
//0x30 ---> 30
|
|
unsigned char BCDToHex(unsigned int bcd_data)
|
|
{
|
|
unsigned char temp;
|
|
unsigned char tmp1 = bcd_data&0x0f;
|
|
unsigned char tmp2 = (bcd_data>>4)&0x0f;
|
|
unsigned char tmp3 = (bcd_data>>8)&0x0f;
|
|
unsigned char tmp4 = (bcd_data>>12)&0x0f;
|
|
temp=(tmp4*1000) + (tmp3*100)+(tmp2*10)+tmp1;
|
|
return temp;
|
|
}
|
|
*/
|
|
|
|
//30--->0x30
|
|
unsigned int Hex2BCD(unsigned char hex_data)
|
|
{
|
|
unsigned int bcd_data;
|
|
unsigned char temp;
|
|
temp=hex_data%100;
|
|
bcd_data=((unsigned int)hex_data)/100<<8;
|
|
bcd_data=bcd_data|temp/10<<4;
|
|
bcd_data=bcd_data|temp%10;
|
|
return bcd_data;
|
|
}
|
|
|
|
//将u16数字转换成 2个字节。
|
|
void P2From16(unsigned char * P2,unsigned short Val)
|
|
{
|
|
P2[0] = (Val&0xFF);
|
|
P2[1] = ((Val)>>8)&0xFF;
|
|
}
|
|
|
|
|
|
/*
|
|
//199 0x99 0x01
|
|
u16 getid_frombcd(u8 * p)
|
|
{
|
|
return BCDToHex(p[1]) * 100 + BCDToHex(p[0]);
|
|
}
|
|
|
|
void getbcd_fromid(u8 * p,u16 id)
|
|
{
|
|
u8 id1 = id%100;
|
|
u8 id2 = id/100;
|
|
p[0] = Hex2BCD(id1);
|
|
p[1] = Hex2BCD(id2);
|
|
}
|
|
*/
|
|
/*
|
|
得到校验和
|
|
*/
|
|
u8 * frame_get_valpos(u8 * val)
|
|
{
|
|
return &val[6];
|
|
}
|
|
|
|
void frame_fill_head(u8 * val,u16 len,u8 afn)
|
|
{
|
|
val[0] = 0x68;
|
|
val[1] = len&0xFF;
|
|
val[2] = (len>>8)&0xFF;
|
|
val[3] = get_sendserial()&0xFF;
|
|
val[4] = (get_sendserial()>>8)&0xFF;
|
|
val[5] = afn;
|
|
}
|
|
|
|
void frame_fill_ack_head(u8 * val,u16 len,u8 afn)
|
|
{
|
|
val[0] = 0x68;
|
|
val[1] = len&0xFF;
|
|
val[2] = (len>>8)&0xFF;
|
|
val[3] = get_recvserial()&0xFF;
|
|
val[4] = (get_recvserial()>>8)&0xFF;
|
|
val[5] = afn;
|
|
}
|
|
|
|
void frame_fill_end(u8 * val,u16 len)
|
|
{
|
|
u16 ck = 0;
|
|
val[1] = len&0xFF;
|
|
val[2] = (len>>8)&0xFF;
|
|
ck = get_crc(&val[1],len-4);
|
|
val[len-3] = ck&0xFF;
|
|
val[len-2] = (ck>>8)&0xFF;
|
|
val[len-1] = 0x16;
|
|
}
|
|
|
|
bool frame_islegal(u8 * val)
|
|
{
|
|
u16 len = U16From2(&val[1]);
|
|
u16 ck1 = 0;
|
|
u16 ck2 = 0;
|
|
if(0x68 == val[0] && 0x16 == val[len-1])
|
|
{
|
|
ck1 = get_crc(&val[1],len-4);
|
|
ck2 = U16From2(&val[len-3]);
|
|
if(ck1 == ck2)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|