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.

[参考译文] CCS/EK-TM4C123GXL:UART1 (RS 485)发送数据但未接收!!!!

Guru**** 2524550 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/872157/ccs-ek-tm4c123gxl-uart1-rs-485-transmitting-data-but-not-receiving

器件型号:EK-TM4C123GXL

工具/软件:Code Composer Studio

您好!

 我正在使用通信协议,使用 UART1 (RS 485)与外部设备通信。 我已检查回送、TX 和 RX 配置是否成功完成,因为它是回送字符。 当我向外部器件 UART1成功发送数据时、外部器件 HMI 显示从 UART1 (TM4C123GXL)接收到的数据。  如果我通过 HMI 发送数据,则无法在 TM4C123gxl 端获取数据。 过去两天我几乎找不到这个错误、如果有任何解决方案、对我来说都很有帮助。

 这里是我的收发代码:

//

#include
#include
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
unsigned char BUF1[100]={"S"、'N'、'G'};                      //发送数据
unsigned char BUF2[100];
unsigned int i;



#define RS485base GPIO_Porta_base
#define MAX485_DE GPIO_PIN_6
#define MAX485_RE_NEG GPIO_PIN_7

//*********
//
  #ifdef 调试
  无效
  _error__(char * pcFilename、uint32_t ui32Line)
  {
  }
  #endif

  //********
  void preTransmission ();
  void postTransmission ();

  //
  空 UART0_PUT_CHAR (常量 uint8_t pui8Buffer)
  {

      预传送();

          //将下一个字符写入 UART。
          //
      UARTCharPut (UART0_BASE、pui8Buffer);
      postTransmission ();

  }

 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

                                                                                                                                   //UART 1发送功能

  void uart1_put 字符(uint8_t BUF3)
  {
      预传送();

      UARTCharPut (UART1_BASE、BUF3);
      postTransmission ();

  }


///////////////////////////////////////////////////////////////                   //UART 1接收 功能
  void uart1_get_char ()
  {
      postTransmission ();

   unsigned char j=0;

  while (ROM_UARTCharsAvail (UART1_base))


  {
     BUF2[j]=UARTCharGet (UART1_BASE);


     UART0_PUT_CHAR (BUF2[j]);
     SysCtlDelay (2000);
  J++;
  预传送();
  }
  int k;
for (k=0;<j;k++) 0.0.

   BUF2[k]=0;

  }

  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

  空预传输()
  {
      GPIOPinWrite (GPIO_Porta_base、MAX485_RE_NEG、 MAX485_RE_NEG);
      GPIOPinWrite (GPIO_Porta_base、MAX485_DE、MAX485_DE);


  }

  void postTransmission ()
  {
      GPIOPinWrite (GPIO_Porta_base、MAX485_RE_NEG、0x00);
      GPIOPinWrite (GPIO_Porta_base、MAX485_DE、0x00);

  }


   空 RS485enable()
   {

       SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
              GPIOPinTypeGPIOOutput (RS485base、MAX485_DE|MAX485_RE_NEG);


   }




  //
  int main (空)
  {
     //unsigned char pui8Buffer;


      //为中断处理程序启用怠惰堆栈。  这允许使用浮点
      //在中断处理程序中使用的指令,但代价是
      //额外的堆栈用法。
      //
      ROM_FPUEnable();
      ROM_FPULazyStackingEnable();

      //
      //将时钟设置为直接从晶体运行。
      //
      ROM_SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                         SYSCTL_XTAL_16MHz);

      //
      //启用用于板载 LED 的 GPIO 端口。
      //
      ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOF);

      //
      //为 LED 启用 GPIO 引脚(PF2)。
      //
      ROM_GPIOPinTypeGPIOOutput (GPIO_PORTF_BASE、GPIO_PIN_2);

      //
      //启用此示例使用的外设。
      //
      ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
      ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);


      ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART1);
      ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

      //
      //启用处理器中断。
      //
    // rom_IntMasterEnable();

      //
      //将 GPIO A0和 A1设置为 UART 引脚。
      //
      GPIOPinConfigure (GPIO_PA0_U0RX);
      GPIOPinConfigure (GPIO_PA1_U0TX);


      GPIOPinConfigure (GPIO_PB0_U1RX);
      GPIOPinConfigure (GPIO_PB1_U1TX);

      ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
      ROM_GPIOPinTypeUART (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);



      //
      //将 UART 配置为115、200、8-N-1操作。
      //
      ROM_UARTConfigSetExpClk (UART0_BASE、ROM_SysCtlClockGet ()、19200、
                              (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                               UART_CONFIG_PAR_NONE));

      ROM_UARTConfigSetExpClk (UART1_base、ROM_SysCtlClockGet ()、19200、
                                 (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
                                  UART_CONFIG_PAR_NONE));
      RS485enable();

      //循环通过 UART 永久回显数据。
      //

      GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_6、0x00);
     GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_7、0x00);

      while (1)
      {
          uint32_t 值= 0;
          uint8_t i=0;

          for (i=0;i<6;i++)
          {
             uart1_Put_char (BUF1[i]);                            //传输数据

          }


          uart1_get_char ();                                          //接收数据  

      }
  }


串行监视器输出窗口

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感受您的痛苦-但一些"基本故障排除"可帮助您和远程帮助人员。

    如果您报告的内容证明正确、则存在"常见嫌疑人"-应首先调查这些问题:

    • 您的 RS485线路驱动器仅在信号正确且及时到达"RE"引脚时才启用其"CU 接收侧"。    在 RS485信号的"开始位"到达之前、您是否已经确定了 RE 引脚的范围以及传入的 RS485数据、并确认已正确驱动 RE 引脚?    (然后在数据字节的剩余部分保持稳定?)
    • 将此类 RS485线路驱动器作为其正常工作条件订购到"接收模式"是正常/习惯做法。   仅在需要时和根据需要订购线路驱动器进入"传输模式"-通常尽可能短。   同样、您的示波器探测可以有效地监控和确认这一点。
    • 在 UART_1的 RX 引脚上使用外部"上拉"电阻器"不会受伤"。   (*)  (有时、但不是总是)线路驱动器在这方面证明"有罪"、尤其是在切换其"引脚"时)
    • 在测试/故障排除期间、不建议使用(任何)"方向错误"(即缓冲器)。   KISS 指示"单一和直接"-因此是单字节传输/接收-消除(其他)潜在的故障原因!
    • 即使 TX 侧(看起来)正常工作、也要确认 HMI 和 MCU 板之间存在"错误且正确"的接地连接。

    如果您没有示波器-如果可能、通过降低波特率(到~300 -~600波特)-您可以启用"监测 LED"以指示(UART_1 RX 和 RS485的差分信号对上都存在串行信号。   (范围证明非常有用-尤其是在诊断串行数据时...)

    (*)员工认为这是“最有可能”解决您的问题...