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.

关于485通信问题,MSP430F6779

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

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

    e2echina.ti.com/.../73152

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

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

    建议将发送数据后 转入接收回应信号状态。接收方收到数据后,给一个回应信号。
    发送方接收到回应信号,如果是成功,就发下一个包,如果是失败,就按照客户自定义的规则重发或者进行错误处理。
  • 我是在发送数据后加的延时,通过参考您发送的链接,我修改了while(!(UCA3IFG&UCTXIFG));为while(UCA3STATW & UCBUSY) ;后程序可正常运行,问题是单步调试是UCTXIFG为1可以跳出循环,全速运行时UCTXIFG一直为0所以我选择直接不考虑这一位了,目前发送数据是正确的
  • #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;
      }
    }
    
    需要的朋友们可以参考,不足之处也请提出
  • 谢谢您分享代码!
x 出现错误。请重试或与管理员联系。