通过UART (DMA使用)发送大量数据

⚠️
大家好. .谢谢你来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,包含在主对话网站中。所有岗位和账户都已迁移。我们现在只接受新论坛的流量-请在上面发布任何新帖子//www.wsdof.com/support.我们将在未来几天修复bug /优化搜索和标记。
15个帖子/ 0新
最后发表
adam.stroz
离线
最后看到:1个月前3个星期前
加入:2020-05-22 07:54
通过UART (DMA使用)发送大量数据

你好,

我对使用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 >Ęń

我的问题是:

我哪里做错了?

设备:
PM_Dialog
离线
最后看到:1天13小时前
工作人员
加入:2018-02-08 11:03
嗨adam.stroz,

嗨adam.stroz,

我建议首先检查SDK的6.0.14.1114 \ projects \ target_apps \ peripheral_examples \ uart。在我身边,我能够使用UART_SEND_DMA_EXAMPLE()打印超过500个字节的字节。为此,请检查您是否具有相同的配置并使用表替换output_string。

谢谢,PM_Dialog

adam.stroz
离线
最后看到:1个月前3个星期前
加入:2020-05-22 07:54
你好,

你好,

我测试了你的例子(在Keil中,我通常与smart snippers工作室合作)。在你的例子中,当我用我的表(500 'b'符号)替换OUTPUT_STRING时,一切都是正确的(我在终端上收到500 'b'符号)。但是我的程序还是不能运行。我注意到,当我插入(仅用于测试目的):

(1);

发送指令后,一切都是正确的(我收到500 'b'在终端上签字)。

你能给我另一个指示吗?

PM_Dialog
离线
最后看到:1天13小时前
工作人员
加入:2018-02-08 11:03
嗨adam.stroz,

嗨adam.stroz,

你能澄清什么是不起作用的吗?

谢谢,PM_Dialog

adam.stroz
离线
最后看到:1个月前3个星期前
加入:2020-05-22 07:54
你好,

你好,

当然,主要的问题是我收到错误的数据在终端(我尝试2不同的终端)。我发送了500个符号'b',但只收到450个,其余的符号都是垃圾。当我停止程序后发送指令(使用while(1)指令)一切工作正常。我使用SDK中的empty_perpiherial_template工作。

我不知道为什么我的程序向UART发送一些垃圾。

PM_Dialog
离线
最后看到:1天13小时前
工作人员
加入:2018-02-08 11:03
嗨adam.stroz,

嗨adam.stroz,

你有使用任何一种睡眠模式吗?你能不能在调试模式下运行它,并检查它是否陷入断言等?

谢谢,PM_Dialog

adam.stroz
离线
最后看到:1个月前3个星期前
加入:2020-05-22 07:54
你好,

你好,

我不使用任何睡眠模式。

static const sleep_state_t app_default_sleep_mode = arch_sleep_off;
.adv_scenario = DEF_ADV_FOREVER,

当我以调试模式运行时,指令后的程序UART_SEND.继续正常工作。

如果有关系,我会打电话的UART_SEND.函数在user_on_connection函数

PM_Dialog
离线
最后看到:1天13小时前
工作人员
加入:2018-02-08 11:03
嗨adam.stroz,

嗨adam.stroz,

谢谢你的更新。那么,你能打印正确的数据吗?

谢谢,PM_Dialog

adam.stroz
离线
最后看到:1个月前3个星期前
加入:2020-05-22 07:54
你好,

你好,

此刻不…我不知道怎么了。也许我应该试着发送另一个项目(如ex.prox_reporter) ?您能在您的测试板上为我测试这个简单的示例(发送我的示例数组,使用DMA)吗?

PM_Dialog
离线
最后看到:1天13小时前
工作人员
加入:2018-02-08 11:03
嗨adam.stroz,

嗨adam.stroz,

您使用的是SDK的哪个项目?我在UART项目中运行它,从SDK外设示例- 6.0.14.1114\projects\target_apps\peripheral_examples\ UART。我使用了下面的代码片段:

谢谢,PM_Dialog

adam.stroz
离线
最后看到:1个月前3个星期前
加入:2020-05-22 07:54
我用empty_peripheral

我使用了target_apps\template\empty_peripheral_template中的empty_peripheral_template。你能在这个项目中帮我测试一下吗?

PM_Dialog
离线
最后看到:1天13小时前
工作人员
加入:2018-02-08 11:03
嗨adam.stroz,

嗨adam.stroz,

我的道歉 - 忘了在我以前的评论中附加代码段。我已经使用UART2块在empty_peripheral_template中进行了测试。数据在连接回调中打印。

CFG_UART_DMA_SUPPORT和CFG_PRINTF宏也在项目中定义。

Volatile bool uart_send_finished = false;Volatile uint16_t data_sent_cnt = 0;Static void uart_send_cb(uint16_t length) {data_sent_cnt = length;uart_send_finished = true;} void uart_send_dma_example(uart_t* uart) {#define size 500 char tab[size];(uint32_t x = 0; x <大小;x + +){选项卡(x) = ' b ';} printf_string (uart,“\ n \ r \ n \ r ****************************************\ n \ r”);uart_send_finished = false;data_sent_cnt = 0;uart_register_tx_cb (uart uart_send_cb); uart_send(uart, (uint8_t *)tab, sizeof(tab) - 1, UART_OP_DMA); while (!uart_send_finished); printf_string(uart, "\n\rData sent: 0x"); print_hword(uart, data_sent_cnt); printf_string(uart, " Bytes\n\r\n\r"); printf_string(uart, "****************************************\n\r\n\r"); }

谢谢,PM_Dialog

adam.stroz
离线
最后看到:1个月前3个星期前
加入:2020-05-22 07:54
你好,

你好,
我测试了你的代码,一切都是正确的。但在我的例子中,我希望发送数据并继续执行下一步。所以我必须删除这部分代码:

而(!Uart_send_finished);

(我不想等到发送完成)。当我从代码中删除此部件时,发生相同的问题(垃圾符号)。

您能删除这部分代码和测试吗?

adam.stroz
离线
最后看到:1个月前3个星期前
加入:2020-05-22 07:54
所以最后…我解决了

所以最后…我解决了这个问题:)声明数组就足够了,

char tab [size];

随着全球。我认为,当我声明我的数组退出函数后,数组丢失了,但是我提供给函数uart_send的指针仍然指向表所在的内存区域。所以程序中的其他指令可以改变这个存储区的数据。这可能会导致发送错误数据。

PM_Dialog
离线
最后看到:1天13小时前
工作人员
加入:2018-02-08 11:03
嗨adam.stroz,

嗨adam.stroz,

很高兴你解决了你的问题,谢谢分享解决方案!

谢谢,PM_Dialog