Other Parts Discussed in Thread: SYSBIOS
Tool/software: TI-RTOS
Hi,
We have a EK-TM4C123GXL evaluation board to which 3 BMD modules are connected via UART1,UART4 and UART5 lines. TIVA board is supposed to read data from these 3 UART modules and push via USB. We are using USB serial device as base The three devices work individually without issues. While combining multiple UART reads in a single task, data corruption as well as loss is happening.
Can't multiple UART instances be accessed simultaneously? I have attached the code snippet where reading is happening. It would be great if someone can point out what I am doing wrong and confirm if this is feasible or not?
#include <string.h>
#include <stdbool.h>
/* XDCtools Header files */
#include <xdc/std.h>
#include <xdc/runtime/Error.h>
#include <xdc/runtime/System.h>
/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Task.h>
/* TI-RTOS Header files */
#include <ti/drivers/GPIO.h>
/* Example/Board Header files */
#include "Board.h"
/* USB Reference Module Header file */
#include "USBCDCD.h"
#include <ti/drivers/UART.h>
#define TASKSTACKSIZE 2768
unsigned char text[40] = {0x0}; //"TI-RTOS controls USB.\r\n";
Task_Struct task0Struct, task1Struct;
Char task0Stack[TASKSTACKSIZE], task1Stack[TASKSTACKSIZE];
unsigned char data_uart1[20]={0};
unsigned char data_uart2[20]={0};
unsigned char data_uart3[20]={0};
uint16_t uart1_length=0;
uint16_t uart2_length=0;
uint16_t uart3_length=0;
UART_Handle uart, uart1, uart2, uart3, uart4, uart5;
UART_Params uartParams, uart1Params, uart2Params, uart3Params, uartParams4, uartParams5;
/
/*
* ======== receiveFxn ========
* Task to receive serial data.
*
* This task will receive data when data is available and block while the
* device is not connected to the USB host or if no data was received.
*/
Void receiveFxn(UArg arg0, UArg arg1)
{
UART_Params_init(&uart1Params);
uart1Params.writeDataMode = UART_DATA_BINARY;
uart1Params.readDataMode = UART_DATA_BINARY;
uart1Params.readReturnMode = UART_RETURN_FULL;
uart1Params.readEcho = UART_ECHO_OFF;
uart1Params.baudRate = 115200;
uart1 = UART_open(Board_UART1, &uart1Params);
if (uart1 == NULL) {
System_printf("NOT opened");
System_flush();
}
UART_Params_init(&uart3Params);
uart3Params.writeDataMode = UART_DATA_BINARY;
uart3Params.readDataMode = UART_DATA_BINARY;
uart3Params.readReturnMode = UART_RETURN_FULL;
uart3Params.readEcho = UART_ECHO_OFF;
uart3Params.baudRate = 115200;
uart3 = UART_open(Board_UART5, &uart3Params);
if (uart3 == NULL) {
System_printf("NOT opened");
System_flush();
}
UART_Params_init(&uart2Params);
uart2Params.writeDataMode = UART_DATA_BINARY;
uart2Params.readDataMode = UART_DATA_BINARY;
uart2Params.readReturnMode = UART_RETURN_FULL;
uart2Params.readEcho = UART_ECHO_OFF;
uart2Params.baudRate = 115200;
uart2 = UART_open(Board_UART4, &uart2Params);
if (uart2 == NULL) {
System_printf("NOT opened");
System_flush();
}
while (true) {
memset(data_uart1,0x00,sizeof(data_uart1));
memset(data_uart3,0x00,sizeof(data_uart3));
memset(data_uart2,0x00,sizeof(data_uart2));
memset(text,0x00,sizeof(text));
uart1_length =UART_read(uart1,data_uart1,sizeof(data_uart1));
uart3_length =UART_read(uart3,data_uart3,sizeof(data_uart3));
uart2_length =UART_read(uart2,data_uart2,sizeof(data_uart2));
memcpy(text,data_uart1,sizeof(data_uart1));
memcpy(text+sizeof(data_uart1),data_uart2,sizeof(data_uart2));
memcpy(text+sizeof(data_uart1)+sizeof(data_uart2),data_uart3,sizeof(data_uart3));
USBCDCD_waitForConnect(BIOS_WAIT_FOREVER);
USBCDCD_sendData(text, sizeof(text), BIOS_WAIT_FOREVER);
}
}
/*
* ======== main ========
*/
int main(void)
{
/* Construct BIOS objects */
Task_Params taskParams;
/* Call board init functions */
Board_initGeneral();
Board_initGPIO();
Board_initUSB(Board_USBDEVICE);
Board_initUART();
USBCDCD_init();
/* Construct tx/rx Task threads */
Task_Params_init(&taskParams);
taskParams.stackSize = TASKSTACKSIZE;
taskParams.stack = &task0Stack;
taskParams.priority = 2;
// Task_construct(&task0Struct, (Task_FuncPtr)transmitFxn, &taskParams, NULL);
taskParams.stack = &task1Stack;
Task_construct(&task1Struct, (Task_FuncPtr)receiveFxn, &taskParams, NULL);
/* Turn on user LED */
GPIO_write(Board_LED0, Board_LED_ON);
/* SysMin will only print to the console when you call flush or exit */
System_flush();
/* Start BIOS */
BIOS_start();
return (0);
}