你好,
我对使用DMA(“UART_OP_DMA”)通过UART发送大量数据的问题。我试图发送例如450字节的数据(char选项卡[450])。我在终端上的数据,但只有约400个符号是正确的。当我使用“uart_op_blocking”时,一切都是正确的。
下面是我的测试代码:
#define size 500 char选项卡[size];(uint32_t x = 0; x <大小;x + +){选项卡(x) = ' b ';} UART_SEND(UART1,(CONSS UINT8_T *)选项卡,大小,UART_OP_DMA);
结果在终端(在这之前我得到了正确的400符号“b”):
´uŘu < 0 > < 0 > < 0 > < 0 >´u < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 >“×đ@;u < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 > < 0 >Ęń
我的问题是:
我哪里做错了?
设备:
嗨adam.stroz,
我建议首先检查SDK的6.0.14.1114 \ projects \ target_apps \ peripheral_examples \ uart。在我身边,我能够使用UART_SEND_DMA_EXAMPLE()打印超过500个字节的字节。为此,请检查您是否具有相同的配置并使用表替换output_string。
谢谢,PM_Dialog
你好,
我测试了你的例子(与Keil,通常我工作与聪明的狙击手工作室)。在你的例子中,当我用我的表(500 'b'符号)替换OUTPUT_STRING时,一切都是正确的(我在终端收到500 'b'符号)。但是我的程序还是不起作用。我注意到,当我插入(仅用于测试目的):
发送指令后,一切都是正确的(我在终端收到500 'b'符号)。
你能给我另一个指示吗?
嗨adam.stroz,
你能澄清什么是不起作用的吗?
谢谢,PM_Dialog
你好,
当然,主要的问题是我在终端接收到错误的数据(我尝试了2个不同的终端)。我发了500个b号,但只收到450个,其余的都是垃圾。当我在发送指令后停止程序(由usign while(1)指令),一切工作正常。我使用SDK中的empty_perpiherial_template。
我不知道为什么我的程序向UART发送一些垃圾。
嗨adam.stroz,
你在使用睡眠模式吗?你能不能在调试模式下运行它,检查它是否陷入断言等?
谢谢,PM_Dialog
你好,
我不使用任何睡眠模式。
当我以调试模式运行时,指令后的程序UART_SEND.继续正常工作。
如果有关系,我打电话UART_SEND.函数在user_on_connection函数.
嗨adam.stroz,
谢谢你的最新消息。你能打印正确的数据吗?
谢谢,PM_Dialog
你好,
此时此刻,没有……我不知道怎么了。也许我应该尝试发送另一个项目(例如prox_reporter) ?您能在您的测试板上为我测试这个简单的示例(使用DMA发送我的示例数组)吗?
嗨adam.stroz,
您使用的是SDK的哪个项目?我从SDK外设示例的UART项目中运行它- 6.0.14.1114\projects\target_apps\peripheral_examples\ UART。我使用了下面的代码片段:
谢谢,PM_Dialog
我使用的是来自target_apps的empty_peripheral_template \empty_peripheral_template。你能在这个项目中帮我测试一下吗?
嗨adam.stroz,
我的道歉 - 忘了在我以前的评论中附加代码段。我已经使用UART2块在empty_peripheral_template中进行了测试。数据在连接回调中打印。
项目中还定义了CFG_UART_DMA_SUPPORT和CFG_PRINTF宏。
谢谢,PM_Dialog
你好,
我测试了你的代码,一切都是正确的。但在我的情况下,我想发送数据并继续执行下一步。所以我必须删除这部分代码:
(我不想等到发送完成)。当我从代码中删除此部件时,发生相同的问题(垃圾符号)。
您能删除这部分代码和测试吗?
所以最后…我解决了这个问题:)声明数组就足够了,
随着全球。我认为,当我声明数组时,在exit函数之后,数组就丢失了,但是我提供给uart_send函数的指针仍然指向表所在的内存区域。所以程序中的其他指令可以改变这个存储区域中的数据。这可能会导致发送错误的数据。
嗨adam.stroz,
很高兴你解决了你的问题,感谢分享修复!
谢谢,PM_Dialog