📄 uart0.c
字号:
/*
*****************************************************************************************************
*
* File name: uart0.c (MCU的串口0)
*
* 通讯终端: MCU <==> PC
* 波特率: 57600
*
* 功能:
* MCU的UART0操作:1:接收上位机的数据,通过AT^SISW 发送到GPRS网络,
* 2:通过读GPRS接收来的数据,AT^SISR,再转发给PC端
*
*
* NOTE: MODEM的UART0引到DB9的PIN4,PIN9,可用SSCOM与MODEM直接AT5指令交互通讯
*
*
*****************************************************************************************************
*/
#include "..\head\includes.h"
unsigned char xdata TxBuf[LenTxBuf]; // 收发缓冲区实体
unsigned char xdata RxBuf[LenRxBuf];
unsigned char xdata *inRxBuf,*outRxBuf; // inRxBuf指向收的收,outRxBuf指向收缓冲区的读
unsigned char xdata *inTxBuf,*outTxBuf;
unsigned char xdata bRxFull; //标志收缓冲区是否溢出
unsigned char xdata bFullSend; //收缓冲区是否溢出是否已发送满命令
unsigned char xdata bEptSend; //收缓冲区空时是否已发空命令
bit TIflag=1; //Note:It must be 1.
unsigned char xdata *inRxBuf_Bak=0;
unsigned int xdata Rx0_Counter; //二级缓冲区接收一侦实际长度
unsigned char xdata Mid_Buf[MAX_FRAME_SIZE]; //二级缓冲区,用来记录一侦是否结束,结束后存入Te2NetBuf
_UART_BUF_STRUCT_ xdata Te2NetBuf[MAX_BUF_NUM]; // 终端到网络
unsigned char xdata FrameIn; //用来指向Te2NetBuf进入数据的标量
unsigned char xdata FrameOut; //用来指向Te2NetBuf取出数据的标量
_UART_BUF_STRUCT_ xdata Net2TeBuf[MAX_BUF_NUM2]; // 网络到终端
unsigned char xdata FrameIn2; //用来指向Net2TeBuf进入数据的标量
unsigned char xdata FrameOut2; //用来指向Net2TeBuf取出数据的标量
/*
*****************************************************************************************************
*Func: 串口中断程序
*Note:
* 1:
* 2:
*****************************************************************************************************
*/
void Uart0_ISR(void) interrupt 4
{
unsigned char xdata *t;
if (TI) {
TI=0;
if (inTxBuf == outTxBuf) { //TxBuf Empty
TIflag=1;
} else {
ACC = *outTxBuf;
if (ComcBit == '1') {
TB8 = ~P; // 方式3:奇校验位
} else if (ComcBit == '2'){
TB8 = P; // 方式3:偶校验位
}
SBUF=*outTxBuf;
outTxBuf++;
if (outTxBuf == TxBuf+LenTxBuf) // Begin ->end ->begin
outTxBuf = TxBuf;
}
}
if (RI) {
RI=0;
TimerMil[T_FRAME_END] = FRAME_END_TIME;
t=inRxBuf;
t++; //保留指针位置
if (t == RxBuf+LenRxBuf) {
t = RxBuf; //如果到缓冲区末尾,则返回缓冲区头
}
if (t != outRxBuf) { //如果相等,说明缓冲区满了,RxBuf Full
*inRxBuf = SBUF;
inRxBuf = t;
} else {
bEptSend = FALSE; //在满了之后,需等待发送空信号
bFullSend =FALSE;
bRxFull = TRUE; //收缓冲区满
}
}
}
/*
*****************************************************************************************************
*Func: uart相关寄存器
*Note: 波特率:每秒传送多少位。
*
* 1: SCON寄存器 7 6 5 4 3 2 1 0
* ------------------------------------------------------------------------
* SM0 SM1 SM2 REN TB8 RB8 TI RI
* ------------------------------------------------------------------------
* 0 0 : 方式0:
* 0 1 : 方式1: 8位数据位的UART工作方式
* REN 置1允许接收,置0禁止接收
* ------------------------------------------------------------------------
* 2: PCON寄存器 7 6 5 4 3 2 1 0
* ------------------------------------------------------------------------
* SMOD(置1波特率加倍速)
* ------------------------------------------------------------------------
*
* 3: IE寄存器 7 6 5 4 3 2 1 0
* ------------------------------------------------------------------------
* EA X X ES ET1 EX1 ET0 EX0
* ------------------------------------------------------------------------
*****************************************************************************************************
*/
void Uart0Init(void)
{
unsigned int baudrate=9600;
baudrate = vBaudRate[ConfigReg.reg.BautRateStr[0]-0x31];
TMOD=TMOD & 0x0F;
TMOD=TMOD | 0x20;
switch(baudrate) {
case 1200:
case 2400:
case 4800:
case 9600:
case 19200:
PCON &= 0x7F;
break;
case 38400:
case 57600:
baudrate /= 2;
PCON |= 0x80;
break;
default:
baudrate = 9600; //默认为9600
PCON &= 0x7F; // 9600
break;
}
TH1 = 256 - XTAL / baudrate / 32 / 12;
TL1 = TH1;
//0: NONE 1:OLD 2:EVEN
if ((ConfigReg.reg.WPCOMC[0] == '1') || (ConfigReg.reg.WPCOMC[0] == '2')) {
SCON = 0xd0; // 方式3:奇偶校验位
} else {
SCON = 0x50; // 方式1:无校验位
}
ET1 = 0;
TR1 = 1;
}
/*
*****************************************************************************************************
*Func: 串口缓冲区初始化
*Note:
* 1:
* 2:
*****************************************************************************************************
*/
void Uart0BufferInit(void)
{
unsigned char i;
inTxBuf = TxBuf;
outTxBuf = TxBuf;
inRxBuf = RxBuf;
outRxBuf = RxBuf;
bRxFull = FALSE; //收缓冲区非满
bFullSend = FALSE;
bEptSend = TRUE;
Rx0_Counter = 0; //一侦实际长度
TimerMil[T_FRAME_END] = 0; //一侦结束时间
for (i=0; i<MAX_BUF_NUM; i++) {
Te2NetBuf[i].statu = 0;
}
for (i=0; i<MAX_BUF_NUM2; i++) {
Net2TeBuf[i].statu = 0;
}
FrameIn2 = FrameOut2 = 0;
FrameIn = FrameOut = 0;
EA=1;
ES=1;
}
/*
*****************************************************************************************************
*Func: 从串口缓冲区读1字节数据,并对缓冲区状态进行检查。如果满了,则
发送缓冲区满信号,如果为空,则发送缓冲区为空信号。
*Note:
* 1: 为了实现接收串口的数据,对缓冲区溢出情况进行处理
* 2:
*****************************************************************************************************
*/
#if 0
bit Mygetch(unsigned char xdata *ch)
{
ES = 0;
if (bRxFull && !bFullSend) { //接收缓冲区满,则发送full信号
bFullSend = TRUE;
DebugMsg(51);
}
if (inRxBuf == outRxBuf) { //为空
ES = 1;
bRxFull = FALSE;
if(!bEptSend) { //RxBuf Empty
bEptSend = TRUE;
DebugMsg(52);
}
return 0;
}
*ch=*outRxBuf;
outRxBuf++; //数据被读走,读指针加1
if(outRxBuf == RxBuf+LenRxBuf) {
outRxBuf = RxBuf; //如果读指针到缓冲区尾部,则返回到头部
}
ES = 1;
return 1;
}
#endif
/*
*****************************************************************************************************
*Func: 从串口缓冲区读1字节数据,并对缓冲区状态进行检查。如果满了,则
发送缓冲区满信号,如果为空,则发送缓冲区为空信号。
*Note:
* 1: 为了实现接收串口的数据,对缓冲区溢出情况进行处理
* 2: 用备份指针对其操作,减少分侦的可能性
*****************************************************************************************************
*/
bit Mygetch(unsigned char xdata *ch)
{
ES = 0;
if (bRxFull && !bFullSend) { //接收缓冲区满,则发送full信号
bFullSend = TRUE;
DebugMsg(51);
}
if (inRxBuf_Bak == outRxBuf) { //为空
ES = 1;
bRxFull = FALSE;
if(!bEptSend) { //RxBuf Empty
bEptSend = TRUE;
DebugMsg(52);
}
return 0;
}
*ch=*outRxBuf;
outRxBuf++; //数据被读走,读指针加1
if(outRxBuf == RxBuf+LenRxBuf) {
outRxBuf = RxBuf; //如果读指针到缓冲区尾部,则返回到头部
}
ES = 1;
return 1;
}
/*
*****************************************************************************************************
*Func: 显示字符
*Note:
* 1:
* 2:
*****************************************************************************************************
*/
void PrintChar(unsigned char ch)
{
unsigned char xdata *t;
ES = 0; //hong
if(TIflag)
{
TIflag = 0;
TI = 1;
}
t = inTxBuf;t++;
if(t == TxBuf+LenTxBuf) t = TxBuf;
if(t == outTxBuf)
{
ES = 1;
return;
}//TxBuf Full
*inTxBuf = ch;
inTxBuf = t;
ES=1; //hong
}
/*
*****************************************************************************************************
*Func: 输出16进制数
*Note:
*****************************************************************************************************
*/
#ifdef _DEBUG_
void PrintCh(unsigned char ch)//内部使用,不建议用户看到。
{
if(ch>=0&&ch<=9) ch=ch+'0';
else if(ch>=10&&ch<=15) ch=ch+'A'-10;
PrintChar(ch);
}
void PrintByte(unsigned char Byte)//以十六进制格式显示1个字节数据
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -