?? serial.c
字號:
/*************************************************************************/
#include "serial.h"
/*************************************************************************/
/* 定義常量 */
#define NULL ((void *) 0L)
#define DB_SENDMAXSIZE 14 /* 待送數(shù)據(jù)最大長度 */
#define DB_RECMAXSIZE 14 /* 待接收數(shù)據(jù)最大長度 */
/*************************************************************************/
/* 定義全局變量 */
extern BYTE CommSendBufferHead, CommSendBufferTail;
extern BYTE CommRecBufferHead, CommRecBufferTail;
BYTE idata CommSendBuffer[DB_SENDMAXSIZE];
BYTE idata CommRecBuffer[DB_RECMAXSIZE];
bit SendIt; /* 串行口傳送旗標(biāo) */
BYTE Count50ms;
/*****************************************************************
函數(shù)名稱: void OpenComm(void)
功能描述: 初始化串行口,參數(shù)歸零
輸入: 無
輸出: 無
*****************************************************************/
void OpenComm(void)
{
UART_Init();
for (CommSendBufferHead=0;CommSendBufferHead<DB_SENDMAXSIZE;CommSendBufferHead++)
{
CommSendBuffer[CommSendBufferHead]=0; /* 清發(fā)送緩沖區(qū) */
}
for (CommRecBufferHead=0;CommRecBufferHead<DB_RECMAXSIZE;CommRecBufferHead++)
{
CommRecBuffer[CommRecBufferHead]=0; /* 清接收緩沖區(qū) */
}
CommSendBufferHead=CommSendBufferTail=0; /* 設(shè)置頭和尾到鼓型緩沖區(qū)的基地址0 */
CommRecBufferHead=CommRecBufferTail=0;
SendIt=1;
REN0=1; /* 允許接收 */
ES0=1; /* 允許串行中斷 */
}
/*****************************************************************
函數(shù)名稱: void SendCommChar(char ch)
功能描述: 復(fù)制ch所指定的字符到鼓型緩沖區(qū)
輸入: char ch - 復(fù)制的字符
輸出: 無
*****************************************************************/
void SendCommChar(char ch)
{
CommSendBuffer[CommSendBufferTail]=ch; /* 復(fù)制當(dāng)前字節(jié) */
CommSendBufferTail++; /* 調(diào)節(jié)指針 */
if (CommSendBufferTail==DB_SENDMAXSIZE)
CommSendBufferTail=0; /* 考核指針是否重疊 */
if (SendIt) /* 如果字節(jié)需要傳送 */
{
// M485 = 1; /* RS485置為發(fā)送 */
sleep_ms(100); /* 延時 */
SBUF0=CommSendBuffer[CommSendBufferHead]; /* 送數(shù)據(jù) */
SendIt=0;
}
// M485 = 0; /* RS485置為接收 */
return ;
}
/*****************************************************************
函數(shù)名稱: void SendCommBuffer(BYTE *base,BYTE size)
功能描述: 復(fù)制第一個參數(shù)base所指定的存儲器數(shù)據(jù)到鼓型緩沖區(qū)
輸入: base - 待復(fù)制數(shù)據(jù)的所在位置
BYTE size - 復(fù)制的字節(jié)長度
輸出: 無
*****************************************************************/
void SendCommBuffer(BYTE *base, BYTE size)
{
BYTE i=0;
if (!size || base==NULL) { return; } /* 核查是否NULL緩沖區(qū) */
while (i<size)
{ /* 如果base中有數(shù)據(jù),且鼓型緩沖區(qū)有空間后進(jìn)行數(shù)據(jù)復(fù)制 */
CommSendBuffer[CommSendBufferTail]=base[i]; /* 復(fù)制當(dāng)前字節(jié) */
i++;
CommSendBufferTail++; /* 調(diào)節(jié)指針 */
if (CommSendBufferTail==DB_SENDMAXSIZE)
{ /* 核對指針重疊 */
CommSendBufferTail=0;
}
}
if (SendIt)
{ /* 如果有字節(jié)需要串送 */
M485 = 1; /* RS485置為發(fā)送 */
sleep_ms(100); /* 延時 */
SBUF0=CommSendBuffer[CommSendBufferHead]; /* 送數(shù)據(jù) */
SendIt=0;
}
M485 = 0; /* RS485置為接收 */
}
/*****************************************************************
函數(shù)名稱: void CommISR(void) interrupt 4
功能描述: 串口中斷服務(wù)子程序,如果鼓型緩沖區(qū)的頭變量加1不等于尾變量
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -