MSP430 串口UART通信 通过串口调式助手接收字符串乱码,接收单个字符正常

用MSP430F149写了个简单的串口通信,过程很简单,接收到电脑上的串口调试助手发来的数据之后,再通过串口给电脑回复一个固定的数据(一个字节)。发送采用查询的方式,接收... 用MSP430F149 写了个简单的串口通信,过程很简单,接收到电脑上的串口调试助手发来的数据之后,再通过串口给电脑回复一个固定的数据(一个字节)。发送采用查询的方式,接收采用中断的方式,全部代码如下:

#include <msp430x14x.h>/////////串口发送函数,一次发送一个字节/////////void send_byte(unsigned char ubyte){ while(!(IFG1&UTXIFG0)); TXBUF0=ubyte;}////////////////////////////////////////////////////////////////////////void main(){ WDTCTL=WDTPW+WDTHOLD; //关闭看门狗 /////////////////////时钟初始化/////////////////////// BCSCTL1 &= ~ XT2OFF; do{ IFG1 &= ~OFIFG; for(unsigned char i=0xFF;i>0;i--); }while(IFG1&OFIFG); BCSCTL2|=SELS+SELM1; ////////////////////////////////////////////////////// ////串口初始化 9600 N 8 1 ACLK 发送采用查询方式,接收采用中断方式////// UCTL0 |= SWRST; P3SEL=0x30; ME1|=UTXE0+URXE0; UCTL0|=CHAR; UTCTL0|=SSEL0; UBR00=0x03; UBR10=0x00; UMCTL0=0x4A; UCTL0 &= ~SWRST; IE1|=URXIE0; /////////////////////////////////////////////////////////////////////// while(1){ //进入循环等待中断的产生 _BIS_SR(LPM3_bits+GIE); } }#pragma vector=USART0RX_VECTOR__interrupt void uart_rx(void){ //接收中断处理函数 send_byte('A');}

/////////////////////////代码结束/////////////////////////////

现在遇到的问题是:用串口调试助手,发送一个字符给单片机,可以正常运行,单片机进入中断处理程序,给上位机回复了一个固定的字符 'A',并通过串口调试助手的界面显示出来。但如果用助手发送一个字符串给单片机,那么单片机的工作将不正常了,请老师看截图:
展开
 我来答
cbing2000
推荐于2018-04-11 · TA获得超过1274个赞
知道小有建树答主
回答量:990
采纳率:100%
帮助的人:467万
展开全部
当你发送一串字符串给单片机的时候,430刚接收到第一个字符于是开始进行回发固定数据给串口助手,可还没发送完毕(发送需要时间,而你尽然在接收中断里发送,这样接受中断就得不到及时响应),你第二个字符串又进来了,于是出错了。(第一件事还没干完,你第二件、第三件。。。全部紧接的来了,要你,你不疯?)这里的问题是你没搞明白整个流程,这个程序框架也不好。这种情况下,你需要建立一个缓存区(FIFO),中断的任务就是把接收到的数据扔到缓存,置标志位,并立马退出!在主程序里发送数据,这样就不会导致接收无法及时响应问题(这个跟蓄水池一样的道理)
Choret
2013-12-28
知道答主
回答量:4
采纳率:0%
帮助的人:6038
展开全部
1,有可能接收中断里面没屏蔽中断,导致正常的发送被打断
2,可能数据格式设置的问题(起止位校验位数据位等等设置PC和单片机不一致)

ps没写过430的串口,仅供参考……囧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
鼎硕元音乐甄选
2014-01-03 · TA获得超过3461个赞
知道小有建树答主
回答量:310
采纳率:33%
帮助的人:133万
展开全部
RXBUF0 成功接收一个字节之后,进入中断程序。一旦进入中断程序或者RXBUF0中的数据被读走之后,相关中断寄存器标志位被清除,然后RXBUF0重新接收新的数据。这就是为什么你接收一个字符很正常的原因。
当发送一个字符串的时候,如果已经进入中断函数,但是RXBUF0的数据你还没读走,并且新数据以极快的速度又堆到腚门子上了,进而疯狂的覆盖了RXBUF0中原有的数据,这样你的程序就乱套了,出现乱码很正常。你看看你中断函数里面调用了一个函数,当发送一串数据的时候,你的函数还没有执行完呢、新来的数据就把RXBUF0覆盖了。。。

所以说,你可以在先定义一个字符数组,然后在中断函数里面将收到的数据一一码到数组里面,就像垒麻将一样,然后在主函数里面将字符串中的数据一一送到TXBUF0里面发送出去,就行了。应该是这么回事,你测试下看看。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式