你好,
我正在尝试将UART与BLE并行使用。就我的项目而言,无代码和DSP不适用,不可能进行充分的修改。因此,我决定将示例项目中演示的UART功能与ble\u app\u外围示例结合使用。
也就是说,在导入一些所需的库并在ble示例中启用dma模式之后,我遵循以下过程:
- 订阅adc值1后,我希望每5秒读取一次数据。
void user \u svc1 \u adc \u val \u 1 \u cfg \u ind \u handler(ke \u msg \u id \u t const msgid,struct custs1 \u val \u write \u ind const*param,ke \u task \u id \u const dest \u id,ke \u task \u id \u const src \u id){//如果(param->value[0]){printf u string(UART2),“用户已订阅adc特征,则在中央订阅时生成指示!”!\n\r“;SendRecSM_op();}}
- I tried using different interupt modes:
ke_msg_id_t timer_used_SendRec_SM __SECTION_ZERO(“retention_mem_area0"); //@RETENTION MEMORY uart_t * uart = UART2; const int READ_CHAR_COUNT = 5; static char buffer_BLE[READ_CHAR_COUNT + 1]; volatile bool uart_receive_finished = false; volatile uint16_t data_received_cnt = 0; //Function Definitions void SendRecSM_op() { //blocking_receive_uart(); intr_receive_uart(); //dma_receive_uart(); app_easy_timer(500,uart_chk_buffer_cb); } static void uart_receive_cb(uint16_t length){ data_received_cnt = length; uart_receive_finished = true; } void dma_receive_uart(){ uart_receive_finished = false; data_received_cnt = 0; uart_register_rx_cb(uart, uart_receive_cb); //Time to ask for data! uart_receive(uart, (uint8_t *)buffer_BLE, READ_CHAR_COUNT, UART_OP_DMA); } void uart_chk_buffer_cb() { arch_printf("\n\rChecking the buffer!\n\r"); if (uart_receive_finished){ buffer_BLE[READ_CHAR_COUNT] = 0; // make it a null terminated string printf_string(uart,buffer_BLE); } } void intr_receive_uart(){ uart_receive_finished = false; data_received_cnt = 0; uart_register_rx_cb(uart, uart_receive_cb); //Time to ask for data! arch_printf("UART is in Interrupt mode!\n\r"); arch_printf("Please input the data!"); uart_receive(uart, (uint8_t *)buffer_BLE, READ_CHAR_COUNT, UART_OP_INTR); } void blocking_receive_uart(){ printf_string(uart,"UART is in Blocking mode!\n\r"); printf_string(uart,"Please input the data!"); uart_receive(uart, (uint8_t *)buffer_BLE, READ_CHAR_COUNT, UART_OP_BLOCKING); buffer_BLE[READ_CHAR_COUNT] = 0; // make it a null terminated string printf_string(uart,buffer_BLE); }
在阻止接收的情况下,我没有使用计时器。但是,如果我不立即输入数据,程序会因为“而(!uart_data_ready_getf(uart_id));“命令输入“uart读取字节()”.
In case of interrupted receives, I use the said timer. However, the program runs only once. In other words, it only prints“正在检查缓冲区!”and regardless of what I would do, everything would freeze.
- 如果我坚持使用原始代码“而(!接收(已完成);“程序将由于同一行代码而崩溃。
我想知道,我能做些什么来解决这些问题?有没有我没有为UART配置的东西?有没有更好的办法?(除了使用无代码或DSP之外,因为它们似乎很难修改)
关键词:
设备:
你好,哈米德霍塞尼,
你能澄清一下你想达到什么目的吗?如果我理解正确,您只需要通过UART打印消息?我的理解正确吗?您是否尝试使用arch\u prntf()API打印日期?
你用哪一个例子?请注意,如果您使用任何可用的睡眠模式,所有外设域都将关闭(包括UART)。这意味着您在睡眠模式下不能有任何UART活动。
谢谢,下午好
我也有同样的问题,我已经定义了arch\ SLEEP\ OFF。
在DA14585、SDK6.0.12、ble\ U app\ U外设中。
你好,
感谢您的回复,我的工作是基于BLE\u APP\u外围示例的,我也尝试在这个示例中添加通过UART发送和接收数据。
现在,我已经设法解决了这个问题。现在我明白在这个例子中使用阻塞模式是不可能的。但是,我在编写中断和dma模式的回调时犯了一个小错误。
你是怎么解决这个问题的?
所以,我的问题是app_easy_timer. I had forgotten to call this function again inside the callback. Therefore, it would only run once. If you think you have the same problem, you can check one of the examples of using this function in the SDK.
Hi There,
我建议使用最新的SDK版本SDK6.0.14。你能澄清一下你的目标是什么吗?这样我就可以理解我能如何帮助你了?
谢谢,下午好
谢谢,我的问题现在解决了。我不知道问题的哪一部分对你来说是含糊不清的,如果有什么需要澄清的,请告诉我。
Thank you very much for your reply. I will try this method.