TI中文支持网
TI专业的中文技术问题搜集分享网站

IWR6843 串口收发问题

您好:

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

  由串口发送如下数据:

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

Annie Liu:

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

user6310217:

回复 Annie Liu:

您好:

 我在CLI_task 中加入串口程序。

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

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

谢谢!

Wesley He:

你好,

可以使用串口的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;

user6310217:

回复 Wesley He:

您好:

按照您的设置,如下:

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);

还是出现了上述现象。

谢谢

Annie Liu:

回复 user6310217:

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

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

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

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

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

user6310217:

回复 Annie Liu:

您好:

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

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

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

1)正确rxBuffer的内存显示:

2)错误rxBuffer的内存显示:

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

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

谢谢。

Annie Liu:

回复 user6310217:

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

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

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

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

user6310217:

回复 Annie Liu:

您好:

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

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

谢谢

Annie Liu:

回复 user6310217:

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

user6310217:

回复 Annie Liu:

您好:我添加一个串口任务,要要实现帧头奇校验帧尾偶校验。断点实行该程序程序正确,全速运行接收数据异常;如下程序所示:
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_ParamsuartParams;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;}
}
}
想问问是什么原因,想了蛮长时间不知道为什么。谢谢啊

赞(0)
未经允许不得转载:TI中文支持网 » IWR6843 串口收发问题
分享到: 更多 (0)