MSP430如何接收串口特定字符串?

用其与一GPRS模块通过串口通讯,我使用的是UART1号端口,使用8MHz外部高速晶振作为MCLK,SMCLK时钟源,UART寄存器选择分频后,波特率为115k,确认端口... 用其与一GPRS模块通过串口通讯,我使用的是UART1号端口,使用8MHz外部高速晶振作为MCLK,SMCLK时钟源,UART寄存器选择分频后,波特率为115k,确认端口设置正确
MSP430发送字符到TX口,然后监听模块反馈的信息,并保存在char数组。模块发来的char数组中以0X0D为开头,其中有两个0X0A,所以以这两个0X0A为标志,确定收到两个0X0A作为反馈信息的结束,停止监听,然后再去使用这些char数组。
但是我不太清楚MSP430中断程序的机制,我编写的程序无法得到想要的结果:
展开
 我来答
凡人凡事_天天
2011-05-05 · 超过12用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:31.6万
展开全部
程序如下:

#include <msp430x14x.h>

#define DRE_out P3DIR |= BIT3 //连接485芯片的DE,RE端口的IO设置为输出状态
#define DE P3OUT |= BIT3 //设置485芯片处于发送状态
#define RE P3OUT &= ~BIT3 //设置485芯片处于接收状态
typedef unsigned char uchar;

unsigned char string[8] ;

void Set_UART1(void);
void PutString0(uchar *ptr);
void Send1Char(uchar sendchar);
void PutString(uchar *ptr);

/****************主函数****************/
void main(void)
{
unsigned int i;

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
P6DIR |= BIT2;P6OUT |= BIT2; //关闭电平转换
DRE_out;
RE;
Set_UART1();
_EINT();

while (1)
{

if((string[0] == 'A')&&(string[6] == 'a')) //LET MCU A DO.

{
DE;

for(i=0;i<3000;i++);
PutString0("a12.5522.33e");
for(i=0;i<800;i++);

RE;
LPM3;

}

}

}
/*******************************************
函数名称:Set_UART1
功 能:设置MCU的UART1对应的寄存器
参 数:无
返回值 :无
********************************************/
void Set_UART1(void)
{
P3SEL |= 0xC0; //将P3.6,P3.7选做UART1的通信端口

ME2 |= UTXE1 + URXE1; //使能USART1的TXD和RXD
UCTL1 |= CHAR; //选择8-bit字符
UTCTL1 |= SSEL0; //驱动时钟选择ACLK
UBR01 = 0x03; //波特率9600
UBR11 = 0x00;
UMCTL1 = 0x4a; //调整
UCTL1 &= ~SWRST; //初始化UART状态机
IE2 |= URXIE1 ; // 中断允许寄存器设置,接收中断允许

}

//串口接收中断,退出LPM3模式.
#pragma vector=USART1RX_VECTOR
__interrupt void usart1_rx (void)
{

static uchar rxcount = 0;
LPM3_EXIT;
string[rxcount++] = RXBUF1;
rxcount = rxcount%8; //0~7 loop

}
/*******************************************
函数名称:Send1Char
功 能:向PC机发送一个字符
参 数:sendchar--要发送的字符
返回值 :无
********************************************/
void Send1Char(uchar sendchar)
{
while (!(IFG2 & UTXIFG1)); //等待发送寄存器为空
TXBUF1 = sendchar;

}
/*******************************************
函数名称:PutSting0
功 能:向PC机发送字符串,无换行
参 数:ptr--指向发送字符串的指针
返回值 :无
********************************************/
void PutString0(uchar *ptr)
{
while(*ptr != '\0')
{
Send1Char(*ptr++); // 发送数据
}
}
启岩
2011-05-06 · TA获得超过1851个赞
知道小有建树答主
回答量:809
采纳率:0%
帮助的人:631万
展开全部
程序处理应该没有太大的问题,不知道你有效内容里面是否有0x0a如果有的话可能导致错误,你可以先把低功耗关掉来调试,调通了再使用低功耗。帮你写了根据你的内容写了个中断处理的函数,没有验证,仅供参考。另外我空间里面有一个我写的F149串口的例程你可以看看。

ReceiveBuf[count] = RXBUF1;

if(!fIncept) //判断第一个字节是否0x0D
{
if(ReceiveBuf[count] == 0x0d) //如果接收到的不是0x0d count会一直为0等待接收帧头
{
fIncept = true;
count++;
}
}
else
{
if(count >= 2) //确保至少接收到三个字节即帧头和帧尾
{
if(ReceiveBuf[count] == 0x0a && ReceiveBuf[count-1] == 0x0a)
{
count = 0;
//接收完成,可以改变标志位到主函数中去处理数据
}
}
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-05-06
展开全部
你可以开辟一个缓冲区,Buf[100],做成一个循环队列,串口中断里面接收到一个字符,就往队列里面添加接收到的新字符。主程序里面查询是否连续几个字符为你定义的包头:“a 10 11 12 13 ff ” ,如果是,就开始处理以下的字符。
另外,虚机团上产品团购,超级便宜
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式