⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程https://www.dialog-seminile.com/support.。我们将在未来几天修复错误/优化搜索和标记。
4个帖子/ 0新
最后一篇
马里奥
离线
最后一次露面:3年8个月前
加入:2017-03-30 13:56
UART.

嗨对话框,
我正在尝试与Periphal设备建立UART通信。稍后,我想通过BLE传输接收的数据到另一个设备 - 我选择了BLE_MULTI_LINK演示来构建。
如何多次读取来自UART的数据?当RX输入有数据时是否有可能接收中断?

我已经尝试过以下代码,但它导致重复的重置。

ble_multi_link_task(void * params){


为了(;;) {
UART_DEVICE DEV;
int rx_data;
dev = ad_uart_open(serial2);
ad_uart_bus_acquire(dev);
rx_data = ad_uart_read(dev,buf,4,os_event_forever);
ad_uart_bus_release(dev);
}

}

谢谢!

设备:
mt_dialog.
离线
最后一次露面:2周11小时前
职员
加入:2015-06-08 11:34
嗨马里奥,

嗨马里奥,

几个关于您粘贴的代码的评论,使用UART2模块随时依旧使用UART2模块来重新命令PrintF()函数(Config_Retarget是配置和将PrintF()函数函数的定义为UART2),也是如此重新定位不使用适配器,但据我所知,即可通过句子和适配器访问相同的界面,这不会反对此时的问题,但如果设备获取用数据强调这可能会导致你的问题。

您还将初始化代码放在for(;;)循环中启动UART适配器的初始化代码,这意味着每次(;;)执行您执行相同的功能时(虽然您是不是发生通过UART超时阻止执行任务的执行)。此外,我假设您已将您在看门狗函数执行之前放置的代码段(sys_watchdog_notify()和sys_watchdog_suspend())。这意味着看门狗正在运行,你永远等待,直到4个字节的数据来到你的UART,在有机会做任何事情之前,代码将在WatchDog_Handler()中。

我没有完全究竟是什么意思“从UART读取数据超过一旦读取数据”,AD_UART_READ()将阻止任务直到时间过去(在您的情况下
OS_EVENT_FOREVER这不会发生)或者4时代es are received, this function doesn't also uses any callback to notify you that the data have arrived since the function is blocking. You can also check the ad_uart_read_async() function which will not block the task and will wait for a specified number of bytes to be received (be aware that this function cannot be called consecutively before the previous transaction has been completed), this function is executing a callback when the predefined number of data arrive. Since the SDK is using adapters and not the LLD the interrupts are used by the adapters and it requires some effort in order not to use the adapters and implement code using the Low Level Drivers and therefore use the interrupts.

将触发UART交互的任务可能是一个已实现的任务或将处理UART的新任务,这取决于您的实现。此外,您还必须意识到当设备处于睡眠模式时,包括UART的所有外围设备都关闭,因此在休眠模式下,除非设备唤醒,否则您不会有UART交互。因此,您可以使用设备唤醒或实现外部设备先发送数据之前唤醒68x的数据的方案,这意味着您必须使用硬件流量控制,以便外部设备唤醒68x的68x亮起RTS引脚。

假设您希望一次从UART读取数据并将其打印回到终端,使用Multwink上的UART的简单实现可能是以下情况。

  • 将额外的引脚设置为RTS和CTS,以防止设备睡眠,而外部设备断言CTS。
  • 在输入for(;;)循环之前,任务的循环启动UART Transaction Dev = AD_UART_OPEN(Serial2);AD_UART_READ_ASYNC(DEV,BUF,1,(VOID *)UART_ASYNC_READ_CB,NULL);
  • 回调将向主任务发送通知,以便打印接收的数据,并通过调用AD_UART_READ_ASYNC()函数来重置读取。

谢谢mt_dialog.

马里奥
离线
最后一次露面:3年8个月前
加入:2017-03-30 13:56
谢谢!

谢谢!

Mahmed106.
离线
最后一次露面:2个月1日前
加入:2019-05-03 17:28
感谢您的详细信息

感谢您的详细回复。在重新注册AD_UART_READ_ASYNC()之后,我能够像中断一样从UART读取数据。谢谢,你的详细答案真的帮助了我。:)