鄙人才疏学浅,如有看不入眼的代码和见解,烦请各位指教。
此筋膜枪方案是搭配了一个充电板制作的,因此我们需要双方进行通信,互发报文以进入休眠或者工作状态。既然需要通信,那么首先想到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 钟先生