[求助] 485 接收 发送

zzbaizhi   2012-3-12 11:36 楼主

做485接收发送的实验,单独接收和单独发送时没问题,想让PC给MCU发送数据然后MCU再返回,主程序是UCAxTXBUF=UCAxRXBUF,调试后,查看UCAxTXBUF和UCAxRXBUF,都有数据,但串口调试助手上却显示PC接收的为FF,不知道是怎么回事,请高手指点

回复评论 (13)

将数据放到SendBuffer[],然后使能发送,完后,打开485接收
点赞  2012-3-12 13:01

360截图20120312143647453.jpg

管脚及串口设置都没问题,如图串口调试助手发送26(以16进制形式),UCA1TXBUF和UCA1RXBUF内都是0x26,但串口调试助手却显示FF(16进制)

PS:P5.5为485控制位,置高为输出,置低为输入,在前面的管脚设置中已经先将其设置为低(输入)

点赞  2012-3-12 14:43

回复 板凳 zzbaizhi 的帖子

while (!(UCA1IFG&UCTXIFG));
   UCA1TXBUF=0X26;
P5OUT |= BIT5;
DELAY(2);
while (!(UCA1IFG&UCTXIFG));
UCA1RXBUF=UCA1TXBUF;
P5OUT &= ~BIT5;
点赞  2012-3-12 20:57

回复 4楼 yong_zhang 的帖子

UCA1RXBUF=UCA1TXBUF;
这句什么意思呀?
点赞  2012-3-13 08:27

回复 板凳 zzbaizhi 的帖子

485发送结束时要控制485芯片的使能脚继续为发送状态,要有延时处理,等485芯片发完数据
点赞  2012-3-13 10:18
引用: 原帖由 zzbaizhi 于 2012-3-13 08:27 发表
UCA1RXBUF=UCA1TXBUF;
这句什么意思呀?

这儿写错了。
应该是UCA1TXBUF=UCA1RXBUF;
点赞  2012-3-13 11:03

回复 6楼 kingheimer 的帖子

万分感谢 ,终于可以了
点赞  2012-3-13 14:32
这个是对于半双工工作模式吧?
我用全双工时就没有延时
点赞  2012-5-10 19:32
UCA1TXBUF=0X26;
是什么意思??
点赞  2012-6-17 20:19
检查发送或者接收是否完成的时候,检查busy位,而不是标志位。
比如发送的时候只要将数据移到发送缓冲区,ifg就会置位,实际情况时还未发送完成
点赞  2012-6-18 13:47
//接收中断,发送用查询的方式

#include "msp430f4371.h"
//#define DRE_out     P5DIR |= BIT7    //连接485芯片的DE,RE端口的IO设置为输出状态
//#define DE          P5OUT |= BIT7     //设置485芯片处于发送状态 ,输出1
//#define RE          P5OUT &= ~BIT7    //设置485芯片处于接收状态,输出0

unsigned char  RcvFlag=0;
unsigned char  RcvBuf=0;

unsigned char RecBuf[255]; //接收数据缓存
unsigned char *SDat;       //指向要发送的数据
unsigned char Rindex;      //接收数据计数
unsigned char Tindex;      //发送数据计数
unsigned char SendLen;     //发送数据长度

int i=0;

void Init_UART0(void)
{
  FLL_CTL0 |= XCAP18PF;                     // Configure load caps
  P2SEL |= 0x30;                            // P2.4,5 = USART0 TXD/RXD
  P5SEL &=~ BIT7;
  P5DIR |= BIT7;
  //P5OUT |=BIT7;
  
// delay();
  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
  UCTL0 |= CHAR;                            // 8-bit character
  UTCTL0 |= SSEL1;                          // UCLK = SMCLK
  UBR00 = 0x6D;                             // 1MHz 9600
  UBR10 = 0x00;                             // 1MHz 9600
  UMCTL0 = 0x03;                            // modulation
  UCTL0 &= ~SWRST;                          // Initialize USART state machine
  IE1 |= URXIE0;                            // Enable USART0 RX interrupt
  P2DIR |= 0x10;  

  P5OUT &=~BIT7;                           //设置485芯片处于接收状态
}

void main()
{
WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗

P5DIR |=BIT7;                         //设置
P5OUT |=BIT7;

Init_UART0();

_EINT();                                 //打开全局中断

      
while (1)                               //发送采用查询的方式
  {
     P5OUT |= BIT7;                      //设置485芯片处于发送状态
     if(RcvFlag)
     {
      for (i=0;i       {
       TXBUF0 = RecBuf;
      
       while(!(IFG1 & UTXIFG0));               //等待发送结束
       {
         IFG1 &= ~UTXIFG0;
         RcvFlag=0;
       }
      }
      
      }
       P5OUT &= ~BIT7;                        //设置485芯片处于接收状态
   }  
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)
{
    RecBuf[Rindex++] = RXBUF0;
    if(RecBuf[Rindex-1]==0xfe)    //判断是否接收完毕
    {
        SendLen = Rindex;
        Rindex=0;
        RcvFlag=1;
    }
}



我的这段程序中,串口助手只出现FE,这是为什么呢?
点赞  2012-6-18 15:17
其中片选端是P5.7
点赞  2012-6-18 15:19
学习了,谢谢哦!
给生活一个梦想,给奋斗一个方向!---淘宝搜索逸嵌电子工作室
点赞  2014-4-8 21:30
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复