⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart0.c

📁 本程序是一个RS232转网口的。是一个透明传输的模块
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
*****************************************************************************************************
*
*  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 + -