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.

[参考译文] TM4C1294NCPDT:UART 接收问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1054306/tm4c1294ncpdt-uart-recieve-issue

器件型号:TM4C1294NCPDT

您好!

我们 制造了 通过 MODBUS 进行通信的设备(完全相同),这些设备可通过 MCU 的输入引脚进行配置。 主器件将从以太网获取命令、并且正在工作。 主器件将向从器件发送相同的命令、而从器件应相应地工作。 但是当主控方通过 Modbus 向从属方发送第一条命令时,从属方接收到的命令非常完美,但即使主控方没有给出第二条命令,从属方也会再次输出 UARTCharget()函数,这会导致接收到垃圾字节,并且不会起到阻塞作用,为什么会发生这种情况?  

我已附加代码、请查看计时器 ISR 中的从器件部分。   Modbus_REC_BUF= UARTCharGet (UART6_BASE);函数执行两次并导致读取两个字节、即使主器件仅发送一个字节也是如此。

TI RTOS:- 2.16.0.14

编译器:- GNU -7.2.1 (Linaro)

此致

Khodidas Domadiya

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/*
* Author : - KHODIDAS DOMADIYA\
* Organization: - Optimzed Solutions Ltd.
* Department: -Product ENgineering services.
*
* Date:- 12-05-2021
*=> IP ADDRESS USED IS STATIC
*
*
*
* Indication OF leds - For ethernet , default LEDs used
*
*
*/
/*
* ======== tcpEcho.c ========
*/
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

     您好、Khodidas、

    您是否查看过具有示波器或 LSA 的 UART 线路、以查看是否发送了任何意外数据?

    查看您的代码、我不熟悉 MODBUS 协议、但由于问题是接收到第二个字节、我看到您执行 的是 MODBUS_REC_BUF= UARTCharGet (UART6_BASE);在778行上、然后输入一条 switch 语句、在这里您执行另一 个 MODBUS_REC_BUF= UARTGet (UART6_BASE);

    第二个调用是您希望代码阻止而不是接收垃圾数据的位置吗?

    如果 UART 线路上没有显示垃圾数据、那么您可能需要像使用以下类似函数刷新 FIFO:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //*****************************************************************************
    //
    // Flush the FIFO for the RX UART to ensure there is no garbage data present.
    //
    //*****************************************************************************
    static void FlushUARTRXFIFO(void)
    {
    while(UARTCharGetNonBlocking(UART0_BASE) != -1)
    {
    }
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此致、

    Ralph Jacobi

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

    尊敬的 Ralph:

    是的问题与 您提到的内容完全相同。 当 Boar 中断主站时、它将向从站发送"S"命令(请参阅 TCP 连接处理程序中的) 、该主站将启动其自己的计时器、并且它将   分别发送0x01和0x54。 为了解决这个问题、 我在单个 PC 中将主从都置于调试中。  在从器件侧 、从器件完美地接收"S"、然后执行情况检查和操作、同样、即使主器件不发送0x01和0x54、它也会接收 UART 并在缓冲区中提供0xFF。 因此、我们散热片的问题是、在接收到"S"单字节后、为什么  MODBUS_REC_BUF= UARTCharGet (UART6_BASE); 即使主器 件不传输、也像非阻塞一样进行输出。

    此致

    Khodidas Domadiya

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

    您好、Khodidas、

    我想知道的另一件事是、如何使用 UART6 中断处理程序和计时器中断处理程序、两者都涉及读取 UART6数据。 也许会有优先事项的问题吗? 也许接收到了字节、所以 while 循环被清除、但是 UART6中断停止读取、而是读取数据、然后阻断函数完成执行、数据消失、因此它获得0xFF。

    除此之外...

    [引用 userid="289369" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1054306/tm4c1294ncpdt-uart-recieve-issue/3901181 #3901181"]要解决问题, 我在单个 PC 中将主设备和从设备都置于调试中。

    正常运行期间是否不会出现此问题?

    [引用 userid="289369" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1054306/tm4c1294ncpdt-uart-recieve-issue/3901181 #3901181"]即使主控方未发送0x01和0x54、ART 也会接收并在缓冲区中提供0xFF。

    您是否看过 UART 线路以确认唯一显示的数据是"S"?

    FIFO 刷新可能甚至没有实际意义、因为如果 FIFO 中有垃圾数据、它将首先发出、然后发出"S"命令。

    您可以做的另一件事是、当您收到第一个计时器中断时查看 FIFO 寄存器、并查看 FIFO 中的内容以及设置了哪些标志等

    此致、

    Ralph Jacobi

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

    您好、@找到了代码的确切问题、T Ü V S Ü D 菜单部分(更正了下面的一个)

    Modbus_transmit;
    Modbus_REC_BUF=0x01;
    UARTSend (((uint8_t *)&MODBUS_REC_BUF、1);//向从属方发送命令

    Modbus_REC_BUF=0x54;
    UARTSend (((uint8_t *)&MODBUS_REC_BUF、1);
    SysCtlDelay (4000);

    while (ui32 <MODBUS_DATA_SIZE)

    Modbus_receve;
    SLAVE_1_BUFFER[ui32count]= UARTCharGet (UART6_BASE);//从从器件接收数据
    ui32count++;


    SysCtlDelay (4000);

    如果您看一下我之前的共享代码-转到计时器处理程序 并在主控条件下,当启用主控传输时(这将启用 MAX485 的传输模式),然后我们将在 阻塞模式下通过 UART 传输0x01和0x54, 但是、在使用示波器查找原因后、MCU 不会在发送中获取块并执行 UART_SEND 行、并且10会转至之前为 MODBU_RECIVE 的下一个命令、即使 MCU 尚未完成传输、也会导致 MAX485处于接收模式。  

    因为、我们解决了4000克时钟周期的延迟问题、并得到了解决。  

    我的问题是 、为什么在阻塞模式下 UART 传输不会实际阻塞 CPU、它会将数据放入 UART 的硬件缓冲区、并立即执行下一个操作。 此外、在 SDK 中没有传输完整指示功能、如果有、这将对我们有所帮助、尤其是在时间关键型应用中。

    此致  

    Khodidas Domadiya

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

    您好、Khodidas、

    [引用 userid="289369" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1054306/tm4c1294ncpdt-uart-recieve-issue/3903195 #3903195"]因此我的问题是、 为什么在阻塞模式下 UART 传输不会实际阻塞 CPU、它会将数据放入 UART 的硬件缓冲区并立即执行下一步操作。

    "阻断"功能 被设计成 在 FIFO 中没有空间时工作。 如果 FIFO 中有空间、那么它将加载字节并继续执行代码。 在应用程序中、您可以使用轮询来等待、直到发送字节以执行如下操作:

    Fullscreen
    1
    2
    3
    while(HWREG(ui32Base + UART_O_FR) & UART_FR_TXFF)
    {
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    [引用 userid="289369" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1054306/tm4c1294ncpdt-uart-recieve-issue/3903195 #3903195"]此外,SDK 中没有传输完整指示函数,如果是,它将对我们有所帮助,特别是在时间关键型应用中。

    我可以看到、您没有使用 FIFO、这意味着您可以配置 UART 中断来指示 EOT。 任何"传输完成"功能都需要从 ISR 驱动。 仅供参考、但如果使用 FIFO、则仅当阈值通过且没有可用的'FIFO 空'中断时、FIFO 级别水印的中断才会触发。

    此致、

    Ralph Jacobi

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

    尊敬的 Ralph:

    很抱歉、由于我们在同一个项目中遇到另一个问题、并且我们正在对其进行调试、因此我们迟到了响应。 根据、您的建议将实施建议的代码行。 作为不使用 FIFO 的一部分、我们需要同步数据以及由于缓冲区中的数据模式而产生的其他信号、这是系统的另一端固定的。

    在我获得结果时、将在这里更新相同的内容。
    此致
    霍迪达斯