研发之路第六条———与充电板的数据收发(NRF52832筋膜枪研发)

鄙人才疏学浅,如有看不入眼的代码和见解,烦请各位指教。

此筋膜枪方案是搭配了一个充电板制作的,因此我们需要双方进行通信,互发报文以进入休眠或者工作状态。既然需要通信,那么首先想到UART,先看下具体使用的函数。

uart配置

/**@brief Function for initializing the UART. */
static void uart_init(void)
{		
		#if 1
		uint32_t rx_pin , tx_pin;
		rx_pin = RX_PIN_NUMBER;//11
		tx_pin = TX_PIN_NUMBER;//12
		#endif
    ret_code_t err_code;
		
    app_uart_comm_params_t const comm_params =
    {
        .rx_pin_no    = rx_pin,
        .tx_pin_no    = tx_pin,
        .rts_pin_no   = RTS_PIN_NUMBER,
        .cts_pin_no   = CTS_PIN_NUMBER,
        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
        .use_parity   = false,
        .baud_rate    = UART_BAUDRATE_BAUDRATE_Baud115200
    };

    APP_UART_FIFO_INIT(&comm_params,
                       UART_RX_BUF_SIZE,
                       UART_TX_BUF_SIZE,
                       uart_event_handler,
                       APP_IRQ_PRIORITY_LOWEST,
                       err_code);

    APP_ERROR_CHECK(err_code);
	//NRF_LOG_INFO("rx_pin = %d,tx_pin = %d",rx_pin,tx_pin);
}

发送数据

void uart_send(uint8_t *str,uint16_t len)
{
	uint16_t i,counter;
	for(i=0;i<len;i++)
	{
		counter=0;
	    while(NRF_SUCCESS!=app_uart_put(str[i]) && counter++<16000);
	}
}

接收数据

uint32_t app_uart_get(uint8_t * p_byte)
{
    ASSERT(p_byte);
    bool rx_ovf = m_rx_ovf;

    ret_code_t err_code =  app_fifo_get(&m_rx_fifo, p_byte);

    // If FIFO was full new request to receive one byte was not scheduled. Must be done here.
    if (rx_ovf)
    {
        m_rx_ovf = false;
        uint32_t uart_err_code = nrf_drv_uart_rx(&app_uart_inst, rx_buffer, 1);

        // RX resume should never fail.
        APP_ERROR_CHECK(uart_err_code);
    }

    return err_code;
}

因为收发是两条不同的引脚,所以直接按照uart配置即可,如果使用同一条引脚收发,需要考虑GPIO引脚的配置切换,以及数据收发验证延迟,还有收发引起中断处理。

前文也说过,需要一个handler来与之匹配,要想通信,我们这个handler就要收发俱全。

发送

先看发送,没什么好说的(因为要做的处理移出去了,不在中断中处理):

	else if (p_event->evt_type == APP_UART_TX_EMPTY)
	{
		//NRF_LOG_INFO("uart send done\r\n"); 
		mVendor_run_info.wait_send_done = 0;

	}   

一位一位的发出即可,确保不漏发错发。

	if(ck > 0)
	{
		uint16_t i = 0;
		//A5 0D 80 01 00 00 00 00 00 00 00 8C 5A关机
		//NRF_LOG_INFO("hello 001 ck=%d\r\n", ck);
		mVendor_run_info.wait_send_done = 1;
		for(i = 0; i < ck; i++)
		{
			app_uart_put(mVendor_run_info.uart_send[i]);
		}
		//Vendor_debug_printf_hex("U-->", mVendor_run_info.uart_send, ck);
	}

接收

重头戏就是收了,使用这条代码,将收到的包读出来,又因为我们不是只读一个数据,而是要较多数据一起读取,因此每读取一个数据就需要将数据位+1,来读取下一个数据。读取后将数据复制出来,放到我们用于比较处理的函数中。

		//从FIFO中读取数据  
		if(data_cout  >= sizeof(data_buff))
		{
			data_cout = 0;
		}
		
		app_uart_get(&data_buff[data_cout]);//读数据
		data_cout++;

		memset(mVendor_run_info.uart_recv, 0, sizeof(mVendor_run_info.uart_recv));
		memcpy(mVendor_run_info.uart_recv, data_buff, data_cout);
		mVendor_run_info.uart_recv_len = data_cout;
		memset(data_buff, 0, sizeof(data_buff));
		//NRF_LOG_INFO("data_cout = %d",data_cout);
		data_cout = 0;
		
		mVendor_run_info.uart_isrecv = 1;//标志位置1,回主循环判断

研发类型的需求和讨论,如有需要请联系鄙人。公司邮箱:zhongweixiong@kyohoon.com,联系电话:15507589165 钟先生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值