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.

[参考译文] RTOS/TM4C1294NCPDT:UART 读取超时问题

Guru**** 2612365 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/579938/rtos-tm4c1294ncpdt-uart-read-timeout-problem

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

TI-RTOS:v2.01.00.03

CCS:v6.0.1.0040

您好!

我正在研究不知道数据长度的项目。 我将 UART 参数初始化如下。

void com0TaskFxn (UARg arg0、UARg arg1)
{
char rxBuffer[256]、txBuffer[256];
int ret、i;

UART_Handle 句柄= NULL;
UART_Params Params;

UART_Params_init (&params);
params.baudrate = usr_s.uart[struct_index_COM0].baud; //波特率由用户配置。

params.dataLength = UART_LEN_8;
params.parityType = UART_PAR_NONE;
params.stopbits = UART_STOP_one;

params.writeDataMode = UART_DATA_binary;
params.readDataMode = UART_DATA_binary;
Params.writeMode = UART_MODE_CALLBACK;
params.writeCallback =(UART_Callback)(&com0WriteCompleteCallbackFunction);
params.readReturnMode = UART_RETURN;
params.readEcho = UART_ECHO_OFF;

params.readTimeout =?

句柄= UART_open (struct_index_COM0、&params);
if (!handle){
system_printf ("COM 0 UART 未打开");
}
否则
{
System_printf ("COM 0 UART_initialized");
}

//清除存储缓冲区*/
rxBuffer[0]= 0;

while (1)
{
if (!GPIO_read (factory_reset_and_UART_config_mode_switch))
){uART0_rxBuffer
= 0;while (1)}UART_rgote_handle



= 0;UART_UART0 = UART_RATE_UART0;UART_UART0 = UART0 (UART_RATE_UART_RATE_

if (ret > 0)
{
//将空指针添加到缓冲区以进行字符串发送*/
rxBuffer[ret + 1]= 0;


if (sys_state.tcpServer1_is_active == true)
{
Mailbox_post (mboxCom0Rx4S1、rxBuffer、tcp_Server_task_main_loop_delay_in_ms + 5);}mboxCom0Rx4S1、rxBuffer (txt_txt_task_main_ms + 5);mboxCmp2)




BIOS_NO_WAIT)
){
ret = UART_WRITE (handle、&(txBuffer[1])、(int) txBuffer[0]);
}

}

根据 TI 用户手册:

当接收 FIFO 不为空时、接收超时中断有效;当 HSE 位清零时、接收 FIFO 不会在32位周期内接收到更多数据;当 HSE 位置位时、接收超时中断会在64位周期内产生。
当 FIFO 通过读取所有数据(或通过读取保存寄存器)变为空或向 UARTICR 寄存器的相应位写入1时、接收超时中断被清除。

我的问题是

1> 读取超时是以"毫秒"或"秒"为单位的超时。

2> 读取超时为1字节或整个250字节。

3> 由于我的代码波特率不固定、在这种情况下、应该读取超时的值是多少?

4>如果没有要读取的数据、在 UART_READ()返回0的时间之后。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1) 1) readTimeout 参数的单位是 SYS/BIOS 时钟节拍。 默认情况下、SYS/BIOS 时钟节拍周期为1ms、因此超时以毫秒为单位。

    2)读取超时与 UART_READ()命令中请求的字节数无关。 无论您请求1字节还是250字节,如果尚未收到请求的字节数,UART_READ()都将在 readTimeout 时钟节拍后超时。

    3) 3)如果您的应用需要 readTimeout、则必须根据您要读取的最大字节数和最慢波特率计算适合您需要的超时值。 否则,将 readTimeout 设置为零,以便 UART_READ()在收到所有请求的字符之前无限期地阻止。

    4) UART_READ()将在读取超时时时时钟节拍数通过后返回0。 如果 readTimeout 设置为零,则在收到请求的字节数之前 UART_READ()不会返回。

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

    尊敬的 Alan:

    感谢您的回复。

    在我的代码中、我不知道我必须读取多少字节、因此我必须使用 readTimeout。 我在循环中同时使用 UART_READ()和 UART_WRITE 我无法将 readTimeout 设置为0并在阻塞模式下设置 UART_READ()。但问题是我不知道何时触发 readTimeout 时钟?

    假设在这种情况下,我在 UART_Read()中给出了250个字节,并且我只得到240个字节。 因此,读取超时时时时钟在240字节后触发,或者当我调用 UART_read()时触发?

    根据 TI 用户手册:

    接收 FIFO 不为空时、接收超时中断有效;当 HSE 位清零时、接收 FIFO 不会在32位周期内接收到更多数据;当 HSE 位置位时、接收超时中断会在64位周期内产生。

    当 FIFO 通过读取所有数据(或通过读取保存寄存器)变为空或向 UARTICR 寄存器的相应位写入1时、接收超时中断被清除。

    因此、根据我的理解、readTimeout 时钟仅在我收到240个字节后才启动。 因此、我只需计算读取1字节所需的时间。 对于9600波特率、它大约需要 1ms 。 因此、我必须进行设置

      params.readTimeout = 1

    对吗?

     

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


    UART 驱动程序使用的'readTimeout'参数与 UART 外设提供的接收超时中断(您参考的 TI 用户手册中描述的中断)无关。

    当调用 UART_read()时,readTimeout 用于配置和启动内部一次性 SYS/BIOS 时钟对象。 不会在每个接收到的字符上重新触发单次触发。 UART_READ()将在接收到请求的字节数时或在单次触发超时后返回,以最严重者为准。

    如果将 readTimeout 设置为1,则在调用 UART_read()时启动1毫秒的一次性时钟对象。 如果在1ms 后未收到请求的字符数、则 UART_READ()仍将返回。

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

    尊敬的 Alan:

    根据您上次的回复:

    UART 驱动程序使用的'readTimeout'参数 UART 外设提供的接收超时中断(您参考的 TI 用户手册中描述的中断)无关。

    但根据 TI 用户手册:

    接收 FIFO 不为空时、接收超时中断有效;当 HSE 位清零时、接收 FIFO 不会在32位周期内接收到更多数据;当 HSE 位置位时、接收超时中断会在64位周期内产生。


    那么、它的含义是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    UART 驱动程序未配置 Tiva UART 以生成您正在引用的超时中断。 如前所述、'readTimeout'参数在内部用于设置在单次触发模式下配置的 SYS/BIOS 时钟对象的超时持续时间。 "readTimeout"单元位于时钟模块的"tickPeriod"中、默认为1ms。