了解更多常见问题教程

4个职位/ 0个新职位
最后发表
马里奥
离线
最后看到:3年7个月前
加入:2017-03-30 13:56
UART

嗨,对话框中,
我正在尝试建立一个与外围设备的UART通信。稍后,我想通过BLE将接收到的数据传输到另一个设备—我已经选择了ble_multi_link演示来构建。
如何从UART多次读出数据?当rx输入端有数据时,是否有可能接收到中断?

我尝试了以下代码,但它会导致重复重置。

ble_multi_link_task (void * params) {


(,) {
uart_device开发;
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天2小时前
工作人员
加入:2015-06-08 34
你好马里奥,

你好马里奥,

关于您所粘贴的代码的一些注释,multilink已经使用UART2模块来重新定位printf()功能(CONFIG_RETARGET是将printf()功能配置并重定向到UART2的定义),也重新将不使用适配器但LLD司机,据我所知,你是访问同一个periheral由低电平驱动和适配器,这不会反对一个问题,但是如果设备被强调的数据这可能导致你的问题。

你也把初始化代码为起始的UART适配器(;;)循环的任务,这意味着每一次了(,)执行执行相同的功能(这是没有发生但因为你是阻塞的执行任务的UART超时)。另外,我假设您已经放置了在watchdog函数执行之前附加的代码片段(sys_watchdog_notify()和sys_watchdog_suspend())。这意味着看门狗正在运行,您将永远等待,直到4字节的数据到达您的UART,代码将在有机会做任何事情之前在watchdog_Handler()中结束。

我不明白你的确切意思是“从UART读取数据超过一次”,ad_uart_read()将阻塞任务,直到时间过去(在你的情况下
或者如果收到4字节的数据,由于函数阻塞,本函数也不会使用任何回调来通知数据已经到达。你也可以检查ad_uart_read_async()函数将不会阻止指定的任务,将等待接收的字节数(注意,这个函数不能被称为连续在上一个事务已经完成前),这个函数执行一个预定义的数据到达时回调。由于SDK使用的是适配器而不是LLD,适配器使用中断,为了不使用适配器和使用低级别驱动程序实现代码并因此使用中断,需要一些努力。

触发UART交互的任务可以是已经实现的任务,也可以是将处理UART的新任务,这取决于您的实现。此外,您还必须意识到,当设备处于休眠模式时,包括UART在内的所有外围设备都将关闭电源,因此,在休眠模式下,除非设备处于清醒状态,否则无法进行UART交互。所以你可以有设备一直醒着或实施一个计划,在外部设备发送数据之前首先醒来68 x,这意味着你将不得不使用硬件流控制外部设备为了唤醒通过RTS销68 x。

让我们假设您希望每次从UART读取一个字节的数据并将其打印回您的终端,下面是在多链路上使用UART的一个简单实现。

  • 设置额外的引脚为RTS和CTS,以防止设备进入睡眠,而CTS是由外部设备断言。
  • 在进入任务的for(;;)循环之前,初始化uart事务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年7个月前
加入:2017-03-30 13:56
谢谢!

谢谢!

mahmed106
离线
最后看到:1个月2个星期前
加入:2019-05-03所
非常感谢你的详细说明

非常感谢您的详细回复。在重用ad_uart_read_async()之后,我可以像中断一样从uart读取数据。谢谢,你详细的回答对我很有帮助。:)