TI中文支持网
TI专业的中文技术问题搜集分享网站

关于485通信问题,MSP430F6779

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

Susan Yang:

请您现参考一下之前的帖子

e2echina.ti.com/…/73152

另外建议用示波器观察一下通信的情况,谢谢

,

user6380774:

您好!感谢您的帮助,按照您的提示,现在串口助手可以接收到MCU发送的消息了,但是一个问题就是消息只能在我单步调试的时候才可以收到,然而当全速运行时就收不到数据,我还特意增加了延时,效果还是这样,现在不知道问题出在哪里?还麻烦向您请教!

,

Susan Yang:

您是在发送数据之后加的延时?

建议将发送数据后 转入接收回应信号状态。接收方收到数据后,给一个回应信号。
发送方接收到回应信号,如果是成功,就发下一个包,如果是失败,就按照客户自定义的规则重发或者进行错误处理。

,

user6380774:

我是在发送数据后加的延时,通过参考您发送的链接,我修改了while(!(UCA3IFG&UCTXIFG));为while(UCA3STATW & UCBUSY) ;后程序可正常运行,问题是单步调试是UCTXIFG为1可以跳出循环,全速运行时UCTXIFG一直为0所以我选择直接不考虑这一位了,目前发送数据是正确的

,

user6380774:

#include "msp430.h"#include <stdbool.h>
#include <stdint.h>#define DRE485_outP2DIR |= 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 resetUCA3CTLW0 |= UCSSEL__ACLK;// CLK = ACLKUCA3BRW = 3;UCA3MCTLW = 0x9200;// UCBRSx = 0x92, UCOS16 = 0UCA3CTLW0 &= ~UCSWRST;// Initialize eUSCIUCA3IE |= UCRXIE + UCTXIE;// Enable USCI_A3 interrupt 打开收发中断}void initGPIO()
{// Setup P4.1 UCA0RXD, P4.2 UCA0TXDP4SEL0 |= BIT2 + BIT1;// Set P3.0, P3.1 to non-IO}void clockSet()
{UCSCTL6 &= ~(XT1OFF);// XT1 OnUCSCTL6 |= XCAP_1;// Internal load cap// Loop until XT1 fault flag is cleareddo{UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);// Clear XT2,XT1,DCO fault flagsSFRIFG1 &= ~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 resetWDTCTL = 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 interruptcase 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;}
}需要的朋友们可以参考,不足之处也请提出

,

Susan Yang:

谢谢您分享代码!

赞(0)
未经允许不得转载:TI中文支持网 » 关于485通信问题,MSP430F6779
分享到: 更多 (0)