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

📄 serial.c

📁 HID 设备测试程序
💻 C
字号:
/*===============================================================================//
//== 文 件 名:Serial.c
//== author	 :gnsusn
//== 说    明:串口操作
//== 修改日志:2008.7.14 创建文件
//== 
//===============================================================================*/
#include <reg52.H>

#include "Serial.h"

static struct _serial serial;		//== 串口操作结构体

//===============================================================================//
//== 函 数 名:Init_Serial_Data
//== 功   能 :初始化串口用到的数据
//== 说   明 :
//== 时   间 :2008.7.15 创建函数
//== 入口参数:无
//== 返 回 值:0(表示成功)
//===============================================================================//
unsigned char Init_Serial_Data(void)
{
	serial.send_position = 0;
	serial.send_bufp = 0;
	serial.flag = 0;
	serial.send_number = 0;
	serial.rece_position = 0;
	//serial.rece_bufp = rece_buf;
	//serial.rece_number = sizeof(rece_buf);

	return 0;
}

//===============================================================================//
//== 函 数 名:Print_Msg
//== 功   能 :通过串口0打印信息
//== 说   明 :
//== 时   间 :2008.7.14 创建函数
//== 入口参数:信息的首地址
//== 返 回 值:0(表示成功)
//===============================================================================//
unsigned char Print_Msg(unsigned char* pMsg)
{
	if (!pMsg)					//== 判断指针是否有效
	{
		return INVAL_POINTER;	//== 数据指针无,效返回1
	}
	
	if (serial.flag != SIDEL)	//== 判断串口是否被占用
	{
		while(serial.flag != SIDEL);//== 等待释放串口
	}

	serial.flag = SMESSAGE;		//== 置发送类型为信息
	serial.send_bufp = pMsg;	//== 信息地址指针赋给发送缓冲区指针
	SBUF = *(serial.send_bufp++);	//== 发送第一个字符,剩下的由中断处理

	return 0;
}

//===============================================================================//
//== 函 数 名:Print_Data
//== 功   能 :通过串口发送数据
//== 说   明 :
//== 时   间 :2008.7.14 创建函数
//== 入口参数:pData:信息的首地址;Num:发送字节的个数
//== 返 回 值:0(表示成功)
//===============================================================================//
unsigned char Print_Data(unsigned char* pData, unsigned char Num)
{
	if (!pData)					//== 判断指针是否有效
	{
		return INVAL_POINTER;	//== 数据指针无,效返回1
	}

	if (serial.flag != SIDEL)	//== 判断串口是否被占用
	{
		while(serial.flag != SIDEL);//== 等待释放串口
	}

	serial.flag = SDATA;		//== 置发送类型为数据
	serial.send_number = Num;	//== 将要发送数据的个数
	serial.send_bufp = pData;	//== 数据地址指针赋给发送缓冲区指针
	SBUF = *serial.send_bufp;	//== 发送第一个字符,剩下的由中断处理
	serial.send_position = 1;	//== 数据已经发送完一个

	return 0;
}

//===============================================================================//
//== 函 数 名:PrintLongInt
//== 功   能 :打印长整型数据
//== 说   明 :
//== 时   间 :2008.7.14 创建函数
//== 入口参数:Data:要打印的数据
//== 返 回 值:0(表示成功)
//===============================================================================//
unsigned char Print_Long(unsigned long Data)
{
	unsigned char display_buffer[10];
	unsigned long number = Data;
	char i;

	for (i=0; i<10; i++)
	{
		display_buffer[i] = 0;
	}

	for (i=9; i>=0; i--)
	{
		display_buffer[i] = '0' + number%10;
		number /= 10;
	}

	for (i=0; i<9; i++)
	{
		if (display_buffer[i] != '0') break;
	}

	Print_Data(&display_buffer[i], 10-i);

	return 0;
}

//===============================================================================//
//== 函 数 名:Print_Hex
//== 功   能 :打印十六进制数
//== 说   明 :
//== 时   间 :2008.7.14 创建函数
//== 入口参数:Data:要打印的数据
//== 返 回 值:0(表示成功)
//===============================================================================//
unsigned char Print_Hex(unsigned char* pData, unsigned char number)
{
	unsigned char code HEX_Tab[] = {'0','1','2','3','4','5','6','7',
									'8','9','A','B','C','D','E','F',};
	unsigned char i, temp[2];

	for (i=0; i<number; i++)
	{
		Print_Msg("0x");
		temp[1] = HEX_Tab[(*(pData+i))&0x0f];
		temp[0] = HEX_Tab[(*(pData+i))>>4];
		Print_Data(temp, 2);
		Print_Msg(" ");
	}

	return 0;
}

//===============================================================================//
//== 函 数 名:Serial_Saver
//== 功   能 :串口中断服务程序
//== 说   明 :
//== 时   间 :2008.7.15 创建函数
//== 入口参数:无
//== 返 回 值:无
//===============================================================================//
void Serial_Saver(void) interrupt 4
{
	if (TI)
	{
		TI = 0;

		switch (serial.flag)
		{
			case SMESSAGE:					//== 发送信息时引起的中断
			{
				if (*serial.send_bufp)		//== 信息未发送完
				{
					SBUF = *(serial.send_bufp++);
				}
				else						//== 信息发送完
				{
					serial.send_bufp = 0;	//== 发送缓冲区无效
					serial.flag = SIDEL;	//== 置串口状态为闲
				}
			}break;

			case SDATA:						//== 发送数据时引起的中断
			{
				if (serial.send_position<serial.send_number)
				{
					SBUF = *(serial.send_bufp+serial.send_position);
					serial.send_position += 1;
				}
				else						//== 数据发送完毕
				{
					serial.send_bufp = 0;
					serial.flag = SIDEL;
					serial.send_position = 0;
					serial.send_number = 0;
				}
			}break;

			default: break;
		}
	}
	else
	{
		RI = 0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -