📄 serial.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 + -