你好,
我试图同时使用UART和BLE。对于我的项目来说,Codeless和DSPS是不适用的,不可能做足够的修改。因此,我决定将示例项目中演示的UART功能与ble_app_peripheral示例结合使用。
也就是说,在导入一些必需的库和在ble示例中启用dma模式之后;我遵循了这个过程:
- 在订阅adc值1时,我想开始每5秒读取数据。
void user_svc1_adc_val_1_cfg_ind_handler(ke_msg_id_t const msgid, struct custs1_val_write_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id){//当中心订阅时生成指示if (param->value[0]){printf_string(UART2," the user has subscribe to ADC characteristic!\n\r");SendRecSM_op ();} }
- 我试着用不同的interupt模式:
ke_msg_id_t timer_used_SendRec_SM __SECTION_ZERO( “retention_mem_area0”);// @保持存储器uart_t * UART = UART2;const int的READ_CHAR_COUNT = 5;静态炭buffer_BLE [READ_CHAR_COUNT + 1];挥发性布尔uart_receive_finished = FALSE;挥发性uint16_t data_received_cnt = 0;//函数定义空隙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_read_byte()”.
在接收中断的情况下,我用的是说计时器。但是,该程序只运行一次。换句话说,它只能打印“检查缓冲区!”也不管我还能做什么,一切都将冻结。
- 如果我坚持原来的代码和使用“虽然(! receive_uart_finished);“程序会因为同一行代码而崩溃。
我想知道,我能做些什么来解决这些问题?有什么我没有为UART配置的吗?还有更好的方法吗?(除了使用无代码或dsps,因为它们似乎很难修改)
关键词:
设备:

嗨hamiddhosseini,
你能说明一下你的目标是什么吗?如果我理解正确,您只需要通过UART打印消息?我的理解正确吗?你是否尝试使用arch_prntf() API打印你的日期?
你用的是哪个BLE例子?请注意,如果您正在使用任何可用的睡眠模式,所有外设域都已关闭(包括UART)。这意味着您不能在睡眠模式下有任何UART活动。
谢谢,PM_Dialog
我有同样的问题,并定义了arch_ SLEEP_ OFF。
在SDK6.0.12 DA14585 ble_app_peripheral。
你好,
感谢您的回复,我的工作基于BLE_APP_PERIPHERAL的例子,我试图在这个例子中添加通过UART发送和接收数据。
现在,我已经解决了这个问题。现在我知道在这个例子中使用阻塞模式是不可能的。然而,我在写中断和直接存储器存取模式的回调时犯了一个小错误。
你是怎么解决这个问题的?
所以,我的问题是与app_easy_timer。我忘了再次调用这个函数的回调中。因此,这将只运行一次。如果你认为你有同样的问题,你可以检查的SDK中使用这个函数的例子之一。
你好呀,
我建议使用最新的SDK版本,即SDK6.0.14。你能说明一下你的目标是什么吗?这样我才能知道我该怎么帮你。
谢谢,PM_Dialog
谢谢,我的问题现在解决了。我不知道问题的哪一部分对你来说是模糊的,如果有什么需要澄清的,请让我知道。
非常感谢您的回复。我会尝试这个方法。