通过串口给430发送指令,识别不同的指令,点亮不同的灯,每次上电就能识别第一个指令,后面的指令都显示错误,不知道什么原因。
是通过PC的串口调试助手,发送指令的。第一个指令能识别,后面的都识别出来提示错误。
有熟悉430的帮忙看看,以下是代码,第一次用430,还不太熟悉。
#include <msp430x14x.h>
//定义串口操作变量
// 串口 1 的接收标志
char nRev_UART0;
// 串口 1 的接收缓冲区
char UART0_RX_BUF[20];
char nRX0_Len;
char nRX0_Len_temp;
int ProcessCMD(char pBuf[],int nLen)
{
int nTemp = -1;
if(nLen <= 2) return -1;
if (nLen == 6)
{
if((pBuf[0] == 'M') && (pBuf[1] == 'O')
&& (pBuf[2] == 'D') && (pBuf[3] == 'E')
&& (pBuf[4] == '1'))
nTemp = 1;
if((pBuf[0] == 'M') && (pBuf[1] == 'O')
&& (pBuf[2] == 'D') && (pBuf[3] == 'E')
&& (pBuf[4] == '2'))
nTemp = 2;
if((pBuf[0] == 'M') && (pBuf[1] == 'O')
&& (pBuf[2] == 'D') && (pBuf[3] == 'E')
&& (pBuf[4] == '3'))
nTemp = 3;
if((pBuf[0] == 'M') && (pBuf[1] == 'O')
&& (pBuf[2] == 'D') && (pBuf[3] == 'E')
&& (pBuf[4] == '4'))
nTemp = 4;
if((pBuf[0] == 'C') && (pBuf[1] == 'L')
&& (pBuf[2] == 'O') && (pBuf[3] == 'S')
&& (pBuf[4] == 'E'))
nTemp = 5;
}
if (nLen == 5)
{
if((pBuf[0] == 'O') && (pBuf[1] == 'P')
&& (pBuf[2] == 'E') && (pBuf[3] == 'N'))
nTemp = 6;
}
return nTemp;
}
/********************主函数********************/
void main(void)
{
char UART0_RX_Temp[20];
int i;
int nRes = 0;
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口
ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受
UCTL0 |= CHAR; // 选择8位字符
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 波特率9600
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // 初始化UART状态机
IE1 |= URXIE0; // 使能USART0的接收中断
while(1)
{
_EINT(); //打开全局中断
LPM1; //进入LPM1模式
if(nRev_UART0 == 1)
{
nRev_UART0 = 0;
// 将接收到的数据拷贝到临时缓冲区
for(i = 0;i < nRX0_Len;i++)
UART0_RX_Temp[i] = UART0_RX_BUF[i];
nRes = ProcessCMD(UART0_RX_Temp,nRX0_Len);
switch(nRes)
{
case 1:
P3OUT = 0X1;
nRX0_Len = 0;
break;
case 2:
P3OUT = 0X2;
nRX0_Len = 0;
break;
case 3:
P3OUT = 0X4;
nRX0_Len = 0;
break;
case 4:
P3OUT = 0X8;
nRX0_Len = 0;
break;
case 5:
P3OUT = 0X10;
nRX0_Len = 0;
break;
case 6:
P3OUT = 0X40;
nRX0_Len = 0;
break;
case -1:
nRX0_Len = 0;
break;
}
}
}
}
/*******************************************
函数名称:UART0_RXISR
功 能:UART0的接收中断服务函数,在这里唤醒
CPU,使它退出低功耗模式
参 数:无
返回值 :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
LPM1_EXIT; //退出低功耗模式
UART0_RX_BUF[nRX0_Len_temp] = RXBUF0; //接收来自的数据
nRX0_Len_temp += 1;
if(UART0_RX_BUF[nRX0_Len_temp - 1] == 13)
{
nRX0_Len = nRX0_Len_temp;
nRev_UART0 = 1;
nRX0_Len_temp = 0;
}
}
|