📄 serial.c
字号:
#include "Serial.h"
#if CPU == MCS51
#include <reg52.h>
#endif
#if CPU == MSP430
#include <MSP430X44X.h>
#endif
#if CPU == MCS51
#define SETTI TI = 1
#endif
#if CPU == MSP430
#define SETTI IFG1 |= UTXIFG0
#endif
#if UartTXBufMAX == 8
#define UartTXBufTBL 0x07
#endif
#if UartTXBufMAX == 16
#define UartTXBufTBL 0x0f
#endif
#if UartTXBufMAX == 32
#define UartTXBufTBL 0x1f
#endif
#if UartTXBufMAX == 64
#define UartTXBufTBL 0x3f
#endif
#if UartTXBufMAX == 128
#define UartTXBufTBL 0x7f
#endif
#if UartRXBufMAX == 8
#define UartRXBufTBL 0x07
#endif
#if UartRXBufMAX == 16
#define UartRXBufTBL 0x0f
#endif
#if UartRXBufMAX == 32
#define UartRXBufTBL 0x1f
#endif
#if UartRXBufMAX == 64
#define UartRXBufTBL 0x3f
#endif
#if UartRXBufMAX == 128
#define UartRXBufTBL 0x7f
#endif
#if UartQueueEN == 1
unsigned char UartTXHead; //串口发送缓冲区头指针
unsigned char UartTXRear; //串口发送缓冲区尾指针
unsigned char UartTXCount; //串口发送缓冲区数据个数
unsigned char UartRXHead; //串口接收缓冲区头指针
unsigned char UartRXRear; //串口接收缓冲区尾指针
unsigned char UartRXCount; //串口接收缓冲区数据个数
unsigned char UartTXBuf[ UartTXBufMAX ];//串口发送缓冲区
unsigned char UartRXBuf[ UartRXBufMAX ];//串口接收缓冲区
/*
_________________________________________________________________
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
-----------------------------------------------------------------
/\ /\
| |
front rear
*/
//向队尾插入一个新元素ddata,并返回操作结果
//若操作成功则返回TRUE 否则返回FALSE
//unsigned char PutData(unsigned char ddata)
// if Count == MAXSIZE;
// return Queue full
// Buf[Rear]=ddata;
// Rear=(Rear+1)%MAXSIZE;
// Count++;
// return OK;
unsigned char PutUartTXData(unsigned char ddata)
{
if( UartTXCount == UartTXBufMAX )
return FALSE;
UartTXBuf[ UartTXRear ] = ddata;
UartTXRear = (UartTXRear + 1) & UartTXBufTBL;
UartTXCount++;
return TRUE;
}
unsigned char PutUartRXData(unsigned char ddata)
{
if( UartRXCount == UartRXBufMAX )
return FALSE;
UartRXBuf[ UartRXRear ] = ddata;
UartRXRear = (UartRXRear + 1) & UartRXBufTBL;
UartRXCount++;
return TRUE;
}
//从队首读取一个数据,并将数据存入ddate指向的单元
//unsigned char GetData(unsigned char *ddata)
// if count == 0;
// return Queue empty
// *ddata = Buf[Head];
// Head = (Head + 1) % MAXSIZE;
// Count--;
// return OK;
unsigned char GetUartTXData(unsigned char *ddata)
{
if( UartTXCount == 0 )
return FALSE;
*ddata = UartTXBuf[ UartTXHead ];
UartTXHead = ( UartTXHead +1 ) & UartTXBufTBL;
UartTXCount--;
return TRUE;
}
unsigned char GetUartRXData(unsigned char *ddata)
{
if( UartRXCount == 0 )
return FALSE;
*ddata = UartRXBuf[ UartRXHead ];
UartRXHead = ( UartRXHead +1 ) & UartRXBufTBL;
UartRXCount--;
return TRUE;
}
//
//void UartRead( unsigned char *Buf , unsigned char len )
//从串口读取数据,读出的数据存放在首地址为 Buf 的数组里
//读出数据的长度为 len
void UartRead( unsigned char *Buf , unsigned char len )
{
unsigned char i,temp;
for( i = 0;i < len; i++)
{
while( !GetUartRXData(&temp));
Buf[i]=temp;
}
}
//void UartWrite( unsigned char *Buf , unsigned char len )
//向串口写入数据,
void UartWrite( unsigned char *Buf , unsigned char len )
{
unsigned char i,temp;
for( i = 0;i < len; i++)
{
temp=Buf[i];
while( !PutUartTXData(temp));
}
if(UartTXCount==len)
SETTI;
}
#if CPU == MCS51
#if CPU_TIMER == TIMER0
void UartInit(unsigned int BandRate)
{
TMOD&=0X0F;
TMOD|=0x20; /*定时器1作为波特率发生器,工作于方式2,自动8位装载*/
SCON=0x50; /*工作方式 1*/
PCON|=0x80; /*波特率加倍*/
TH1=255-57600/BandRate+1;; /*按波特率计算初值 TH1=256-F*(SMOD+1)/(384*Band)=256-57600/Band*/
TL1=TH1;
TR1=1;
TI=0;
RI=0;
ES=1;
//队列初始化
UartTXHead = 0; //串口发送缓冲区头指针
UartTXRear = 0; //串口发送缓冲区尾指针
UartTXCount = 0; //串口发送缓冲区数据个数
UartRXHead = 0; //串口接收缓冲区头指针
UartRXRear = 0; //串口接收缓冲区尾指针
UartRXCount = 0; //串口接收缓冲区数据个数
}
#endif
#if CPU_TIMER == TIMER2
void UartInit(unsigned int BandRate)
{
//队列初始化
UartTXHead = 0; //串口发送缓冲区头指针
UartTXRear = 0; //串口发送缓冲区尾指针
UartTXCount = 0; //串口发送缓冲区数据个数
UartRXHead = 0; //串口接收缓冲区头指针
UartRXRear = 0; //串口接收缓冲区尾指针
UartRXCount = 0; //串口接收缓冲区数据个数
}
#endif
void UartInterrupt(void) interrupt 4 //reentrant
{
unsigned char temp;
if(RI)
{
RI=0;
PutUartRXData(SBUF);
}
if(TI)
{
TI=0;
if(UartTXCount != 0)
{
GetUartTXData(&temp);
SBUF=temp;
}
}
}
#endif
#if CPU == MSP430
void UartInit(unsigned int BandRate)
{
//只允许输入标准波特率
unsigned int temp;
UTCTL0=SSEL1;
temp = (CPU_OSC) / BandRate;
UBR00 = temp % 256;//波特率寄存器 低八位
UBR10 = temp / 256;//高八位
UMCTL0 = 0x0;//微调寄存器
UCTL0 = CHAR;
ME1 |= UTXE0+URXE0;
IE1 |= URXIE0+UTXIE0;
P2SEL |= 0x30; //选择RXD TXD
P2DIR |= 0x10; //设置TXD为输出
P2DIR &= ~0x20;//设置RXD为输入
//队列初始化
UartTXHead = 0; //串口发送缓冲区头指针
UartTXRear = 0; //串口发送缓冲区尾指针
UartTXCount = 0; //串口发送缓冲区数据个数
UartRXHead = 0; //串口接收缓冲区头指针
UartRXRear = 0; //串口接收缓冲区尾指针
UartRXCount = 0; //串口接收缓冲区数据个数
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
PutUartRXData(RXBUF0);
}
#pragma vector = UART0TX_VECTOR
__interrupt void usart0_tx(void)
{
unsigned char temp;
if(UartTXCount != 0)
{
GetUartTXData(&temp);
TXBUF0=temp;
}
}
#endif
#endif // end of UartQueueEN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -