工具/软件:
您好:
我正在开发一个应用程序、并使用 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);
}