📄 uart.c
字号:
#define _Uart_
#include "..\Inc\includes.h"
Uint8 const CID20[CID2_NUM0]={0x83,0x85,0x87};
Uint8 const CID21[CID2_NUM1]={0x42,0x43,0x44,0x45,0x47,0x49,0x4b,0x4c,0x4d,0x4e,0x4f,0x51};
/*-----------------------------------------------------------------------------
* 函数名称: SendStrlenToCom1
*
* 功能描述: 发送字符串到串口1
*
* 入口参数: unsigned char *str:所要发送字符串的头地址
unsigned int strlen:字符长度
*
* 出口参数: 无
*
* 全局变量: 无
*
* 调用模块:无
*
* 作 者: Cache
* 创建时间: 2006年1月16日
-----------------------------------------------------------------------------*/
void SendStrlenToCom1(unsigned char *str,unsigned int strlen)
{
unsigned int k=0;
while(k<strlen)
{
TXBUF1 = *(str+k); //发给上位机
while((UTCTL1&0x01)==0);
k++;
}
}
void SendStrlenToCom0(unsigned char *str,unsigned int strlen)
{
unsigned int k=0;
RS4851
STR0_Re_flag = Busy;
while(k<strlen)
{
TXBUF0=*(str+k); //发给智能设备
while((UTCTL0&0x01)==0);
k++;
}
STR0_Re_flag = 0;
RS4850
}
/*-----------------------------------------------------------------------------
* 函数名称: Combine
*
* 功能描述: 将协议中的两个ASCII码合并成一个字节
*
* 入口参数: unsigned char DH:两个字节中的位于高位的字节
unsigned char DL:两个字节中的位于低位的字节
*
* 出口参数: 最高位 :0:DH,DL的格式不正确,即不在0-9、A-F范围内
1:功能成功,可以对retu的值进行正确的读取
*
* 全局变量: 无
*
* 调用模块:无
*
* 作 者: Cache
* 创建时间: 2006年1月16日
-----------------------------------------------------------------------------*/
Uint16 Combine(unsigned char DH,unsigned char DL)
{
unsigned int temp;
if(DH>=0x30&&DH<=0x39) temp=(DH-0x30)<<4; //0-9
else if(DH>=0x41&&DH<=0x46) temp=0x0A+(DH-0x41)<<4; //A-F
else return 0;
if(DL>=0x30&&DL<=0x39)temp+=DL-0x30; //0-9
else if(DL>=0x41&&DL<=0x46)temp+=DL-0x41+0x0A;//A-F
else return 0;
//temp|=0x8000;
return temp;
}
/*********************************************************************************************************
* 函数名称:HEX
*
* 功能描述:将ASCII码转化为16进制的数据
*
* 说明:
*
********************************************************************************************************/
Uint8 HEX(Uint8 dat)
{
if(dat>=0x30&&dat<=0x39) return dat-0x30;
else if(dat>=0x41&&dat<=0x46) return dat-0x41+0x0A;
else return 0;
}
/*********************************************************************************************************
* 函数名称:GetCheckLength
*
* 功能描述:求数据包长度校验,并直接存入数组p中
*
* 说明:
*
********************************************************************************************************/
void GetCheckLength(Uint8 *p,Uint16 len)
{
Uint8 i,j,k,m;
i = len / 256;
j = len / 16 % 16;
k = len % 16;
m = (i + j + k)%16;
m = (~m)&0x0f + 1;
p[9] = ASCII[m&0x0f];
p[10] = ASCII[i];
p[11] = ASCII[j];
p[12] = ASCII[k];
}
/*********************************************************************************************************
* 函数名称:CheckSum
*
* 功能描述:求数据包的校验和,并直接将校验和存如数组p中
*
* 说明:
*
********************************************************************************************************/
void GetCheckSum(Uint8 *p,Uint16 len)
{
Uint16 sum=0,i;
for(i=1; i<=len; i++) sum += p[i];
sum =((~sum)+1);
p[len+1] = ASCII[(sum>>12)];
p[len+2] = ASCII[(sum>>8)&0x000f];
p[len+3] = ASCII[(sum>>4)&0x000f];
p[len+4] = ASCII[sum&0x000f];
}
/*********************************************************************************************************
* 函数名称:XiaoYan
*
* 功能描述:对数据包长度、求和校验 协议是否一致
*
* 说明:
*
********************************************************************************************************/
Uint16 XiaoYan(Uint8 *p,Uint16 strlen)
{
Uint8 length;
Uint16 sum=0,i;
length = HEX(p[10]) + HEX(p[11]) + HEX(p[12]); //求和
length = length%16; //对16取摸
length = ((~length)&0x0f) + 1; //取反加1
if(p[9]!=ASCII[length&0x0f]) return 0x03; //Length 校验出错
strlen -= 5;
for(i=1; i< strlen; i++) sum += p[i];
sum =((~sum)+1); //求和 取反 加1
if(p[strlen]!=ASCII[sum>>12] || p[strlen+1]!=ASCII[(sum>>8)&0x000f] || p[strlen+2]!=ASCII[(sum>>4)&0x000f] || p[strlen+3]!=ASCII[sum&0x000f])
return 0x02;
return 0x00;
}
/*********************************************************************************************************
* 函数名称:GetCommandPackage
*
* 功能描述:得到一串发送命令的数据包,参数:数据包指针 设备地址 CID1 CID2
*
* 说明:同智能设备见通讯的命令包
*
********************************************************************************************************/
void GetCommandPackage(Uint8 *p, Uint8 adr, Uint8 cid1, Uint8 cid2)
{
p[0] = SOI;
p[1] = ASCII[VER>>4];
p[2] = ASCII[VER&0x0f];
p[3] = ASCII[adr>>4];
p[4] = ASCII[adr&0x0f];
p[5] = ASCII[cid1>>4];
p[6] = ASCII[cid1&0x0f];
p[7] = ASCII[cid2>>4];
p[8] = ASCII[cid2&0x0f];
GetCheckLength(p,0); //长度校验
GetCheckSum(p,12); //数据包和校验
p[17]= EOI;
}
/*********************************************************************************************************
* 函数名称:GetDataPackage
*
* 功能描述:得到一串响应命令的数据包
*
* 说明:
*
********************************************************************************************************/
Uint16 GetDataPackage(Uint8 *p,Uint8 *str,Uint8 count,Uint16 len)
{
Uint16 i,k;
p[0] = SOI;
p[1] = ASCII[VER>>4];
p[2] = ASCII[VER&0x0f];
p[3] = ASCII[ADR>>4];
p[4] = ASCII[ADR&0x0f];
p[5] = ASCII[CID10>>4];
p[6] = ASCII[CID10&0x0f];
p[7] = ASCII[0]; //响应固定为正常
p[8] = ASCII[0];
if(count!=0)
{
p[13] = ASCII[count>>4];
p[14] = ASCII[count&0x0f];
k = 15; i = 2;
}
else {k = 13;i=0;}
GetCheckLength(p,i+len*2); //长度校验 12
for(i=0; i<len; i++)
{
p[k+2*i] = ASCII[str[i]>>4];
p[k+2*i+1] = ASCII[str[i]&0x0f];
}
i = k + 2 * len;
GetCheckSum(p,i-1); //数据包和校验
p[i+4]= EOI;
return i+5;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -