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