📄 usart.c
字号:
/***********************************************************
文件名称: USART.c
作 者: ADVANCE-007
版 本: V1.0
说 明: 关于串口的最底层函数,供上层调用 , 晶体:4MHZ
修改记录:
***********************************************************/
/***************************************************************
********** 预定义说明区 ********************
***************************************************************/
#include <msp430x14x.h>
#include "USART.H"
#include "DATATYPE.H"
#include "GPIO.h"
#include "Delay.h"
/***************************************************************
********** 常,变量定义区 * *********************
***************************************************************/
//Note:It must be 1. COM1 & COM2
uchar g_bRxdPos=0;//接收定位计数器
uchar g_bRxdLen=0;//等待接收字节数
uchar g_aRecvBuf[RecDataLen];//接收数据缓冲区
const uchar Tab_Char[11]={'0','1','2','3','4','5','6','7','8','9','.'};
/***************************************************************
********** 函数说明 ********************
***************************************************************/
/**************************************************************
********** 函数 定义区 * *********************
***************************************************************/
/* com 的初始工作 *****************************************************
* comnum:输入:COM1 :初始化com1 port.
* 输入:COM2 :初始化com2 port.
* bps: 输入:BPSASK 只返回现有bps
* BPS4800 设置BPS:4800
* BPS9600 设置BPS:9600
* BPS19200 19200
* BPS28800 28800
* BPS57600 57600
* BPS115200 115200
* 其他数值 只返回现有bps
* 返回:返回现有bps,值范围:BPSASK,BPS4800,BPS9600,BPS19200,BPS28800,BPS57600,115200 ****/
void InitCom(uint8 comnum, uint8 bps) //注意: 晶体:4MHZ
{
//static uchar oldbps1=BPSASK;
//static uchar oldbps2=BPSASK;
if(comnum==COM1){
switch(bps){
case BPS4800:
UBR10=0x03;
UBR00=0x41;
UMCTL0=0x2a;
break;
case BPS9600:
UBR10=0x01;
UBR00=0xa0;
UMCTL0=0xab;
break;
case BPS19200:
UBR10=0x00;
UBR00=0xd0;
UMCTL0=0x2a;
break;
case BPS28800:
UBR10=0x00;
UBR00=0x8a;
UMCTL0=0xbf;
break;
case BPS57600:
UBR10=0x00;
UBR00=0x45;
UMCTL0=0xaa;
break;
case BPS115200:
UBR10=0x00;
UBR00=0x22;
UMCTL0=0xbb;
break;
default:break;
//return oldbps1;
}
//oldbps1=bps;
//********* COM1设置, 20070308 ADVANCE
UCTL0 = CHAR; // 设串口控制寄存器,数据位为8bit
UTCTL0 = SSEL1; //设串口发送控制寄存器的所用时钟,UCLK = SMCLK
// START COM1
ME1 |= URXE0 + UTXE0; //使能UART1的RXD和TXD
IE1 |= URXIE0 + UTXIE0; //使能UART1的RX和TX中断
P3SEL |= BIT5 + BIT4; //设置P3.5为URXD1,P3.4为UTXD1
P3DIR |= BIT4; //P3.4为UTXD1,输出管脚
//return oldbps1;
}
else if(comnum==COM2){
switch(bps){
case BPS4800: //注意: 晶体:11.0592MHZ
UBR11=0x03;
UBR01=0x41;
UMCTL1=0x2a;
break;
case BPS9600:
UBR11=0x01;
UBR01=0xa0;
UMCTL1=0xab;
break;
case BPS19200:
UBR11=0x00;
UBR01=0xd0;
UMCTL1=0x2a;
break;
case BPS28800:
UBR11=0x00;
UBR01=0x8a;
UMCTL1=0xbf;
break;
case BPS57600:
UBR11=0x00;
UBR01=0x45;
UMCTL1=0xaa;
break;
case BPS115200:
UBR11=0x00;
UBR01=0x22;
UMCTL1=0xbb;
break;
default:break;
//return oldbps2;
}
//oldbps2=bps;
//********* COM2设置,与COM1 完全相同 20070308 ADVANCE
//UCTL1 = 0X00; //将寄存器的内容清零
UCTL1 = CHAR; // 设串口控制寄存器,数据位为8bit
//UTCTL1 = 0X00; //将串口发送控制寄存器的内容清零
UTCTL1 = SSEL1; //设串口发送控制寄存器的所用时钟,UCLK = SMCLK
// START COM2
ME2 |= URXE1 + UTXE1; //使能UART1的RXD和TXD
IE2 |= URXIE1;// + UTXIE1; //使能UART1的RX和TX中断
P3SEL |= BIT7 + BIT6; //设置P3.7为URXD1,P3.6为UTXD1
P3DIR |= BIT6; //P3.6为UTXD1,输出管脚
//return oldbps2;
}
//else
//return BPSASK;
}
/**************************************************/
void UartRxd0_Int_test(void)
{
TXBUF0 = ~RXBUF0;
IE1 |= UTXIE0;
}
//串口中断服务子程序 COM1 Port
// 处理来自串口 0 的接收中断
uchar COM1_R_flag=0;
interrupt [UART0RX_VECTOR] void usart0_rx(void)
{
g_aRecvBuf[g_bRxdPos++]=RXBUF0;
if(g_bRxdPos>=RecDataLen)
{
g_bRxdPos=0;
COM1_R_flag=1;
}
/*
unsigned char xdata * data t;
t=inRxBuf; t++;
if(t==RxBuf+LenRxBuf)
t=RxBuf;
if(t==outRxBuf) //RxBuf Full
return;
*inRxBuf=SBUF;
inRxBuf=t;
*/
}
//串口中断服务子程序 COM2 Port. Addr: 0x4b
// 处理来自串口 0 的发送中断
interrupt [UART0TX_VECTOR] void usart0_tx(void)
{
/*
unsigned char xdata * data t;
if(inTxBuf==outTxBuf) //TxBuf Empty
{
TIflag=1;
return;
}
SBUF=*outTxBuf;
outTxBuf++;
if(outTxBuf==TxBuf+LenTxBuf)
outTxBuf=TxBuf;
*/
}
// 处理来自串口 1 的接收中断
uchar COM2_R_flag = 0;
uchar Lead_flag = 0;
uchar Begin_flag = 0;//开始接收数据帧的标志;//曹修改
interrupt [UART1RX_VECTOR] void usart1_rx(void)
{
/*g_aRecvBuf[g_bRxdPos++] = RXBUF1;
if(g_bRxdPos>=RecDataLen)
{
g_bRxdPos = 0;
COM2_R_flag = 1;
}*/
////////////////////////////////////由此向下为曹跃东试验用代码////////////////////////////////////////////////////
if(RXBUF1 == 0xF0)
{
Lead_flag++;
}
if((RXBUF1 != 0xF0)&&(Lead_flag > 3))
{
//if((RXBUF1 == 0xAA)|(RXBUF1 == 0x55))
//{
//g_aRecvBuf[g_bRxdPos++] = RXBUF1;
Begin_flag = 1;
//}
//Lead_Flag = 0;Lead_flag-1)+
}
if(Begin_flag)
{
g_aRecvBuf[g_bRxdPos++] = RXBUF1;
if(g_bRxdPos >= (g_aRecvBuf[4]+6))
{
g_bRxdPos = 0;
COM2_R_flag = 1;
Lead_flag = 0;
Begin_flag = 0;
}
}
//////////////////////////////////////////////由此向上为曹跃东试验用代码///////////////////////////////////////////
/*
unsigned char xdata * data t;
t=inRxBuf; t++;
if(t==RxBuf+LenRxBuf)
t=RxBuf;
if(t==outRxBuf) //RxBuf Full
return;
*inRxBuf=SBUF;
inRxBuf=t;
*/
}
///////////////////////////////////////
// 处理来自串口 1 的发送中断
interrupt [UART1TX_VECTOR] void usart1_tx(void)
{
/* unsigned char xdata * data t;
if(inTxBuf==outTxBuf) //TxBuf Empty
{
TIflag=1;
return;
}
SBUF=*outTxBuf;
outTxBuf++;
if(outTxBuf==TxBuf+LenTxBuf)
outTxBuf=TxBuf;
*/
}
///////////////////////////////////////
/*****************************************************************************
接收字节函数。采用查询方式。
* comnum:输入:COM1 :初始化com1 port.
* 输入:COM2 :初始化com2 port.
******************************************************************************/
uchar RecUartByte(uint8 comnum)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -