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.

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

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

  • 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

  • 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不支持超时。

  • 1 使用UART_read

    当没有数据可以读取时,超过readTimeout Clock_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
  • 谢谢,我再试试