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

⚠️
你好。。谢谢你来到论坛。令人兴奋的消息!我们现在正在迁移到新的论坛平台,该平台将提供更好的功能,并包含在主对话网站中。所有员额和帐户都已迁移。我们现在只接受新论坛的流量-请在//www.xmece.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
15个帖子/ 0新
最后一篇文章
亚当·斯特罗兹
离线
最后一次见到:4个月3周前
加入:2020-05-22 07:54
通过UART发送大量数据(使用DMA)

你好

我对使用DMA(“UART_OP_DMA”)通过UART发送大量数据的问题。我试图发送例如450字节的数据(char选项卡[450])。我在终端上的数据,但只有约400个符号是正确的。当我使用“uart_op_blocking”时,一切都是正确的。

Abowe是我的测试代码的一部分:

#define size 500 char选项卡[size];for(Uint32_t x = 0; x 

和终端上的结果(在此之前,我得到了正确的400个符号“b”):

´üؐü<0><0><0><0>´ü<0><0><0><0><0><0><0><0>“×đ@›ü<0><0><0><0> <0><0><0> <0><0><0><0><0><0><0><0><0><0><0> Ęń

我的问题是:

我做错了什么?

设备:
PM_对话框
离线
最后一次见到:10小时前1天
工作人员
加入:2018-02-08 11:03
嗨,亚当·斯特罗兹,

嗨,亚当·斯特罗兹,

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

谢谢,下午好

亚当·斯特罗兹
离线
最后一次见到:4个月3周前
加入:2020-05-22 07:54
你好

你好

我测试了您的示例(与Keil一起,通常我与smart snippers studio一起工作)。在您的示例中,当我将输出字符串替换为我的表(500'b'符号)时,一切都是正确的(我在终端上接收到500'b'符号)。但是我的程序还是不起作用。我注意到,当我插入(仅用于测试目的)时:

而(1),;

发送指令后,一切正常(我在终端上收到500个“b”符号)。

你能再给我一个指示吗?

PM_对话框
离线
最后一次见到:10小时前1天
工作人员
加入:2018-02-08 11:03
嗨,亚当·斯特罗兹,

嗨,亚当·斯特罗兹,

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

谢谢,下午好

亚当·斯特罗兹
离线
最后一次见到:4个月3周前
加入:2020-05-22 07:54
你好

你好

当然,主要的问题是我在终端上接收到错误的数据(我尝试了2个衍射终端)。我发送了500个标志“b”,但只收到450个,其余标志都是垃圾。当我在发送指令(通过usign,而(1)指令)后停止程序时,一切正常。我使用SDK中的空模板。

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

PM_对话框
离线
最后一次见到:10小时前1天
工作人员
加入:2018-02-08 11:03
嗨,亚当·斯特罗兹,

嗨,亚当·斯特罗兹,

您是否正在使用任何睡眠模式?你能不能在调试模式下运行它,并检查它是否卡在断言中?

谢谢,下午好

亚当·斯特罗兹
离线
最后一次见到:4个月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.奉承连接函数上的用户函数.

PM_对话框
离线
最后一次见到:10小时前1天
工作人员
加入:2018-02-08 11:03
嗨,亚当·斯特罗兹,

嗨,亚当·斯特罗兹,

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

谢谢,下午好

亚当·斯特罗兹
离线
最后一次见到:4个月3周前
加入:2020-05-22 07:54
你好

你好

此刻没有。。。我不知道怎么了。也许我应该尝试发送另一个项目(前prox_记者)?您能在您的测试板上为我测试这个简单的示例(发送我的示例阵列,带有DMA)吗?

PM_对话框
离线
最后一次见到:10小时前1天
工作人员
加入:2018-02-08 11:03
嗨,亚当·斯特罗兹,

嗨,亚当·斯特罗兹,

您使用的是SDK的哪个项目?我在SDK外围示例-6.0.14.1114\projects\target\u apps\peripheral\u examples\UART的UART项目中运行了它。我使用了下面的代码片段:

谢谢,下午好

亚当·斯特罗兹
离线
最后一次见到:4个月3周前
加入:2020-05-22 07:54
我用的是空外设

我正在使用target\u apps\template\empty\u peripheral\u template中的empty\u peripheral\u模板。你能在这个项目中为我测试一下吗?

PM_对话框
离线
最后一次见到:10小时前1天
工作人员
加入:2018-02-08 11:03
嗨,亚当·斯特罗兹,

嗨,亚当·斯特罗兹,

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

项目中还定义了CFG_UART_DMA_支持和CFG_PRINTF宏。

volatile bool uart\u send\u finished=false;发送的易失性uint16数据=0;静态无效uart_send_cb(uint16_t length){data_send_cnt=长度;uart\u send\u finished=true;}void uart_send_dma_示例(uart_t*uart){#define size 500 char tab[size];对于(uint32_t x=0;x<尺寸;x++{tab[x]='b';}printfèu字符串(uart,“\n\r\n\r***************************************************************\n\r”);uart\u send\u finished=false;发送的数据=0;uart_寄存器_发送_cb(uart、uart_发送_cb);uart_发送(uart,(uint8_t*)选项卡,sizeof(tab)-1,uart_OP_DMA);而!uart_发送_完成);printf_字符串(uart,“\n\r发送的数据:0x”);打印字(uart,数据发送);printf_字符串(uart,“字节\n\r\n\r”);打印字符串(uart,“******************************************\n\r\n\r”);”

谢谢,下午好

亚当·斯特罗兹
离线
最后一次见到:4个月3周前
加入:2020-05-22 07:54
你好

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

而(!Uart_send_finished);

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

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

亚当·斯特罗兹
离线
最后一次见到:4个月3周前
加入:2020-05-22 07:54
所以最后。。。我解决了这个问题

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

char tab [size];

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

PM_对话框
离线
最后一次见到:10小时前1天
工作人员
加入:2018-02-08 11:03
嗨,亚当·斯特罗兹,

嗨,亚当·斯特罗兹,

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

谢谢,下午好