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.

[参考译文] LP-AM243:AM243x UART 轮询模式问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1513242/lp-am243-am243x-uart-polled-mode-issue

器件型号:LP-AM243

工具/软件:

您好:

我正在开发一个应用程序、并使用 LP-AM243 进行初始开发工作。  我在轮询模式下使用 UART、但设置超时= 0、计数= 94、这是从主机 PC 发送到 LP-AM243 的典型数据包大小。  从文档中可以看出、如果发生超时、事务结构的 count 变量将被修改为实际读取的字节数。  由于底层 FIFO 只有 64 字节、我不希望出现任何不必要的大超时来等待完整的数据包进来、因此我管理在我的代码顶层将数据包累积到满大小、此外、有时数据包大小会发生变化、并且数据包末尾始终有一个特殊的字符序列、以便应用程序知道数据包大小是什么。

我很确定这在我最初使用 SDK 版本 8 时对我有效、但当我使用最新版本 11 时、我没有得到相同的行为。

trans.count 值始终为=94 并且永远不会被修改,因为我调试到代码层中,我可以在这个函数 uart_readPolling () 中看到,当完整的 trans.count 字节数不被读取时 ,它会在 UART_LLD_Transaction_deInit () 调用期间将实际读回的字节数更改为 0。  但是,这一点也不重要,因为传输结构不会通过代码层传递。

在堆栈中的某个点、这个函数被称为 UART_LLD_READ()、并且大小和超时变量只是按值传递、因此无法再修改 trans.count。

当我在各层挖掘时、我发现通过创建下面绿色的代码行、我仍然可以访问实际读取的字节数、我只是想让团队意识到这个问题、也许大多数人没有收到可变大小的数据包、因此这在这些应用中不是问题。

transferOK = UART_read (com、&trans);
// count=trans.count;//这不起作用、除非读取了预期的全部字节数、如果只读取了部分字节数、则仍将其设置为完整值

count =((UART_Config *) com)->object->uartLld_handle ->ReadCount; //这使我能够访问在代码顶层读取的实际字节数、并解决了我的问题

//在堆栈中的这一点、传输结构不再传递、需要使用 hUART 句柄恢复 ReadCount
int32_t UART_LLD_READ (UARTLLD_Handle hUart、void * rxBuf、uint32_t size、uint32_t TIMEOUT、const UART_ExtendedParams * extendedParams)

静态 int32_t UART_readPolling (UARTLLD_Handle hUart、UART_Transaction * TRANS)

...

暴露

/*返回 uart_transfer_timeout、以便应用程序获得任何字节
*已传输。 将传输状态设置为“超时“、以便这样做
*应用程序可以处理超时。 */
retval = UART_TRANSFER_TIMEOUT;
TRANS->STATUS = UART_TRANSFER_STATUS_TIMEOUT;
Trans->count = hUart->ReadCount;
UART_LLD_Transaction_deInit (&hUart->readTrans);
}

返回 (RetVal);
}

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

    您好、Paul:

    此处的问题正是当超时发生时、trans.count 不会被修改、并保留为值 94。

    此外、您的用例更像、如果预期读取的字节数为 x、则:

    1. 如果读取的值为 x、则这是理想之选、并在 SDK 中得到良好处理。
    2. 如果读取的值< x、并且发生超时、则此情况不会在 SDK 中处理、且 trans.count 仍反映 x

    我对您描述的理解是否正确?

    此致、

    Vaibhav

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

    是的、正确。

    使用以下代码行可以获得发生超时时读取的字节数:
    count =((UART_Config *) com)->object->uartLld_handle ->ReadCount

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

    您好、Paul:

    感谢您的评论。

    很高兴知道我对您的问题陈述的总结是准确的。

    请允许我在某段时间内进一步讨论这个问题、以便达成一项解决办法。

    此致、

    Vaibhav

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

    您好、

    感谢您的等待。

    我看到、您放置的代码将有助于检索读取的实际字节数。 您能帮助我测试这一情况吗?您在 UART 完成超时时将哪个超时参数更改为故意失败/读取部分字节数。

    如果您可以帮助我设置该参数、并提供一定数量的字节以特定波特率和频率读取、那么我可以在我自己的设置中进行测试、并签核、以便将其包含在下一个 SDK 版本中。

    期待您的答复。

    我还假设可以对写入执行类似的操作、例如发生超时、然后实际写入了多少字节、这种情况就是如此。

    此致、

    Vaibhav