河北水利局项目
This commit is contained in:
138
yw/generalyw.c
Normal file
138
yw/generalyw.c
Normal file
@@ -0,0 +1,138 @@
|
||||
#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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user