⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 采用MPS430控制的项目
💻 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 + -