485通信收不到数据,求支招

2019-08-01 14:06发布

代码如下:

#include <msp430f149.h>
#include "AD_convert.h"

#define DRE_out     P3DIR |= BIT3     //连接485芯片的DE,RE端口的IO设置为输出状态
#define DE          P3OUT |= BIT3     //设置485芯片处于发送状态
#define RE          P3OUT &= ~BIT3    //设置485芯片处于接收状态

void Init_UART1(void);

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  DRE_out;

  Init_UART1();
  _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt
/*    while (1)
    {
        TXBUF1 = 0xAA;
        while(!(IFG2 & UTXIFG1));         //等待发送结束
        IFG2 &= ~UTXIFG1;
    }
  */
}


/*******************************************
函数名称:Init_UART0
功    能:设置MCU的UART0对应的寄存器
参    数:无
返回值  :无
********************************************/
void Init_UART0(void)
{
  P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
  UBR00 = 0x03;                             // 32k/9600 - 3.41
  UBR10 = 0x00;                             //
  UMCTL0 = 0x4A;                            // Modulation
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  IE1 |= URXIE0;                            // Enable USART0 RX interrupt
}


/*******************************************
函数名称:Init_UART1
功    能:设置MCU的UART1对应的寄存器
参    数:无
返回值  :无
********************************************/
void Init_UART1(void)
{
    P3SEL |= 0xC0;                            //将P3.6,P3.7选做UART1的通信端口
    ME2 |= UTXE1 + URXE1;                     //使能USART1的TXD和RXD
    UCTL1 |= CHAR;                            //选择8-bit字符
    UTCTL1 |= SSEL0;                          //驱动时钟选择ACLK
    UBR01 = 0x03;                             // 32k/9600 - 3.41
    UBR11 = 0x00;                             //
    UMCTL1 = 0x4A;                            // Modulation
    UCTL1 &= ~SWRST;                          //初始化UART状态机
    IE1 |= URXIE1;                            // Enable USART0 RX interrupt
}

// UART0 RX ISR will for exit from LPM3 in Mainloop
#pragma vector=USART0RX_VECTOR
__interrupt void usart0_rx (void)
{
  _BIC_SR_IRQ(LPM3_bits);                   // Clear LPM3 bits from 0(SR)
}

#pragma vector=USART1RX_VECTOR
__interrupt void usart1_rx (void)
{
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
  DE;                                       //发送
  TXBUF1 = RXBUF1;
  while (!(IFG2 & UTXIFG1));                //等待发送结束
  RE;                                       //接收
}

测试时MCU向PC发数据,PC能收到,但是PC向MCU发数据,好像没反应。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
jjeemm77
1楼-- · 2019-08-03 11:19
 精彩回答 2  元偷偷看……
m564522634
2楼-- · 2019-08-03 16:15
方向搞对没有,485是有方向的。一般232能用485也可以用了。你发送完有没有调整方向
小小小小白
3楼-- · 2019-08-03 16:46
m564522634 发表于 2014-11-12 17:35
方向搞对没有,485是有方向的。一般232能用485也可以用了。你发送完有没有调整方向 ...

调整了方向。现在的情况是MCU向PC发送数据时,最后一个字符会丢失。所以我在程序里多发一个0xff,这样做可以吗?
m564522634
4楼-- · 2019-08-03 17:08
小小小小白 发表于 2014-11-12 17:53
调整了方向。现在的情况是MCU向PC发送数据时,最后一个字符会丢失。所以我在程序里多发一个0xff,这样做 ...

这算什么解决办法了,你发送的时候在调整方向后加个延时了在发送数据。这样应该没问题了。
firstblood
5楼-- · 2019-08-03 17:34
m564522634 发表于 2014-11-12 17:55
这算什么解决办法了,你发送的时候在调整方向后加个延时了在发送数据。这样应该没问题了。 ...

就是的,需要注意这个延时的。
m564522634
6楼-- · 2019-08-03 20:40
 精彩回答 2  元偷偷看……

一周热门 更多>