|
分享MSP430单片机UART定长帧与变长帧处理程序
[复制链接]
MSP430单片机UART定长帧与变长帧处理程序
MSP430单片机UART定长帧处理程序:
#include
#define FRAME_SIZE 8 /*定长帧的长度*/
#define LOCAL_ADDR 0x01
unsigned char FrameBuff[FRAME_SIZE]; /*接收帧缓冲区数组*/
unsigned int UART_RcvCnt=0; /*接收计数*/
unsigned char FrameRcvStatus=0; /*帧接收状态*/
#define FREE 0
#define RECEIVE 1
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void) // 串口接收中断
{
if(FrameRcvStatus==FREE) // 空闲状态下
{
if((U0RCTL & RXWAKE) &&(U0RXBUF==LOCAL_ADDR))
{ //如果收到的是帧首字节,且与本机地址相符
FrameBuff[0]=U0RXBUF; //接收该字节
FrameRcvStatus=RECEIVE; //状态跳转至接收状态
UART_RcvCnt=1; //接收计数(已经接收1字节)
}
}
else if(FrameRcvStatus==RECEIVE) // 在接收状态下
{
if((U0RCTL & RXWAKE)==0) //如果收到的是数据
{
FrameBuff[UART_RcvCnt]=U0RXBUF; //接收该字节数据
UART_RcvCnt++; //指向下一单元
}
else //如果又收到是帧首字节(数据帧中断或漏发)
{
if(U0RXBUF==LOCAL_ADDR) //且地址相符
{
FrameBuff[0]=U0RXBUF; //接收该字节数据
UART_RcvCnt=1; //重新接收数据
}
else //地址不符
{
UART_RcvCnt=0; //接收数组清零
FrameRcvStatus=FREE; //重新回到空闲状态,等待帧起始
}
}
if(UART_RcvCnt>=FRAME_SIZE )
{
//--------------------------------------------------------------------------
// 数据帧接收完毕,在这里写数据帧处理程序
_NOP(); //在这里设断点查看FrameBuff[]数组的数据
//--------------------------------------------------------------------------
UART_RcvCnt=0; //接收数组清零
FrameRcvStatus=FREE; //重新回到空闲状态,等待帧起始
}
}
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
U0CTL = CHAR; // 异步通讯模式,8位数据,无校验,1位停止位。
ME1 |= UTXE0 + URXE0; // 开启串口0收发模块
U0TCTL |= SSEL0; // 选择ACLK作为串口波特率时钟源。
U0BR1 = 0; //
U0BR0 = 13; // 分频系数整数部分=13
U0MCTL = 0x6B; // 分频系数小数部分调制=5/8。(2400bps)
P2SEL |= BIT4 + BIT5; // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
IE1 |= URXIE0; // 开启UART0的接收中断,在中断内接收数据
_EINT(); // 总中断允许
while(1)
{
//CPU可以执行其他任务
}
}
复制代码
MSP430单片机UART变长帧处理程序:
#include
#define FRAMEBUF_SIZE 32 /*最大帧长度*/
unsigned char FrameBuff[FRAMEBUF_SIZE]; /*接收帧缓冲区数组*/
unsigned int UART_RcvCnt=0; /*接收计数*/
#pragma vector=UART0RX_VECTOR
__interrupt void UART0_RX (void) // 串口接收中断
{
int i;
if(U0RXBUF==0x0D) return; //对回车命令的第一字节不响应
if(U0RXBUF==0x0A) //收到结束符
{
//--------------------------------------------------------------------------
// 数据帧接收完毕,在这里写数据帧处理程序,注意缓冲区只用前UART_RcvCnt个数据
_NOP(); //在这里设断点查看FrameBuff[]数组的数据
//--------------------------------------------------------------------------
UART_RcvCnt=0; //清除接收缓冲区字节数清零
for(i=0;i=0; //清除接收缓冲区(可省略)
return;
}
if(UART_RcvCnt
{
FrameBuff[UART_RcvCnt]=U0RXBUF; //接收一字节数据
UART_RcvCnt++; //指向下一字节
}
}
void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
U0CTL = CHAR; // 异步通讯模式,8位数据,无校验,1位停止位。
ME1 |= UTXE0 + URXE0; // 开启串口0收发模块
U0TCTL |= SSEL0; // 选择ACLK作为串口波特率时钟源。
U0BR1 = 0; //
U0BR0 = 13; // 分频系数整数部分=13
U0MCTL = 0x6B; // 分频系数小数部分调制=5/8。(2400bps)
P2SEL |= BIT4 + BIT5; // P2.4,5 开启第二功能,作为串口收发引脚(不同单片机有差别)
IE1 |= URXIE0; // 开启UART0的接收中断,在中断内接收数据
_EINT(); // 总中断允许
while(1)
{
//CPU可以执行其他任务
}
}
|
|