#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; }