一个简单程序(UART),不晓得问题出在那里,请大家帮哈忙!

jeans703   2005-12-12 10:25 楼主
以下代码是UART0操作:收到上位机的字符然后转送回去。结果是能收到,但是是错误的,如发 01 收到 C0,请大家看看是那里出错了,小弟刚开始用430。

/****************************************************
说明:串口测试程序
波特率:9600bps
****************************************************/

#include"msp430x16x.h"
#include"UartTest.h"
#include"initialize.h"

extern unsigned char chr;

void intiuart0(void)
{

// UCTL0&=~SWRST;
UCTL0=CHAR;
UTCTL0|=SSEL0;
UBR00=0x03;
UBR10=0x00;
UMCTL0=0x4A;
// ME1|=URXE0;
ME1 |= UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
IE1 |= URXIE0; //允许接收中断
P3SEL|=0X30;
P3DIR|=BIT34; //设置为输出
P3DIR&=~BIT35; //设置为输入
_EINT();
}
/**************
串口中断服务
**************/

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready?
chr = RXBUF0;
TXBUF0 = chr;
}

回复评论 (13)

查看一下硬件电路吧
程序上好象没问题。
点赞  2005-12-12 11:00
while ( ((UTXIFG0 & IFG1) == 0) && ((U0TCTL & TXEPT) == 0)) { };
点赞  2005-12-12 11:10
初始化时

U0CTL |= SWRST;
.....

然后
U0CTL &= ~SWRST;
点赞  2005-12-12 11:12
用这个程序试试
#include <msp430x16x.h>

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
ME1 |= UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
UCTL0 |= CHAR; // 8-bit character
UTCTL0 |= SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 32k/9600 - 3.41
UBR10 = 0x00; //
UMCTL0 = 0x4A; // Modulation
UCTL0 &= ~SWRST; // Initialize USART state machine
IE1 |= URXIE0; // Ena××e USART0 RX interrupt

_BIS_SR(LPM3_bits + GIE); // Enter LPM3 w/ interrupt
}

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0
}
点赞  2005-12-12 12:01
多谢楼上各位热心人!!

原先我在主程序里加过测过代码,结果是上位机能正确收到下位机发送的字符;也测试过上位机发送数据时的波形,进430之前都是正确的,就是不能正确收到上位机的数据。

我照楼上各位给的方法去试一下。
点赞  2005-12-12 12:12
还是一样的问题。
仿真时,接收缓冲RXBUF里数据不是上位机发送的数据,接收到的是错误数据,但是430能把接收到的错误数据正确送回上位机,不明白是怎么回事。
不晓得论坛能不能贴图,我想把串口部分电路贴上来给大家看哈 是不是硬件有问题。
点赞  2005-12-13 11:07
查查232的通讯芯片包括相关电路,斑竹的程序是否使用测试了?问题解决了没有?
点赞  2005-12-15 12:48
代码我试过了,也是一样的问题。
不过发现一个这样的现象:不论是斑竹的代码还是我原来的代码,在仿真时(不外加电、由仿真器供电的情况),发现能正确的收发数据,此时测了一下仿真器供电为:2.5V左右;一旦外加电源(超过2.7V)问题就出来了,这是怎么回事呢?很着急啊,这个问题不解决后面的事情就没法做了!!
请各位430高手指点一下迷津,问题在出那部分??
点赞  2005-12-16 17:24
你外加电源时,是否仿真器也在继续供电?
点赞  2005-12-17 09:32
你是循环发送接受的???

时间太快了 很可能错的
点赞  2005-12-17 10:52
是这样的:仿真器上有个跳针,为允许外加电仿真和禁止外加电仿真。外加电超过2.7V时就出问题了,即使不仿真、全速运行时,也是同样问题。
另外我用的是网上的串口调试助手,自动发送数据,间隔1S,这应该不是很快吧,还有,手动发送也是这样啊
点赞  2005-12-17 12:16
while ((IFG1 & URXIFG0) == 0);
点赞  2006-4-26 22:59
ME2 |= UTXE0 + URXE0; // Ena××e USART0 TXD/RXD
点赞  2006-4-26 23:04
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复