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

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

你好,

我有一个关于使用DMA(“UART_OP_DMA”)通过UART发送大量数据的小问题。例如,我尝试发送450字节的数据(char tab[450])。我在终端上接收到数据,但只有大约400个符号是正确的。当我使用“UART_OP_BLOCKING”时,一切都是正确的。

以上是我测试代码的一部分:

# size 500 char tab[size];For (uint32_t x=0;x

在终端上的结果(在此之前,我已经得到了正确的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
离线
最后看到:2周2天前
工作人员
加入: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
离线
最后看到:3个月1周前
加入:2020-05-22 07:54
你好,

你好,

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

(1);

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

你能再给我一些指示吗?

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

嗨adam.stroz,

你能解释一下什么不能用吗?

谢谢,PM_Dialog

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

你好,

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

我不知道为什么我的程序会发送一些垃圾到art。

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

嗨adam.stroz,

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

谢谢,PM_Dialog

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

你好,

我没有使用任何睡眠模式。

静态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
离线
最后看到:2周2天前
工作人员
加入:2018-02-08 11:03
嗨adam.stroz,

嗨adam.stroz,

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

谢谢,PM_Dialog

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

你好,

此时此刻,没有……我不知道怎么了。也许我应该尝试发送另一个项目(例如prox_reporter) ?你可以为我测试这个简单的例子(发送我的例子数组,与DMA)在你的测试板?

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

嗨adam.stroz,

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

谢谢,PM_Dialog

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

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

PM_Dialog
离线
最后看到:2周2天前
工作人员
加入: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;静态无效uart_send_cb(uint16_t长度){data_sent_cnt =长度;Uart_send_finished = true;} void uart_send_dma_example(uart_t* uart) {#define size 500 char tab[size];For (uint32_t x=0;x

谢谢,PM_Dialog

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

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

而(! uart_send_finished);

(我不想等到发送完成)。当我从你的代码中删除这部分时,同样的问题发生了(垃圾标志)。

你能删除这部分代码并进行测试吗?

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

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

字符选项卡(大小);

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

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

嗨adam.stroz,

很高兴你找到了你的问题,感谢分享修复!

谢谢,PM_Dialog