工具/软件:TI-RTOS
你(们)好
我在使用 UART 驱动程序时遇到问题、在每次回调时、似乎我丢失了一个字节。
如果我看一下 c:\ti\pdk_am437X_1_0_8\packages/ti\drv\uart\src\v1\uart_v1.c、它会在 while 循环结束时读取一个字节、但如果大小为0、则该字节会被丢弃!
2.在 UART 驱动程序层(CSL)中,UARTCharGetNonBlocking (HwAttrs->baseAddr)在没有数据时返回-1。 这在 INT8_t 中返回、因此无法接收任何为0xFF????的二进制数据
不过,在 starterware 中,UARTCharGetNonBlocking()返回一个 int (32位)。 那么 UART 驱动程序使用哪个函数?
同样的问题也适用于 INT8_t UARTCharGet (uint32_t baseAddr)。
这是 CSL 中的一个错误、应予以修复。
/*
* ==== UART_v1_ReadData ===
* 从 UART 读取和处理数据。
*
静态内联 Int32_t UART_v1_ReadData (UART_Handle handle、int32_t size); //针对 Misra 警告*/
静态内联 Int32_t UART_v1_ReadData (UART_Handle handle、int32_t size)
{
int32_t readin;
UART_V1_Object *对象;
UART_HwAttrs const *hwAttrs;
对象=(UART_V1_Object*) handle ->对象;
hwAttrs =(UART_HwAttrs*) handle->hwAttrs;
readin =(int32_t) UARTCharGetNonBlocking (hwAttrs->baseAddr);
/*接收字符,直到为空或完成。 *
while ((size!= 0)&&(readin!=(int32_t)(-1)))
{
/*如果数据模式设置为文本替换返回,则使用换行符。 *
if (object->params.readDataMode = UART_DATA_TEXT)
{
if ((uint8_t) readin ==((uint8_t)('\r\n')))
{
/*回显字符(如果已启用)。 *
if (object->params.readEcho)
{
UARTCharPut (hwAttrs->baseAddr、((uint8_t)('\r\n'));
}
readin =(int32_t)'\n';
}
}
UART_drv_log2 ("UART:(0x%x)读取字符0x%x"、
hwAttrs->baseAddr、(uint8_t) readin);
*(uint8_t *) object->readBuf =(uint8_t) readin;
object->readBuf =(uint8_t *) object->readBuf + 1;
object->ReadCount++;
大小--;
/*回显字符(如果已启用)。 *
if (object->params.readEcho)
{
UARTCharPut (hwAttrs->baseAddr、(uint8_t) readin);
}
/*如果读返回模式为换行,则在接收到换行时完成。 *
if ((object->params.readReturnMode = UART_return_NEWLINE)&&
((uint8_t) readin ==((uint8_t)('\n')))
{
UART_drv_log1 ("UART:(0x%x)接收到换行字符、"、
hwAttrs->baseAddr);
大小= 0;
中断;
}
readin =(int32_t) UARTCharGetNonBlocking (hwAttrs->baseAddr); //这将从 RX FIFO 读取额外的字符-如果存在! 如果大小为0、必须跳过此操作!
}
返回值(大小);
}