亲爱的对话支持团队,
我正在尝试通过UART接收一些数据,并在一些处理通过BLE发送它后。到目前为止,我用过ble_app_peripheral.和BLE_UART.示例以创建我需要的东西。
渴望我用了一个app_easy_timer.要启动调整器每2秒来处理任何接收的数据并通过BLE发送它们。这位州长会使用UART_RECEIVE()在DMA模式。然而,这完美无缺;我想提高程序的响应时间,这意味着我希望总督总是等待UART进行数据传输开始。
我尝试了以下几个,但在循环中缩短后程序崩溃。
volatile bool som_received = false;静态void UART_RECEIVE_INTR_CB(UINT16_T长度){静态UINT8_T索引= 0;静态uint8_t temp_length = 0;if(som_received){if(index == 1){temp_length = temp_queue [index];索引++;返回;}否则if((index> 1)&&(index
我正在等待SOM字符,数据长度和数据本身。话虽如此;我在队列中存储这些值,并在收到一包数据后我正在更改uart_receive_finished.为真。
我有以下问题:
1-有没有办法在后台可以始终等待数据(在聆听UART)的情况下?电路板应运行其正常过程(可能是检查当前状态的状态机以及是否已接收到任何数据),同时始终通过UART等待和存储传入数据。
2-我猜测我当前的代码有问题的问题(有或没有看门狗,问题仍然存在!)。我试过修改UART_RX_TIMEOUT_ISR S.o它会阻止无限循环,但这并不起。你能解释一下这个中断和超时吗?
问候,
汉米德
关键词:
设备:
嗨,我认为你正在采用正确的方法来与中断例子。当然,UART示例和BLE示例之间的差异是SDK。我猜你正在阻止:
这导致看门狗着火。
我所做的就是如下:
1)使用UART_REGISTER_RX_CB初始化UART驱动程序,并在user_callbacks_config中的.app_on_init回调中的uart_initialize .h
2)在user_callback_config中创建自己的函数,指向.app_on_system_powered(这是一个钩子直接进入主循环)。
3)现在,在您的UART回调函数中,在获取有效数据时设置您的UART_RECEIDED_DATA标志。
4)在app_on_system_powered回调中,只需检查标志,如果未设置,则允许它返回。
SDK运行调度程序一旦App_on_System_Powered已运行,因此不应阻止一段时间。
请让我知道这可不可以帮你。
/ Jon.
非常感谢乔恩,
我已经实施了你在此提到的步骤,我实际上可以更好地了解整个系统。换句话说app_asynch_proc.在主循环中让Shccululer保持直接app_on_system_powered.返回A.去睡觉命令。
但是,您提到的步骤似乎没有工作。当我运行该程序时,看门狗在广告开始后立即触发并停止程序。这是我的user_app_on_system_powered:
ARCH_MAIN_LOOP_CALLBACK_RET_T USER_APP_ON_SYSTEM_POWERED(void)
{
如果(!uart_receive_finished){
返回keep_powered;
}
别的{
返回goto_sleep;
}
}
事实上,当我在开始这个函数的断点时,我能够遵循所需的路径来保持程序,同时它仍在等待uart_receive_finished.。但是,删除了Break Poin并允许程序继续其过程将导致我无法追踪的崩溃。
问候,
汉米德
嗨哈米德,
如果您完全结束,您只能返回Goto_Sleep。但是在这里预期看门狗射击。看门狗只是在主循环中'反馈',一旦您返回Goto_Sleep,就会才会在主循环中。在user_callback_config.h中的注释中也提到了这一点.App_on_system_powered。
如果要长时间返回Keep_Power后,请使用循环中的以下代码行:
wdg_reload(watchdog_default_period);
/ Jon.
亲爱的乔恩,
我已经实施了我们讨论的更改。我的代码现在看起来像这样:
但是,现在我有另一个问题。在接收到第一个字节并返回到UART中断处理程序时,为下一个字节,接收线状态中断被射击并在无限循环中,导致程序崩溃。我怀疑我必须以某种方式释放或冲洗接收缓冲区,可以向我提供一些指示吗?
问候,
汉米德
嗨哈米德,
几个评论。
1)WDOG已在主循环中重新加载,您应该避免修改此文件。
2)您是否在任何交易期间重新配置UART?您只需要设置UART一次,然后中断将在每个字节上启动。如果在传输过程中重新配置UART,则会导致帧/奇偶校验错误。
/ Jon.
1)好的,我想自从我是谷歌以保持CPU运行一段时间,我应该重新加载调度程序循环内的看门狗。但是,它已经在大主循环的末尾重新加载;我删除了主文件上的修改(wdog_reload.在调度程序循环中)。谢谢你的评论。
2)每次接受未完成后,我正在重新配置UART。似乎这导致了这个问题。我也删除了这个部分。
现在,当我在启动广告后一步一步运行程序时,该过程顺利进行。换句话说,主循环检查去睡觉每次等待uart_receive_finished.。但是,当我正常运行该程序时,看门狗再次被解雇。正如我可以跟踪的那样,WatchDog在循环中触发。似乎仍然存在无限循环的问题?
嗨哈米德,
请在user_app_on_system_powered的看门狗重新加载中添加回来,但只是将它放在if()语句之外:
wdg_reload(watchdog_default_period);
/ Jon.
亲爱的乔恩,
非常感谢,现在看门狗的问题是固定的。但是,我仍然有问题接收器线状态错误中断。
我试图尽可能简化代码。在此代码中,UART应该只是等待一个特殊的角色。
如果我将队列表单1byte的大小更改为一些更大的数字,则程序将起作用,但我必须等待队列满满的回调。这将增加我的系统的响应时间和减少QoS。此外,此队列大小需要大于任何收到的消息。
在UART配置似乎完好无损时,我找不到接收线状态错误后面的原因。
问候,
汉米德
好的,最后我已经设法做了它的工作。
谢谢很多Jon