IWR6843 串口收发问题

您好:

 使用如下的串口程序。收到的数据发生的移位的情况。可以帮忙看看是什么问题造成的吗?

  由串口发送如下数据:

程序控制的调试信息如下:

  • 请问能否提供一个在调用UART_read()之后rxBuffer如何存储在内存中的图像?
  • 您好:

     我在CLI_task 中加入串口程序。

     把rxBuffer添加 Watch Windowns,但是查找不出他的内存。

    可以详细说说怎么查看内存。

    谢谢!

  • 你好,

    可以使用串口的HEX模式试一下。

    /* Setup the default UART Parameters */
    UART_Params_init(&uartParams);
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.clockFrequency = gMmwMssMCB.cfg.sysClockFrequency;
    uartParams.baudRate = gMmwMssMCB.cfg.loggingBaudRate;
    uartParams.isPinMuxDone = 1U;

  • 您好:

    按照您的设置,如下:

    UART_Params_init(&uartParams);
    uartParams.clockFrequency = gMmwMCB.cfg.platformCfg.sysClockFrequency;
    uartParams.baudRate = gMmwMCB.cfg.platformCfg.commandBaudRate;
    uartParams.readEcho = UART_ECHO_OFF;
    uartParams.writeDataMode = UART_DATA_BINARY;
    uartParams.readDataMode = UART_DATA_BINARY;
    uartParams.isPinMuxDone = 1;

     cliCfg.cliUartHandle                = gMmwMCB.commandUartHandle;

    memset ((void *)&rxBuffer[0], 0, 8);
    int ret = UART_read(gCLI.cfg.cliUartHandle,&rxBuffer[0],8);
    System_printf ("the number of readbyte %d\n",ret);
    System_printf ("%x %x %x %x %x %x %x %x\n", rxBuffer[0],rxBuffer[1],rxBuffer[2],rxBuffer[3],rxBuffer[4],rxBuffer[5],rxBuffer[6],rxBuffer[7]);
    UART_writePolling(gCLI.cfg.cliUartHandle,&rxBuffer[0],8);

    还是出现了上述现象。

    谢谢

  • 创建了一个简短的小程序来模拟您使用UART API减去(例如)提供的代码段。 UART_read()。 但是无法复制乱序字节问题。可能有两个地方存在争议。

    1.您使用的串行终端可能是原因,通常使用PuTTY或Teraterm。 请您尝试一下,看看是否会改变程序的输出。

    2.您使用System_printf(),这可能是问题所在。

    为了解决此错误,建议使用调试器+内存浏览器来查看程序中的变量/数据结构如何逐行变化。

    如果找不到您的memory browser,请在Google中搜索您特定的IDE,并确定是否具有调试器以及memory browser。假设您正在使用CCS,则这两个功能需要使用。

  • 您好:

    1:使用了Putty的串行中断,输入的数据确实是正确的,但是我所需要的串口协议是16进制,Putty好像不能使用16进制。

    2:使用的是我以前的串口助手,并屏蔽了System_printf()的语句。

    3:找到了UART_read()之后rxBuffer的内存如下图所示:

    1)正确rxBuffer的内存显示:

    2)错误rxBuffer的内存显示:

    3)当显示错误之后的,内存中17始终无法清除。

    4)当将数据输入变为00010203040506时,会再次出现错误的数据,之后在输入0001020304050607时,输出数据即为正确。

    谢谢。

  • 从图1中可以看到,确实在内存地址0x08007498中字节序列是正确的。 在图2中,0x17字节是乱序的。

    是什么在内存中生成了正确的数据? 是同一串行终端还是其他?如果当前的串行终端软件最初在内存中产生了正确的结果,那么在经过一些指令后,内存将被更改,则需要对其进行共享。

    建议找另一个适用于该应用程序的串行终端,尝试复制该问题。如果不能复制循环移位,则可以确定问题出在主要的串行终端软件上。

    请问是否可以提供对mss_main.c执行的所有更改,以便于更好分析您的问题。

  • 您好:

      当串口收到错误数据时,程序会丢弃这部分程序。但只要收到错误的数据后面就会一直错。我试过将数据字节少于8个字节,或者数据字节大于八个字节。都会将数据最后一个字节放在接收字节的第一位并不是循环移动的。

     这个串口接收程序,可以在接收数据未满8个字节或者超过8个字节,在下次数据未发送时,将缓存再进行一次清理吗?换句话说,就能在下一次读取数据时,数据都是一次性接收的。

    谢谢

  • 您正在使用的是UART_read(),建议您改用UART_readPolling()试一下

  • 您好:
    我添加一个串口任务,要要实现帧头奇校验帧尾偶校验。断点实行该程序程序正确,全速运行接收数据异常;如下程序所示:
    static void uart_task(UArg arg0, UArg arg1)
    {
    //串口定义变量
    uint8_t rxBuffer[8];
    uint8_t txBuffer[8];
    uint8_t txBuffer_ret[18];
    uint8_t txBuffer_RDdata[41];
    uint8_t Cheakout;
    uint8_t rxBuffer_Reg;//单个串口数据
    UART_Params uartParams;
    uint8_t txBuffer_reg;//发送的数据

    int i=0 ;

    /* Loop around forever: */
    //串口初始化 为奇校验,帧头为奇校验,后面字节都为偶校验
    while (1)
    {
    //初始化内存
    memset ((void *)&rxBuffer[0], 0, 8);
    memset ((void *)&rxBuffer_Reg, 0, 1);
    memset ((void *)&txBuffer[0], 0, 8);
    memset ((void *)&txBuffer_ret[0],0,18);
    memset ((void *)&txBuffer_RDdata[0],0,41);

    UART_close(gCLI.cfg.cliUartHandle);
    UART_Params_init(&uartParams);
    uartParams.clockFrequency = gMmwMCB.cfg.platformCfg.sysClockFrequency;
    uartParams.baudRate = gMmwMCB.cfg.platformCfg.commandBaudRate;
    uartParams.readEcho = UART_ECHO_ON;
    uartParams.isPinMuxDone = 1;
    uartParams.parityType = UART_PAR_ODD ;
    gCLI.cfg.cliUartHandle = UART_open(0, &uartParams);
    if (gCLI.cfg.cliUartHandle == NULL)
    {
    //System_printf("Error: Unable to open the Command UART Instance\n");
    MmwDemo_debugAssert (0);
    return;
    }

    for(i=0; i<RECIVE__COMMAND_LENGTH; i++)
    {
    int ret = UART_read(gCLI.cfg.cliUartHandle,&rxBuffer_Reg,1);
    if(i== 0 )
    {
    if( rxBuffer_Reg == RECIVE_FRAME_HEADER)
    {
    rxBuffer[0] = rxBuffer_Reg;
    UART_close(gCLI.cfg.cliUartHandle);
    UART_Params_init(&uartParams);
    uartParams.clockFrequency = gMmwMCB.cfg.platformCfg.sysClockFrequency;
    uartParams.baudRate = gMmwMCB.cfg.platformCfg.commandBaudRate;
    uartParams.readEcho = UART_ECHO_ON;
    uartParams.isPinMuxDone = 1;
    uartParams.parityType = UART_PAR_EVEN ;//校验位为偶
    gCLI.cfg.cliUartHandle = UART_open(0, &uartParams);
    if (gCLI.cfg.cliUartHandle == NULL)
    {
    //System_printf("Error: Unable to open the Command UART Instance\n");
    MmwDemo_debugAssert (0);
    return;
    }
    }
    else
    {
    i=0;
    break;
    }
    }
    else
    {
    rxBuffer[i] = rxBuffer_Reg;
    }

    }
    }
    想问问是什么原因,想了蛮长时间不知道为什么。谢谢啊