Files
HBshuiwuConcentrator/yw/generalyw.c
2025-12-15 16:07:49 +08:00

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