TA的每日心情 | 衰 2016-5-6 08:34 |
---|
签到天数: 539 天 连续签到: 1 天 [LV.9]以坛为家II
|
楼主 |
发表于 2014-9-25 21:44:03
|
显示全部楼层
wan112127391 发表于 2014-9-25 19:45
您好,请问下,代码里是蓝牙如何知道rx有数据且数据长度的啊?且TX何时发完数据了啊?谢谢! ...
主机串口接接收到的数据需要以'\n'结尾,在串口中断函数调用到这个函数
主机调用的发送函数
//p_ble_nus_c:保存的连接数据就是句柄及其他的
//str:指向数据
//len:长度
void tx_send(ble_nus_c_t * p_ble_nus_c,char *str ,unsigned char len){
tx_message_t * p_msg;
if (len > WRITE_MESSAGE_LENGTH) {
return ;
}
//m_tx_buffer是一个发送队列,
p_msg = &m_tx_buffer[m_tx_insert_index++];
m_tx_insert_index &= TX_BUFFER_MASK;
//拷贝函数
strncpy( p_msg->req.write_req.gattc_value,str,len);
//句柄
p_msg->req.write_req.gattc_params.handle = p_ble_nus_c->nus_tx_handle;
//数据长度
p_msg->req.write_req.gattc_params.len = len;
//指向数据的地址
p_msg->req.write_req.gattc_params.p_value = p_msg->req.write_req.gattc_value;
//这个是偏移,,
p_msg->req.write_req.gattc_params.offset = 0;
//写回复,要求接收端需要接受到数据后返回
p_msg->req.write_req.gattc_params.write_op = BLE_GATT_OP_WRITE_REQ;
/连接句柄
p_msg->conn_handle = p_ble_nus_c->conn_handle;
//不是协议的东西,就是为了一个判断而已
p_msg->type = WRITE_REQ;
tx_buffer_process();
}
跳到tx_buffer_process函数,发现就调用sd_ble_gattc_write这个函数,
发送的数据有限制,长度应该是直接跟着数据发过去的,这个是nrf的库函数帮你做好了的,你就需要判断事件类型,如果事件是通知等数据操作的,就就直接获取长度及数据的指针,读出来就好了。
主机----->>>>>>>>>从机 用的是BLE_GATT_OP_WRITE_REQ这个操作
主机<<<<<------------从机用的是BLE_GATTC_EVT_HVX,你在主机的代码搜索一下就会发现,这两个的后面执行的就是从串口写读数据
|
|