/*==========================================
串口发送 CRC校验(程翔宇 chanceller@163.com)
==========================================*/
#include <stdio.h>
#include <string.h>
//模拟串口发送程序
void UartSendStr(unsigned char *p,unsigned char len)
{
while (len--)
{
printf("%02x",*p++);
}
}
//CRC校验程序
unsigned short CrcCheck(unsigned char*bufOut,unsigned char *buf,unsigned char length)
{
unsigned short tmp,CRC;
unsigned char i,j,CRCHi,CRCLo;
memcpy(bufOut,buf,length); //前端存储原字符
bufOut[length+2]='\0'; //后端存储结束符
//CRC校验核心代码
CRC=0xFFFF;
for(i=0; i<length; i++)
{
CRC=buf[i]^CRC;
for(j=0;j<8;j++)
{
tmp=CRC&0x0001;
CRC=CRC>>1;
if(tmp)
CRC=CRC^0xA001;
}
}
CRCLo = CRC & 0x00FF;
CRCHi = CRC >> 8;
bufOut[length]=CRCLo; //CRC校验码存在原字符后面(低前高后)
bufOut[length+1]=CRCHi; //CRC校验码存在原字符后面(低前高后)
return CRC; //返回CRC校验码(高前低后)
}
int main()
{
unsigned char i,j;
unsigned char BufSize=12;//串口移位缓存大小(9(=7+2)个有效字节)
unsigned char SedBuf[BufSize];//模拟串口发送的数据存储字符串
// 'x','y','1',0x14,0x00,0x00,0x00,0x90,0x9A,'\r','\n','\0',
// 'x','z','1',0x26,0x00,0x00,0x00,0x9E,0x11,'\r','\n','\0',
// 'x','a','1',0x6A,0x19,0x00,0x00,0x5A,0xAD,'\r','\n','\0',
unsigned char ch[3][2]={{0x78,0x79},{'x','z'},"xa"};//识别字符串(命令头)
//共用体。通过实际数据neData,获得存储的有效字节DP[4]
union dataInt{
unsigned char DP[4];
int neData;
}DataSed[3];
char Adress='1';//地址位
unsigned char CRCStr[10]; //存储CRC校验字符串
unsigned char CRCRe; //CRC校验值
unsigned char EndStr[3]={'\r','\n','\0'};//结束符
//发送的有效整形数据
DataSed[0].neData=20;
DataSed[1].neData=38;
DataSed[2].neData=6506;
for(i=0;i<3;i++)//模拟串口发送3条不同命令头的数据程序
{
memcpy(SedBuf,ch[i],2);//命令头(2字节)
memcpy(SedBuf+2,&Adress,1);//地址位(1字节)
memcpy(SedBuf+2+1,DataSed[i].DP,4);//数据位(4字节)
CRCRe=CrcCheck(SedBuf,SedBuf,2+1+4);//CRC校验位(2字节)
memcpy(SedBuf+7+2,&EndStr,3);//末端标志位(3字节)
//获得发往串口的字符串SedBuf(共12字节)
UartSendStr(SedBuf,12);
printf("\r\n");
}
return 0;
}