如题,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:
谢谢,我再试试