TI中文支持网
TI专业的中文技术问题搜集分享网站

TI-RTOS中使用uart,读UART_read,或者UART_readPolling。readTimeout超时后,如何动作?

如题,TIRTOS,TM4C1294。UART_read或者UART_readPolling,是超时后返回值,还是需要设置句柄之类的。如果是时间的话,readTimeout单位是什么。是否有例子可以参考,自己试了很久没有摸清楚这个功能是怎么用的。

Susan Yang:

TI-RTOS的话readTimeout应该以RTOS时间来定义。如

10 ms的话应该是10 * 1000 / Clock_tickPeriod. 您可以通过Clock_getPeriod获取Clock_tickPeriod

默认情况下,SYS / BIOS Clock的Clock_tickPeriod为1ms,因此超时单位为毫秒。

关于驱动的话,您可以看一下

C:\ti\TivaWare_C_Series-2.1.4.178\driverlib

user6178481:

回复 Susan Yang:

Void tcpWorker(UArg arg0, UArg arg1){    int  clientfd = (int)arg0;    int  bytesRcvd;    int bytesSent;    int uart_byteRcvd;    char buffer[TCPPACKETSIZE];    int i;

    System_printf("tcpWorker: start clientfd = 0x%x\n", clientfd);

    System_flush();

    while ((bytesRcvd = recv(clientfd, buffer, TCPPACKETSIZE, 0)) > 0)    {        MODBUS_TX_Len = bytesRcvd – 6;        if(bytesRcvd == (buffer[5] + 6))        {            for(i = 0;i < MODBUS_TX_Len; i++)            {                MODBUS_TX_Buffer[i] = buffer[6 + i];            }            CRC16(MODBUS_TX_Buffer, MODBUS_TX_Len);            MODBUS_TX_Buffer[MODBUS_TX_Len] = Modbus_Data.calCRCLo;            MODBUS_TX_Buffer[MODBUS_TX_Len + 1] = Modbus_Data.calCRCHi;            UART_write(uart, MODBUS_TX_Buffer, MODBUS_TX_Len + 2);

            modbus_tcp_parse(buffer,bytesRcvd);

            MODBUS_RX_Len = TCP_TX_Len – 4;

           if((uart_byteRcvd = UART_readPolling(uart, MODBUS_RX_Buffer, MODBUS_RX_Len)) > 0)           {               CRC16(MODBUS_RX_Buffer,MODBUS_RX_Len – 2);               if ((MODBUS_RX_Buffer[MODBUS_RX_Len – 1] == Modbus_Data.calCRCHi)               && (MODBUS_RX_Buffer[MODBUS_RX_Len – 2] == Modbus_Data.calCRCLo))               {

                   for(i = 0;i < MODBUS_RX_Len – 2; i++)                   {                       TCP_Tx_Data[6+i] = MODBUS_RX_Buffer[i];                   }

                   bytesSent = send(clientfd, TCP_Tx_Data, TCP_TX_Len, 0);                   if (bytesSent < 0) {                       System_printf("Error: send failed.\n");                       System_flush();                       break;                   }               }           }           else           {               System_printf("Error: uart read fault.\n");               System_flush();               break;           }        }

    }

    close(clientfd);    client_priority –;}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void init_uart(void){

    UART_Params_init(&uartParams);    uartParams.readMode = UART_MODE_BLOCKING;    uartParams.writeDataMode = UART_DATA_BINARY;    uartParams.readDataMode = UART_DATA_BINARY;    uartParams.readReturnMode = UART_RETURN_FULL;    uartParams.readEcho = UART_ECHO_OFF;    uartParams.stopBits = UART_STOP_ONE;    uartParams.parityType = UART_PAR_NONE;    uartParams.readTimeout = 1000;    uartParams.baudRate = 115200;    uart = UART_open(Board_UART0, &uartParams);    if (uart == NULL) {        System_abort("Error opening the UART");}

这里用的是TM4C做TCP服务器,MODBUS TCP转MODBUS RTU的功能。

TM4C接收到以太网数据,串口换算成RTU发出,接收到串口返回数据后,以太网发出。程序可以正常运行,但串口插拔后,UART_readPolling会出现未接收到足够的数据长度,一直阻塞在UART_readPolling里,超过设定的超时值后,没有返回错误值,是哪里设置的有问题吗。还是UART_readPolling不支持超时。

Susan Yang:

回复 user6178481:

1 使用UART_read

当没有数据可以读取时,超过readTimeoutClock_tickPeriod 后,UART_read()将返回0。如果将readTimeout设置为零,则在收到请求的字节数之前,UART_read()不会返回。

2 关于UART_readPolling,您可以看一下

software-dl.ti.com/…/_u_a_r_t_8h.html

UART_readPolling will not return until size data was read to the UART.

您可以尝试修改UART_ReturnMode

software-dl.ti.com/…/_u_a_r_t_8h.html

user6178481:

回复 Susan Yang:

谢谢,我再试试

赞(0)
未经允许不得转载:TI中文支持网 » TI-RTOS中使用uart,读UART_read,或者UART_readPolling。readTimeout超时后,如何动作?
分享到: 更多 (0)