📄 chuankou.c
字号:
#include<reg51.h>
#define rxMax 15 //串口接收缓冲区大小
#define txMax 15 //串口发送缓冲区大小
unsigned char rxBuf[rxMax + 1]; //定义串口通信接收缓冲区
unsigned char txBuf[txMax + 1]; //定义串口通信发送缓冲区
unsigned char rxHead; //串口接收缓冲区的头部
unsigned char rxTail; //串口接收缓冲区的尾部
unsigned char txHead; //串口发送缓冲区的头部
unsigned char txTail; //串口发送缓冲区的尾部
unsigned char tempData; //数据的临时变量
/**************************串口通信初始设定**************************/
void InitSerialcom( void )
{
SCON = 0xD0 ; //UART为模式3,9位数据,第9位用于奇偶校验,允许接收
TMOD |= 0x20 ; //定时器1为模式2,8位自动重装
PCON &= 0x7F ; //SMOD=0;
TH1 = 0xE8 ; //11.0592MHZ晶振下串口波特率为1200bps
IE |= 0x90 ; //使能串口中断
TR1 = 1 ; //启动定时器1
TI=1;
//初始化串口接收和发送缓冲区
rxHead = 0;
rxTail = 0;
txHead = 0;
txTail = 0;
}
/************************串口中断服务函数****************************/
void serial () interrupt 4 using 3
{
if ( RI )
{
RI = 0;
tempData = SBUF; //将数据放入C51寄存器A时,计算数据中1的个数,
ACC = tempData; //如果个数为偶数,则P=0,否则P=1,用于奇偶校验
if( TB8 == P ) //对数据进行偶校验
{
rxBuf[rxHead] = tempData;
if ( rxHead == rxMax )
{
rxHead = 0;
}
else
{
rxHead++;
}
}
else
{
//如果校验错误,要求重传
}
}
else if ( TI )
{
TI = 0;
if( txTail != txHead ) //如果缓冲区有数据则发送数据
{
ACC = txBuf[txTail]; //数据放入寄存器A,计算数据的偶校验,
TB8 = P; //将偶校验结果放入串口发送的第9位数据位
SBUF = txBuf[txTail];
}
if( txTail == txMax )
{
txTail = 0;
}
else
{
txTail ++;
}
}
}
/****************从串口缓冲区中读取数据,返回读取数据的个数**************/
unsigned char SerialcomRead( unsigned char *buf, unsigned char len )
{
unsigned char cnt = 0;
//当缓冲区中有数据时,开始读<=len个数的数据
while ( ( rxTail != rxHead ) && ( cnt < len ) )
{
*buf ++ = rxBuf[rxTail];
if( rxTail == rxMax )
{
rxTail = 0;
}
else
{
rxTail ++;
}
cnt ++;
}
return cnt;
}
/************向串口发送缓冲区中写入数据,使串口发送数据**************/
unsigned char SerialcomWrite( unsigned char *buf, unsigned char len )
{
unsigned char cnt;
//计算发送缓冲区中可用容量
if( txHead > txTail )
{
cnt = txMax - txHead + txTail + 1;
}
else
{
cnt = txTail - txHead;
}
//如果有足够的缓冲区空间,则将数据写入缓冲区
if( cnt >= len )
{
for ( cnt = len; cnt; cnt -- )
{
txBuf[txHead] = *buf++;
if( txHead == txMax )
{
txHead = 0;
}
else
{
txHead ++;
}
}
SBUF = txBuf[txTail];
return len;
}
else
return cnt;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -