我现在想用msp430g2553做一个蓝牙遥控小车,但是在UART串口这里遇到了问题,我用手机蓝牙控制小车的软件输出的指令为ax,但是单片机上始终无法读取到指令下面是我UART EVENT程序的,这个程序只是个实验程序,我在手机上发送指令ax,使led1亮,我发wx,使led1灭。
/*
* UART_Event.c
* 功能:全面处理与上位机通信的相关事宜
* Created on: 2013-3-18
* Author: Administrator
*/
#include "MSP430G2553.h"
#include "UARt_Global.h"
#include "UART_FIFO.h"
#include "UART_Event.h"
//-----对于硬件有关的代码宏定义处理-----
#define LED1_ON P1DIR|=BIT0; P1OUT|=BIT0
#define LED1_OFF P1DIR|=BIT0; P1OUT&=~BIT0
#define LED2_ON P1DIR|=BIT6; P1OUT|=BIT6
#define LED2_OFF P1DIR|=BIT6; P1OUT&=~BIT6
void Command_match(); // 字符匹配命令函数
/******************************************************************************************************
* 名 称:UART_OnTx()
* 功 能:UART的Tx事件处理函数
* 入口参数:无
* 出口参数:无
* 说 明:Tx_FIFO里有数据就将数据移到Tx Buffer寄存器中去
* 范 例:无
******************************************************************************************************/
void UART_OnTx(void)
{
unsigned char Temp;
if(Tx_FIFO_DataNum>0)
{
Tx_FIFO_ReadChar(&Temp); //调用FIFO库函数
UCA0TXBUF= Temp;
}
}
/******************************************************************************************************
* 名 称:UART_OnRx()
* 功 能:UART的Rx事件处理函数
* 入口参数:无
* 出口参数:无
* 说 明:对接收到的数据,区别对待进行处理
* 范 例:无
******************************************************************************************************/
void UART_OnRx(void)
{
unsigned char Temp = 0;
Temp=UCA0RXBUF; // 预存下Tx Buffer数据
//-----首先必须回显屏幕-----
if(Temp == 0x78) //如果是回车
{
Tx_FIFO_WriteChar('\r');
Tx_FIFO_WriteChar('\n');
}
//-----回车后开始数据帧识别-----
if(Temp == 0x78) // 如果是回车,表明可以做个”了断“了
{
if(Rx_FIFO_DataNum > 0) //FIFO里有数据,则进行数据判断
{
Command_match(); //判断命令是什么
Rx_FIFO_Clear(); //清空FIFO
}
}
//-----退格键则要删除FIFO里一个数据-----
else if(Temp==0x08 || Temp==0x7f) //如果是退格键,则需要删除一个
{
if( Rx_FIFO_DataNum>0) //有数据才需要删,没有数据当然不用删
{
_disable_interrupts(); //操作FIFO时必须关中断
Rx_FIFO_DataNum--; //待读数据减1
if(Rx_FIFO_IndexW >0) //防止溢出
Rx_FIFO_IndexW--; //写指针退格
_enable_interrupts();
}
}
//-----既不是回车也不是退格,那就正常存命令数据-----
else
{
Rx_FIFO_WriteChar(Temp); //正常写FIFO
}
}
/******************************************************************************************************
* 名 称:UART_SendString()
* 功 能:用UART发送一个字符串
* 入口参数:*Ptr:字符串首地址
* 出口参数:无
* 说 明:字符串如果很长,超过Tx_FIFO长度,则会发生阻塞CPU
* 范 例:无
******************************************************************************************************/
void UART_SendString(const unsigned char *Ptr) //给上位机发送字符串
{
while(*Ptr)
{
Tx_FIFO_WriteChar(*Ptr++);
}
}
/******************************************************************************************************
* 名 称:Command_match()
* 功 能:对接收到的命令数据进行匹配,根据匹配结果控制LED并回显处理结果
* 入口参数:无
* 出口参数:无
* 说 明:共4种预先约定的命令字:LED1_ON,LED1_OFF,LED2_ON,LED2_OFF
* 范 例:无
******************************************************************************************************/
void Command_match() // 字符匹配命令
{
unsigned char Command_Num=0;
if((Rx_FIFO[0]==0x61)&&(Rx_FIFO[1]==0x78))
{
Command_Num=1;
}
if((Rx_FIFO[0]==0x77)&&(Rx_FIFO[1]==0x78))
{
Command_Num=2;
}
switch(Command_Num)
{
case 0:;break;
case 1: LED1_ON;;break;
case 2: LED1_OFF;;break;
default:break;
}
}
下面一步一步调试出现的状况FIFO的情况