?? 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 + -