您好:
使用如下的串口程序。收到的数据发生的移位的情况。可以帮忙看看是什么问题造成的吗?
由串口发送如下数据:
程序控制的调试信息如下:
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;}
}
}
想问问是什么原因,想了蛮长时间不知道为什么。谢谢啊