我通过电路板将端口接上MAX485后引出两条线,再经过USB转换器后连接PC,目前发送缓存器正常,能正确显示发送字符,但是通过串口助手无法显示。但奇怪的是是从PC上向单片机却能正确接收数据。我设置了中断函数,经过测试也发现无论是发送中断还是接收中断都能正确响应,就是PC的串口助手无法显示接收数据。

This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!感谢您的帮助,按照您的提示,现在串口助手可以接收到MCU发送的消息了,但是一个问题就是消息只能在我单步调试的时候才可以收到,然而当全速运行时就收不到数据,我还特意增加了延时,效果还是这样,现在不知道问题出在哪里?还麻烦向您请教!
#include "msp430.h"
#include <stdbool.h>
#include <stdint.h>
#define DRE485_out P2DIR |= BIT7 #485方向选择
unsigned char buffer0[] = {"\nA!545445\n"};
unsigned char buffer1[] = {"\r\n12121212!\r\n"};
unsigned char c[]={"ready for receive!"};
void initUART()
{ DRE485_out;
P2OUT &= ~BIT7; //初始化485为输入
// Configure USCI_A3 for UART mode 配置串口通信
UCA3CTLW0 = UCSWRST; // Put eUSCI in reset
UCA3CTLW0 |= UCSSEL__ACLK; // CLK = ACLK
UCA3BRW = 3;
UCA3MCTLW = 0x9200; // UCBRSx = 0x92, UCOS16 = 0
UCA3CTLW0 &= ~UCSWRST; // Initialize eUSCI
UCA3IE |= UCRXIE + UCTXIE; // Enable USCI_A3 interrupt 打开收发中断
}
void initGPIO()
{
// Setup P4.1 UCA0RXD, P4.2 UCA0TXD
P4SEL0 |= BIT2 + BIT1; // Set P3.0, P3.1 to non-IO
}
void clockSet()
{
UCSCTL6 &= ~(XT1OFF); // XT1 On
UCSCTL6 |= XCAP_1; // Internal load cap
// Loop until XT1 fault flag is cleared
do
{
UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
} while (SFRIFG1 & OFIFG);
UCSCTL6 &= ~(XT1DRIVE_3);
}
void send_buf(unsigned char *ptr) //发送字符串
{
P2OUT |= BIT7; //485发出
while(*ptr != '\0')
{
UCA3TXBUF = *ptr++;
while(!(UCA3IFG&UCTXIFG));
__delay_cycles(5000); 5ms延时
}
while(UCA3STATW & UCBUSY) ;
P2OUT &= ~BIT7; //485接收
}
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P5DIR |= BIT0 + BIT1; //发送,接收指示灯
P5OUT |= BIT0 + BIT1;
initUART();//初始化
initGPIO();
clockSet();
unsigned char *p0;
p0 = c;
send_buf(p0); // 发送 开始指令
__bis_SR_register(LPM3_bits + GIE);
}
#pragma vector=USCI_A3_VECTOR
__interrupt void USCI_A3_ISR(void)
{ unsigned char *p0,*p1;
p0 = buffer0;
p1 = buffer1;
unsigned char rxData;
switch(__even_in_range(UCA3IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2:
P5OUT ^= BIT0;
rxData = UCA3RXBUF; // Vector 2 - RXIFG 接收中断
if(rxData == 'A')
{ P2OUT |= BIT7; //先发出
while(*p0 != '\0')
{
while(UCA3STATW & UCBUSY) ; //此处用 while(!(UCA3IFG&UCTXIFG));不行,不知道为啥
UCA3TXBUF = *p0++;
__delay_cycles(5000); //再接收
}
P2OUT &= ~BIT7;
}
else
{ P2OUT |= BIT7;
while(*p1 != '\0')
{
while(UCA3STATW & UCBUSY) ;
UCA3TXBUF = *p1++;
__delay_cycles(5000);
}
P2OUT &= ~BIT7;
}
break;
case 4:
P5OUT ^= BIT1;
__delay_cycles(50000);
P5OUT ^= BIT1;
break; // Vector 4 - TXIFG 发送指示灯
default: break;
}
}
需要的朋友们可以参考,不足之处也请提出