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.

[参考译文] RTOS/EK-TM4C123GXL:多个 UART 同时读取

Guru**** 2466550 points
Other Parts Discussed in Thread: EK-TM4C123GXL

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/668207/rtos-ek-tm4c123gxl-multiple-uarts-reading-simulatenously

器件型号:EK-TM4C123GXL
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);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    答案取决于您对"同时"的定义

    每个硬件 UART 彼此独立、并可同时接收数据。

    但是,只有一个内核,因此 MCU 必须按顺序读取数据。 对于大多数人来说、读取速度太快、实际上是同时读取、但并不是同时读取。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    数据将在 UART 中单独接收。 当我们使用阻塞模式实现时、我的假设是代码将等待一个 UART 接收到所述的数据量。

    我们的问题是、UART1接收来自传感器1的20字节数据、UART2接收来自传感器2的20字节数据、类似地、传感器3推送到 UART3。 当有单个 UART 读取代码时、我们将在不混合的情况下接收此类数据。 完成后、我们将 UART1和 UART2加在一起。 在 UART1读取后读取 UART2。有时、它正常工作、然后开始混合、例如、数据包1的格式为<7D7A67890123456789FE>、数据包2的格式为<7D7B12345678901234567890FE>、此时 USB 接收到的数据包将类似于<7D7A6781234567871277FE>的格式。 它会混合而没有任何特定的模式。

    我们尝试发送硬编码数据以排除 memcpy()相关问题,但它运行良好。 因此、我们将 UART 读取操作作为损坏点。

    连续读取 UART 是否存在问题? 可以避免这种情况吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Annamol、您好!

    我建议先找到一种方法来确认 UART 数据是否正确接收。 现在有两种可能。 1)混合会导致问题(可能)、2)未正确接收 UART 数据(根据说明、不太可能是 IMO)。

    为了尝试和区分这些可能的问题、以便我们能够确定哪一个问题是根本原因、我建议在每次接收后打印 UART 数据、然后应用混合并打印出来。 如果在混合/次级输出阶段发生错误、这就是您的问题所在、这将是编码问题、而不是任何问题。 如果 UART 数据被打印错误、那么您应该使用断点来检查 UART 数据被传输到的缓冲区、并查看损坏是否来自数据打印输出或数据接收错误。

    此外、当您说混合时、这是由这样的函数完成的吗?

    memcpy (text+sizeof (data_uart1)、data_uart2、sizeof (data_uart2)); 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们注意到 UART 数据速率(现在)为115K。    降低数据速率可能会导致更简单地确定误差的来源?    (建议19.2K -如果成功-速率可能会逐渐增加-以确定"在哪里中断!")

    我不能肯定任何"印刷作业"会因为所提出的要求而得到最好的证明。   不会为 每个 UART 建立一个"独立缓冲区"来提供"更干净、更安全的数据收集"、而是"逃避"印刷"所施加的任何惩罚。   不是目标-最总是-在施加最小"干扰"的同时"最好地捕获数据"?

    建立单独的缓冲器以及降低的 UART 数据速率符合"kiss"要求、并应最好地取得成功。   (或优化-在目标无法(真正)实现的情况下...

     应该注意的是-最常见的是-任何提到"同时"的海报都应该正确地将"助手 crüe "引导至"鸭盖!"