打印

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

[复制链接]
2003|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小小小小白|  楼主 | 2014-11-11 19:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码如下:

#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发数据,好像没反应。


相关帖子

沙发
dirtwillfly| | 2014-11-11 20:02 | 只看该作者
PC向MCU发数据的时候,相应io有没有波形?

使用特权

评论回复
板凳
小小小小白|  楼主 | 2014-11-11 20:06 | 只看该作者
dirtwillfly 发表于 2014-11-11 20:02
PC向MCU发数据的时候,相应io有没有波形?

额,用示波器看看

使用特权

评论回复
地板
dirtwillfly| | 2014-11-11 20:13 | 只看该作者
小小小小白 发表于 2014-11-11 20:06
额,用示波器看看

或者把mcu的rx和tx两个io连接到一起,看自己发送出去的能不能收到

使用特权

评论回复
5
小小小小白|  楼主 | 2014-11-11 20:16 | 只看该作者
dirtwillfly 发表于 2014-11-11 20:13
或者把mcu的rx和tx两个io连接到一起,看自己发送出去的能不能收到

示波器有波形

使用特权

评论回复
6
小小小小白|  楼主 | 2014-11-11 20:17 | 只看该作者
dirtwillfly 发表于 2014-11-11 20:13
或者把mcu的rx和tx两个io连接到一起,看自己发送出去的能不能收到

您看看是不是软件代码的问题

使用特权

评论回复
7
dirtwillfly| | 2014-11-12 08:19 | 只看该作者
小小小小白 发表于 2014-11-11 20:17
您看看是不是软件代码的问题

:funk:你两个串口哪个是485通讯?都是?

使用特权

评论回复
8
dirtwillfly| | 2014-11-12 08:26 | 只看该作者
在void Init_UART1(void)初始化函数中:
    IE1 |= URXIE1;                            // Enable USART0 RX interrupt

这句代码是不是有问题?会不会是IE2 |= URXIE1;?

使用特权

评论回复
9
小小小小白|  楼主 | 2014-11-12 09:41 | 只看该作者
dirtwillfly 发表于 2014-11-12 08:26
在void Init_UART1(void)初始化函数中:
    IE1 |= URXIE1;                            // Enable USART0 ...

好的,我看看

使用特权

评论回复
10
小小小小白|  楼主 | 2014-11-12 11:16 | 只看该作者
dirtwillfly 发表于 2014-11-12 08:26
在void Init_UART1(void)初始化函数中:
    IE1 |= URXIE1;                            // Enable USART0 ...

现在能进入中断了。但是同样的代码用232能实现通信,485却不行。您看一下中断服务函数的代码。
#pragma vector=USART1RX_VECTOR
__interrupt void usart1_rx (void)
{
  DE;                                       //发送
  TXBUF1 = RXBUF1;                          // RXBUF1 to TXBUF1
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
  RE;                                       //接受
}

使用特权

评论回复
11
dirtwillfly| | 2014-11-12 11:28 | 只看该作者
小小小小白 发表于 2014-11-12 11:16
现在能进入中断了。但是同样的代码用232能实现通信,485却不行。您看一下中断服务函数的代码。
#pragma v ...

只看代码看不出什么的。
:funk:

能进入中断了,就可以慢慢调试。看数据传递是否正确,还有寄存器变化

使用特权

评论回复
12
longquanboy| | 2014-11-12 15:15 | 只看该作者
没有用过这个芯片,只是程序中while (!(IFG2 & UTXIFG1)),是不是状态位错了哦,我看你收与发都是判断的同一个状态位,只是怀疑

使用特权

评论回复
13
小小小小白|  楼主 | 2014-11-12 15:36 | 只看该作者
现在问题基本解决了。但是又遇到一个奇怪的问题。一个数据要发两次才能成功,发一次的话PC就收不到,请问这是什么原因啊?

使用特权

评论回复
14
jjeemm77| | 2014-11-12 17:15 | 只看该作者
哈哈!…硬件问题吧?…应有应答信号!收、发时使能端应有逻辑电平变化…查查看!…

使用特权

评论回复
15
m564522634| | 2014-11-12 17:35 | 只看该作者
方向搞对没有,485是有方向的。一般232能用485也可以用了。你发送完有没有调整方向

使用特权

评论回复
16
小小小小白|  楼主 | 2014-11-12 17:53 | 只看该作者
m564522634 发表于 2014-11-12 17:35
方向搞对没有,485是有方向的。一般232能用485也可以用了。你发送完有没有调整方向 ...

调整了方向。现在的情况是MCU向PC发送数据时,最后一个字符会丢失。所以我在程序里多发一个0xff,这样做可以吗?

使用特权

评论回复
17
m564522634| | 2014-11-12 17:55 | 只看该作者
小小小小白 发表于 2014-11-12 17:53
调整了方向。现在的情况是MCU向PC发送数据时,最后一个字符会丢失。所以我在程序里多发一个0xff,这样做 ...

这算什么解决办法了,你发送的时候在调整方向后加个延时了在发送数据。这样应该没问题了。

使用特权

评论回复
18
firstblood| | 2014-11-16 21:22 | 只看该作者
m564522634 发表于 2014-11-12 17:55
这算什么解决办法了,你发送的时候在调整方向后加个延时了在发送数据。这样应该没问题了。 ...

就是的,需要注意这个延时的。

使用特权

评论回复
19
m564522634| | 2014-11-16 23:33 | 只看该作者
firstblood 发表于 2014-11-16 21:22
就是的,需要注意这个延时的。

那还不给个谢谢 ;P

使用特权

评论回复
20
vivilzb1985| | 2014-11-23 20:45 | 只看该作者
先用示波器的看下的呗。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

515

帖子

4

粉丝