📄 serial0.c
字号:
//-----------------------------------------------------------------------------
// Net SERIAL.C
//
// This module handles RS-232 messages and associated tasks
//-----------------------------------------------------------------------------
#include <string.h>
#include "C8051f.h"
#include "intrins.h"
#include "serial0.h"
#include "Func.h"
bit CommRecDataOverflowFlag,FlagRecComm,SendItComm;
unsigned char CommSendBufferHead, CommSendBufferTail;
unsigned char CommRecBufferHead, CommRecBufferTail;
unsigned char xdata CommSendBuffer[DB_SENDMAXSIZE] _at_ 0 ; //串行口缓冲区定位在内部4K XRAM中
unsigned char xdata CommRecBuffer[DB_RECMAXSIZE] _at_ DB_SENDMAXSIZE;
void Delay1ms(unsigned char T);
void ClearCommRecBuffer0(void)
{
unsigned char i;
CommRecBufferHead=CommRecBufferTail=0;
CommSendBufferHead=CommSendBufferTail=0;
FlagRecComm=0;
for (i=0;i<DB_SENDMAXSIZE;i++)
{
CommSendBuffer[i]=0;
}
for (i=0;i<DB_RECMAXSIZE;i++)
{
CommRecBuffer[i]=0;
}
}
void init_serial0(unsigned int BaudRate)
{
ClearCommRecBuffer0();
OpenComm0(BaudRate);
}
void OpenComm0(unsigned int BaudRate)
{
PCON |= 0x80; // SMOD=1 (HW_UART uses Timer 1 overflow with no divide down).
TMOD |= 0x20; // Configure Timer 1 for use by UART0
CKCON |= 0x10; // Timer 1 derived from SYSCLK
// RCAP2H=(65536-(SYSCLK/BAUDRATE0/32))/256;
// RCAP2L=(65536-(SYSCLK/BAUDRATE0/32))%256;
RCAP2H=(65536-(SYSCLK/BaudRate/32))/256;
RCAP2L=(65536-(SYSCLK/BaudRate/32))%256;
TH2=RCAP2H;
TL2=RCAP2L;
CT2 = 0; //T2:timer mode
TR2 = 1;
TCLK = 1;
RCLK = 1; //说明:52,对于SIO0,可选择T1(TCLK=0,RCLK=0)或T2(TCLK=1,RCLK=1)作为波特率发生器
// SIO1只能用T1作为波特率发生器
//baud=OSC/(32*(65536-[RCAP2H,RCAP2L])
CommSendBufferHead=CommSendBufferTail=0; // set the head and tail to the base of the ring buffer
CommRecBufferHead=CommRecBufferTail=0;
FlagRecComm=0;
RI0 = 0; // Clear HW_UART receive and transmit
TI0 = 0; // complete indicators.
SCON0 = 0x50; // Configure UART0 for mode 1, receiver enabled.
ES0 = 1; // allow the serial interrupt
SendItComm = 1;
}
void PutChar0(unsigned char Ch)
{
SBUF0 = Ch;
while(!TI0)
;
TI0 = 0;
}
void SendCommString0(unsigned char *base)
{
unsigned int len;
unsigned char i;
len = strlen(base);
for(i = 0; i<len; i++)
{
PutChar0(base[i]);
Delay1ms(1);
}
}
void serial_send_(unsigned char *base)
{
SendCommString0(base);
}
void CommISR0(void) interrupt 4
{
if (_testbit_(RI0))
{
RI0=0;
if (CommRecBufferTail==CommRecBufferHead)
{
CommRecDataOverflowFlag=1; //接收缓冲区溢出
}
CommRecBuffer[CommRecBufferTail]=SBUF0; //receive data
CommRecBufferTail++;
if (CommRecBufferTail==DB_RECMAXSIZE)
{
CommRecBufferTail=0;
}
FlagRecComm=1;
}
}
//从接收缓冲区读数据 ,无数据返回0,有数据返回1
bit GetCommChar0(unsigned char *ch)
{
if (CommRecBufferTail==CommRecBufferHead) return 0;
*ch=CommRecBuffer[CommRecBufferHead];
CommRecBufferHead++;
if (CommRecBufferHead==DB_RECMAXSIZE)
{
CommRecBufferHead=0;
}
if (CommRecBufferTail==CommRecBufferHead) FlagRecComm=0;
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -