【求助】(急)串口通信

fengyongbo   2004-9-27 16:51 楼主
各位大侠:
我编了段发送、接收程序,发送程序在CSPY仿真中我观察窗口的UART里的TXBUF有变化,说明程序是对的,但我在另一块板子上调试接收程序,始终接收不到上位机发送过来的数据,我在中断处设断点根本到不了,好象没进中断,请各位高手指点。是哪里错了。


发送程序:
#include <msp430x13x.h>

void Init(void);
char Data[6]={0x01,0x02,0x03,0x04,0x05,0x06};

void main(void)
{
unsigned char i;
WDTCTL=WDTPW+WDTHOLD;
Init();


while(1)
{
TXBUF0=0xFF; //以0XFF为前导

while ((UTCTL0& 0x01)==0)
for (i=0;i<=6;i++) //循环发送字符串以及结束0
{

TXBUF0=Data[i];
/*while ((UTCTL0& 0x01)==0);*/
}
}
}


void Init(void)
{
UCTL0&=~SWRST; //SWRST复位,USART允许
UCTL0=CHAR; //无校验,1位停止位,8位数据位,异步
UBR00=0xa0;
UBR10=0x01; //32KHz时,波特率为9600
UMCTL0=0x4A; //位调整
UTCTL0=SSEL0; //Select the ACLK 32kHz
ME1|=0x20;//UTXE1 ; //UART发送模块允许

P3SEL|=BIT4; //P3.4为发送模块
P3DIR|=BIT4;
}


接收程序:
#include<msp430x13x.h>
void InitRS_SLA1(void);
#define ADDRESS1 0X01 //定义从机的地址位
unsigned char i=0,j1,flag=0;
char Data1[20],Buffer1[20];

void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
InitRS_SLA1();
_EINT();
while(1);

}

void InitRS_SLA1(void)
{
UCTL0&=~SWRST; //SWRST复位,USART允许
UCTL0=CHAR; //8位数据位,1位停止位,地址位模式

UBR00=0X03;
UBR10=0X00;
UMCTL0=0X4A; //使用32KHZ晶振时,波特率为9600bps
UTCTL0=0X10; //选定ACLK(32KHZ晶振)为时钟源
ME1|=0X30; //UART1发送及接收模块允许
P3SEL=0X30; //P3.6,P3.7被UART1发送模块占用
P3DIR=0X10; //P3.6输出,P3.7输入

IE1|=URXIE0; //接收中断允许
}

interrupt[UART0RX_VECTOR] void UART0RX(void)
{

if(flag==0) //接收为地址方式时,等待正确地指出现
{
if(RXBUF0==0xff) //地址正确,改变接收为数据方式,准备接受
{
flag=1;
i=0;

}
}
else //接收为数据方式时
{
Data1[i]=RXBUF0; //数据存入Data数组中

if(Data1[i++]==0) //是否到达末尾
{
flag=0; //改变接收为地址方式
for(j1=0;j1<i;j1++)
Buffer1[j1]=Data1[j1]; //复制字符串
}
}
}

回复评论 (6)

你好像没开总中断
点赞  2004-10-1 15:11
不错,谢谢了
点赞  2004-10-2 21:11
看着有点眼熟,是不是一本430教材上的程序啊
点赞  2004-10-7 19:40
北航那本C语言呢。
点赞  2004-10-9 11:42
发送程序中:
/*while ((UTCTL0& 0x01)==0);*/
写发送缓冲器后需要检查发送完成位,为什么被注释掉了?
有可能发送数据出错。
点赞  2004-10-9 11:47
发送程序中:
/*while ((UTCTL0& 0x01)==0);*/
写发送缓冲器后需要检查发送完成位,为什么被注释掉了?
有可能发送数据出错。
点赞  2004-10-10 14:59
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复