Thread 中讨论的其他器件: SYSBIOS
工具/软件:TI-RTOS
您好!
我们有 EK-TM4C123GXL 评估板、通过 UART1、UART4和 UART5线路将3个 BMD 模块连接到该评估板。 Tiva 板应从这3个 UART 模块读取数据并通过 USB 进行推送。 我们使用 USB 串行器件作为基础、这三个器件可以独立工作、而不会出现任何问题。 在单个任务中结合多个 UART 读取时、会发生数据损坏和丢失。
无法同时访问多个 UART 实例? 我已附上正在进行读取的代码片段。 如果有人能指出我的错误、并确认这是否可行、那会很好?
#include
#include
/* XDCtools 头文件*/
#include
#include
#include
/* BIOS 头文件*/
#include
#include
/* TI-RTOS 头文件*/
#include
/*示例/板头文件*/
#include "Board.h"
/* USB 参考模块头文件*/
#include "USBCDCD.h"
#include
#define TASKSTACKSIZE 2768
unsigned char text[40]={0x0};//"TI-RTOS 控制 USB。\r\n";
Task_Structtask0Struct, 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 ====
*接收串行数据的任务。
*
*此任务将在数据可用时接收数据,并在时阻止
*设备未连接到 USB 主机或未接收到数据。
*
空 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 ("未打开");
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.budrate = 115200;
uart3 = UART_OPEN (Board_UART5、uart3Params);
if (uart3 == NULL){
System_printf ("未打开");
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 ("未打开");
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 (空)
{
/*构造 BIOS 对象*/
Task_Params taskParams;
/*呼叫板初始化函数*/
Board_initGeneral();
Board_initGPIO();
Board_initUSB (Board_USBDEVICE);
Board_initUART();
USBCDCD_init();
/*构造 TX/Rx 任务线程*/
Task_Params_init (&taskParams);
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
taskParams.priority = 2;
// Task_constructure(&task0Struct,(Task_Functr )transmitFxn,&taskParams,NULL );
taskParams.stack =_task1Stack;
Task_construct(&task1Struct,(Task_FuncPtr) receiveFxn、&taskParams、NULL);
/*打开用户 LED */
GPIO_WRITE (Board_LED0、Board_LED_ON);
/* SysMin 仅在您调用 flush 或 exit 时才会打印到控制台*/
system_flush();
/*启动 BIOS */
BIOS_start();
返回(0);
}