最近用JOSN数据通信,JSON数据包用printf去发送,是OK的,发送函数,如图片2 char *string = NULL; string = cJSON_PrintUnformatted(root); printf("%s\n",string); free(string); 为了提高速度,采用DMA发送,代码如下,现在发送给遇到一个问题,发送数据会丢掉第2、3、4数据,后面的数据是正常的,如图片1 char *string = NULL; string = cJSON_PrintUnformatted(root); DMA_Uart2_Tx_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART2->DR; DMA_Uart2_Tx_InitStructure.DMA_MemoryBaseAddr =(u32)string; DMA_Uart2_Tx_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_Uart2_Tx_InitStructure.DMA_BufferSize = strlen(string); DMA_Uart2_Tx_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_Uart2_Tx_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_Uart2_Tx_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;// 外设数据宽度8位,1个字节 DMA_Uart2_Tx_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;// 内存数据宽度8位,1个字节 DMA_Uart2_Tx_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_Uart2_Tx_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; DMA_Uart2_Tx_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel7, &DMA_Uart2_Tx_InitStructure); DMA_Cmd(DMA1_Channel7, ENABLE); free(string); 分析原因:string = cJSON_PrintUnformatted(root);string是char型的,而DMA_Uart2_Tx_InitStructure.DMA_MemoryBaseAddr =(u32)string;强制转化为32位的,首地址数据只有sting的第一个数据,当DMA_MemoryBaseAddr++时,相当于加了4字节,就直接到string的第5个字节了,造成丢掉数据。 解决方案一先定义u32指针,将string数据一个个地复制到u32指针中去,但由于sting有1000多字节数据,复制到U32指针会造成空间不够,方法行不通; 现不知道如何解决,不知有没有其它方法解决,求解 |
评分
查看全部评分
你的问题应该是别的原因引起的
问题是在free(string);
free(string);应该放在DMA完成中断里
都还没开始发送, 你就free了,string的内容可以随时改变
评分
查看全部评分
楼上正解,是我分析错了,
既然解决了,那就结贴吧。
DMA的传输数据类型已经是 DMA_MemoryDataSize ,就不存在32位对齐,或指针加4的问题。
(u32)string只是传输的首地址,跟指针加几没有关系,到了DMA里,也不存在指针。DMA中和内存的步进长度是按照DMA_MemoryDataSize 来走的。
DMA_Uart2_Tx_InitStructure.DMA_MemoryBaseAddr =(u32)string;
这个不应该是DMA_Uart2_Tx_InitStructure.DMA_MemoryBaseAddr =(u32*)string; 嘛?
至少是个地址吧?
评分
查看全部评分