本帖最后由 q891031520 于 2018-2-2 17:39 编辑
最近正在调试一个程序,MSP430F149的UART0和UART1分别连接PC0和PC1两台电脑, UART1连接的PC1发送数据时,返回来的不是原来的数据,发送ok,返回来给PC1的是 ASKII码表 对应 152 的字符,连接UART0的PC0也接收不到任何数据。P2OUT 连接的是8个LED灯。PC1可以正确接收到UART1发送的数据,而在另外的测试中,UART0和UART1的接收中断服务函数 分别写 TXBUF1=RXBUF0 和TXBUF0=RXBUF1时,也可以正确收发,怎么做可以让UART1的收发正确呢?
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
uchar num=0,sum;
uchar jud[2]={0,0};
//uchar wd[20],xy[20],xl[20];
uchar stand[2]={0,0};
void Send1Char0(uchar sendchar);
void PutString0(uchar *ptr);
void Send1Char1(uchar sendchar);
void PutString1(uchar *ptr);
void com_init();//串口初始化
void com_init1()
{
unsigned int i;
/*下面六行程序关闭所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
P3SEL |= BIT6+BIT7;
P3DIR |= BIT6;
BCSCTL1 &= ~XT2OFF; // XT2on
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2 + SELS; // MCLK = SMCLK = XT2
ME2 |= UTXE1 + URXE1; // 使能USART1的发送和接受
UCTL1 |= CHAR + SWRST; //选择8位字符
UTCTL1 |= SSEL1; //UCLK = SMCLK
UBR01 = 0x45; //波特率115200
UBR11 = 0x00;
UMCTL1 = 0x00;
UCTL1 &= ~SWRST; //初始化UART1
IE2 |= URXIE1; //使能UART1的 接收中断
_EINT(); //打开全局中断
}
void com_init()
{
P3SEL |= 0x30; // 选择P3.4和P3.5做UART通信端口 and P3.6 TXD P3.7 RXD
P3DIR |= BIT4;
ME1 |= UTXE0 + URXE0; // 使能USART0的发送和接受
UCTL0 |= CHAR + SWRST; // 选择8位字符
UTCTL0 |= SSEL1; // UCLK = SMCLK
UBR00 = 0x45; // 波特率115200
UBR10 = 0x00; //
UMCTL0 = 0x00; // Modulation
UCTL0 &= ~SWRST; // 初始化UART
IE1 |= URXIE0; // 使能USART0的接收中断
}
/******************************************* //
函数名称:data_SEND
功 能:发送AT
参 数:data
返回值 :无
********************************************/
void data_SEND()
{
while (!(IFG2 & UTXIFG1)); //等待发送寄存器为空
TXBUF1='A';
while (!(IFG2 & UTXIFG1)); //等待发送寄存器为空
TXBUF1='T';
}
/*******************************************
函数名称:UART1_RXISR
功 能:UART1的接收中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector = UART1RX_VECTOR
__interrupt void UART1_RXISR(void)
{
stand[0]=1;
sum=RXBUF1;
while (!(IFG2 & UTXIFG1));
TXBUF1 = sum;
while (!(IFG1 & UTXIFG0));
TXBUF0 = sum;
//
}
/*******************************************
函数名称:UART0_RXISR
功 能:UART0的接收中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
stand[0]=2;
}
/*******************************************
函数名称:Send1Char
功 能:向PC机发送一个字符
参 数:sendchar--要发送的字符
返回值 :无
********************************************/
void Send1Char0(uchar sendchar0)
{
while (!(IFG1 & UTXIFG0)); //等待发送寄存器为空
TXBUF0 = sendchar0;
}
void Send1Char1(uchar sendchar1)
{
while (!(IFG2 & UTXIFG1)); //等待发送寄存器为空
TXBUF1 = sendchar1;
}
/*******************************************
函数名称:PutSting
功 能:向PC机发送字符串
参 数:ptr--指向发送字符串的指针
返回值 :无
********************************************/
void PutString0(uchar *ptr0)
{
while(*ptr0 != ' ')
{
Send1Char0(*ptr0++); // 发送数据
}
// while (!(IFG1 & UTXIFG0));
// TXBUF0 = 0x0d;
// while (!(IFG1 & UTXIFG0));
// TXBUF0 = 0x0a; //发送换行指令
}
void PutString1(uchar *ptr1)
{
while(*ptr1 != ' ')
{
Send1Char1(*ptr1++); // 发送数据
}
P2OUT=0xfe;
// while (!(IFG2 & UTXIFG1));
// TXBUF1 = 0x0d;
// while (!(IFG2 & UTXIFG1));
// TXBUF1 = 0x0a; //发送换行指令
}
/********************主函数********************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P2DIR=0xff;
com_init1();
com_init();
P2OUT=0xf0;
PutString1("AT");
while(1)
{
if(stand[0]==1)
P2OUT=0xaa;
if(stand[0]==2)
{
P2OUT=0x3c;
while (!(IFG2 & UTXIFG1)); //等待发送寄存器为空
TXBUF1 = 0x41; //A
while (!(IFG2 & UTXIFG1)); //等待发送寄存器为空
TXBUF1 = 0x54; //T
stand[0]=3;
}
}
}
此帖出自
小平头技术问答
谢谢,可是我这边还没有max232芯片,只能排除问题,用单片机使用UART1发送给PC数据是正确的,如果使用TXBUF1=RXBUF0, 单片机将接收到的数据发回去就有问题, 应该是接收的问题,可能没有进入UART1的接收中断函数,但是又不知道怎么改。
非常感谢,已经解决
非常感谢,已经解决
一周热门 更多>