




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
nrf5182 主机 串口代码讲解,跟官方的串口代码配套使用工程文件nrf51822Boardnrf6310s120experimentalble_app_uart_carm配套的uart的串口从机是nrf51822Boardpca10001s110experimentalble_app_uart1、首先添加16位的uuid号,重新宏定义如下点击(此处)折叠或打开1. #define BLE_UUID_NUS_SERVICE 0x0001 /* The UUID of the Nordic UART Service. */2. #define BLE_UUID_NUS_TX_C_CHARACTERISTIC 0x0003 /*主机的TX 特性 对应于从机的RX特性*/3. #define BLE_UUID_NUS_RX_C_CHARACTERISTIC 0x0002 /*主机的RX 特性.*/4.5. #define BLE_NUS_MAX_DATA_LEN(GATT_MTU_SIZE_DEFAULT-3)/*最大20字节Maximumlengthofdata(inbytes)that can be transmitted by the Nordic UART service module to the peer.*/6.7. #define BLE_NUS_MAX_RX_CHAR_LEN BLE_NUS_MAX_DATA_LEN /*等价于接收长度Maximumlengthofthe RX Characteristic(inbytes).*/8. #define BLE_NUS_MAX_TX_CHAR_LEN BLE_NUS_MAX_DATA_LEN /*INTENSET=UART_INTENSET_RXDRDY_Enabledevt_type)8. 9. case BLE_NUS_C_EVT_DISCOVERY_COMPLETE:10. APPL_LOG(APP: 发现了从机,进行绑定,及允许服务器发送通知rn);11. /发现了串口的从机,进行绑定12. / Initiate bonding.13. err_code=dm_security_setup_req(&m_dm_device_handle);14. APP_ERROR_CHECK(err_code);15. /使能从机发送通知事件16. err_code=ble_nus_c_tx_notif_enable(p_nus_c);17. APP_ERROR_CHECK(err_code);18.19. break;20.21. case BLE_NUS_C_EVT_TX_NOTIFICATION:22. 23. char hr_as_stringLCD_LLEN;24. /接收到了通知事件,直接打印下来25. APPL_LOG(APP: receive=%s.rn,p_nus_c_evt-params.tx.tx_value);26. break;27. 28. default:29. break;30. 31. ble_nus_c_init函数主要是添加了一个自定义的uuid基数,并把服务的16位uuid号的回调函数注册到了发现模块,当系统运行扫描后,当发现模块发现这个uuid后,会调用这个回调函数1. /*2. *brief s120 串口初始化3. *4. */5. uint32_t ble_nus_c_init(ble_nus_c_t*p_ble_nus_c,ble_nus_c_init_t*p_ble_nus_c_init)6.7. uint32_t err_code;8. if(p_ble_nus_c=NULL)|(p_ble_nus_c_init=NULL)9. 10. return NRF_ERROR_NULL;11. 12. /增加一个自定义的蓝牙uuid基数,13. ble_uuid128_t nus_base_uuid=0x9E,0xCA,0xDC,0x24,0x0E,0xE5,0xA9,0xE0,14. 0x93,0xF3,0xA3,0xB5,0x00,0x00,0x40,0x6E;15.16. mp_ble_nus_c=p_ble_nus_c;17.18. err_code=sd_ble_uuid_vs_add(&nus_base_uuid,&mp_ble_nus_c-nus_uuid.type);19. if(err_code!=NRF_SUCCESS)20. 21. return err_code;22. 23. /设置服务的16位uuid,配合前面加的蓝牙uuid基数,组成一组完整128位的uuid号24. mp_ble_nus_c-nus_uuid.uuid=BLE_UUID_NUS_SERVICE;25.26.27. mp_ble_nus_c-evt_handler=p_ble_nus_c_init-evt_handler;28. /设置服务连接句柄为:无效29. mp_ble_nus_c-conn_handle=BLE_CONN_HANDLE_INVALID;30. /设置特性的句柄为无效31. mp_ble_nus_c-nus_rx_handle =BLE_GATT_HANDLE_INVALID;32. mp_ble_nus_c-nus_tx_handle =BLE_GATT_HANDLE_INVALID;33. /设置接收的描述符句柄为:无效34. mp_ble_nus_c-nus_rx_cccd_handle=BLE_GATT_HANDLE_INVALID;35. mp_ble_nus_c-nus_tx_cccd_handle=BLE_GATT_HANDLE_INVALID;36. /注册服务的uuid,及其回调函数,37. /当发现模块发送有该uuid,就会调用db_discover_evt_handler38. return ble_db_discovery_register(&mp_ble_nus_c-nus_uuid,39. db_discover_evt_handler);40. 1. /当这个服务 的uuid号被发现,那么这个函数就被调用2. static void db_discover_evt_handler(ble_db_discovery_evt_t*p_evt)3. /检查uuid号和类型是不是一致4. if(p_evt-evt_type=BLE_DB_DISCOVERY_COMPLETE5. &6. p_evt-params.discovered_db.srv_uuid.uuid=mp_ble_nus_c-nus_uuid.uuid7. &8. p_evt-params.discovered_db.srv_uuid.type=mp_ble_nus_c-nus_uuid.type)9. 10. /获取属性句柄11. LOG(NUS_C: 服务被发现,获得了连接句柄rn);12. mp_ble_nus_c-conn_handle=p_evt-conn_handle;13.14. / Find the CCCD Handleofthe Heart Rate Measurement characteristic.15. uint8_t i;16.17. for(i=0;iparams.discovered_db.char_count;i+)18. 19. /检查特性的uuid号是不是一致20. if(p_evt-params.discovered_db.charateristicsi.characteristic.uuid.uuid21. =22. BLE_UUID_NUS_RX_C_CHARACTERISTIC)23. 24.25. / characteristic.Store CCCD handleandbreak.26.27. /rx的描述符句柄28. mp_ble_nus_c-nus_rx_cccd_handle=29. p_evt-params.discovered_db.charateristicsi.cccd_handle;30. /rx的句柄31. mp_ble_nus_c-nus_rx_handle=32. p_evt-params.discovered_db.charateristicsi.characteristic.handle_value;33. LOG(NUS_C: RX 特性被发现,nus_rx_cccd_handle = %d nus_rx_handle =%drn,mp_ble_nus_c-nus_rx_cccd_handle,mp_ble_nus_c-nus_rx_handle);34.35. elseif(p_evt-params.discovered_db.charateristicsi.characteristic.uuid.uuid36. =37. BLE_UUID_NUS_TX_C_CHARACTERISTIC)38. 39.40. / Found Heart Rate characteristic.Store CCCD handleandbreak.41. mp_ble_nus_c-nus_tx_cccd_handle=42. p_evt-params.discovered_db.charateristicsi.cccd_handle;43. mp_ble_nus_c-nus_tx_handle=44. p_evt-params.discovered_db.charateristicsi.characteristic.handle_value;45. LOG(NUS_C: TX 特性被发现,nus_tx_cccd_handle = %d nus_tx_handle =%drn,mp_ble_nus_c-nus_tx_cccd_handle,mp_ble_nus_c-nus_tx_handle);46. else47. LOG(NUS_C:有其他的特性rn);48. 49.50.51. 52.53. ble_nus_c_evt_t evt;54.55. evt.evt_type=BLE_NUS_C_EVT_DISCOVERY_COMPLETE;56. /运行main文件注册的回调函数,nus_c_evt_handler57. mp_ble_nus_c-evt_handler(mp_ble_nus_c,&evt);58. 59. 上面就是初始化做的所有事,接下来分析事件,每发生一个事件都会调用其回调函数,看一下蓝牙协议栈初始化,主要有ble_evt_dispatch,sys_evt_dispatch两个回调函数,主要讲解ble_evt_dispatch1. static void ble_stack_init(void)2. 3. uint32_t err_code;4.5. / Initialize the SoftDevice handler module.6. SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_XTAL_20_PPM,false);7.8. / Register with the SoftDevice handler moduleforBLE events.9. err_code=softdevice_ble_evt_handler_set(ble_evt_dispatch);10. APP_ERROR_CHECK(err_code);11.12. / Register with the SoftDevice handler moduleforSystem events.13. err_code=softdevice_sys_evt_handler_set(sys_evt_dispatch);14. APP_ERROR_CHECK(err_code);15. ble_evt_dispatch:把事件分派给各个模块处理,自己主要需要编写的ble_nus_c_on_ble_evt,及on_ble_evt1. static void ble_evt_dispatch(ble_evt_t * p_ble_evt)2. 3.4. app_trace_log(evt_id = %xrn,p_ble_evt-header.evt_id);5. dm_ble_evt_handler(p_ble_evt);/管理模块的处理6. ble_db_discovery_on_ble_evt(&m_ble_db_discovery,p_ble_evt);/发现模块的处理7. ble_nus_c_on_ble_evt(&m_ble_nus_c,p_ble_evt);/nus的处理8. on_ble_evt(p_ble_evt);/main的处理:广播包处理-进行连接9. 看一下main函数中的on_ble_evt,1. /*brief Function for handling the Applications BLE Stack events.这里主要处理的广播包2. *3. *paraminp_ble_evt Bluetooth stack event.,4. */5. static void on_ble_evt(ble_evt_t*p_ble_evt)6. 7. uint32_t err_code;8. ble_uuid_t peer_uuid;9. constble_gap_evt_t*p_gap_evt=&p_ble_evt-evt.gap_evt;10. app_trace_log(on_ble_evtrn);11. switch(p_ble_evt-header.evt_id)12. 13. /发现了一个广播包14. caseBLE_GAP_EVT_ADV_REPORT:15. 16. data_t adv_data;17. data_t type_data;18.19. /Initialize advertisement reportforparsing.20. /首先是要从广播包解析出数据21. adv_data.p_data=(uint8_t*)p_gap_evt-params.adv_report.data;22. adv_data.data_len=p_gap_evt-params.adv_report.dlen;23. /获得完整的128bit,uuid号24. err_code=adv_report_parse(BLE_GAP_AD_TYPE_128BIT_SERVICE_UUID_COMPLETE,25. &adv_data,26. &type_data);27.28. /Verifyifshortorcomplete name matches target.29. if(err_code=NRF_SUCCESS)30. /对uuid进行换算:128bit换算成一个16bit及其类型,31. err_code=sd_ble_uuid_decode(type_data.data_len,type_data.p_data,&peer_uuid);32. if(err_code=NRF_SUCCESS)33. if(peer_uuid.uuid=m_ble_nus_c.nus_uuid.uuid)&peer_uuid.type=m_ble_nus_c.nus_uuid.type)34. /发现了从机的,停止广播并尝试连接35. err_code=sd_ble_gap_scan_stop();36. if(err_code!=NRF_SUCCESS)37. APPL_LOG(APPL: Scan stop failed, reason %drn,err_code);38. 39. nrf_gpio_pin_clear(SCAN_LED_PIN_NO);40. err_code=sd_ble_gap_connect(&p_gap_evt-params.adv_report.41. peer_addr,42. &m_scan_param,43. &m_connection_param);44.45. if(err_code!=NRF_SUCCESS)46. 47. APPL_LOG(APPL: Connection Request Failed, reason %drn,err_code);48. else49. APPL_LOG(连接建立rn);50. 51. break;52.53. else54. APPL_LOG(匹配出错rn);55. 56.57. 58. 59. break;60. 61. 以下省略,直接拷贝官方的处理方式看一下nus模块的处理1. void ble_nus_c_on_ble_evt(ble_nus_c_t * p_ble_nus_c, const ble_evt_t * p_ble_evt) 2. ble_uuid_t server_uuid;3. uint32_t err_code;4.5. if(p_ble_nus_c=NULL)|(p_ble_evt=NULL)6. return;7. 8. switch(p_ble_evt-header.evt_id)9. 10. case BLE_GAP_EVT_CONNECTED:11. /连接完成,获取连接句柄12. p_ble_nus_c-conn_handle=p_ble_evt-evt.gap_evt.conn_handle;13. LOG(NUS_C:BLE_GAP_EVT_CONNECTED ,conn_handle = %drn,p_ble_nus_c-conn_handle);14. break;15.16. case BLE_GATTC_EVT_HVX:17. /通知事件18. LOG(NUS_C:BLE_GATTC_EVT_HVXrn);19. on_hvx(p_ble_nus_c,p_ble_evt);20. break;21.22. case BLE_GATTC_EVT_WRITE_RSP:23. LOG(NUS_C:BLE_GATTC_EVT_WRITE_RSPrn);24. /客户端发送写请求给服务器,服务器会回一个应答信号给客户端。这时客户端可以发送下一条写请求给服务器端。25. /属性协议规定:写请求需要在前一条请求接收到应答后才能继续26. /添加的原因:猜测:发送写请求是通过一个队列的,如果发送失败,那么就会有一个未发送的在队列里,27. /如果这时在发送一个写请求,那么发送将会是前一条写请求,而后收到应答后会继续发送写请求,28.29. on_write_rsp(p_ble_nus_c,p_ble_evt);30. break;31.32. default:33. break;34. 35. 通知事件处理:1. /通知事件的处理方式2. static void on_hvx(ble_nus_c_t*p_ble_nus_c,const ble_evt_t*p_ble_evt)3. 4. / Checkifthisis a heart rate notification.5. /检查是不是tx的句柄6. if(p_ble_evt-evt.gattc_evt.params.hvx.handle=p_ble_nus_c-nus_tx_handle)7. 8. ble_nus_c_evt_t ble_nus_c_evt;9. uint8_t index=0;10. /设置成BLE_NUS_C_EVT_TX_NOTIFICATION11. ble_nus_c_evt.evt_type=BLE_NUS_C_EVT_TX_NOTIFICATION;12. strncpy(ble_nus_c_evt.params.tx.tx_value,p_ble_evt-evt.gattc_evt.params.hvx.data,p_ble_evt-evt.gattc_evt.params.hvx.len);13. ble_nus_c_evt.params.tx.tx_len=p_ble_evt-evt.gattc_evt.params.hvx.len;14. /调用main函数注册的回调函数nus_c_evt_handler15. p_ble_nus_c-evt_handler(p_ble_nus_c,&ble_nus_c_evt);16. 17. 对于写应答,主要是继续发送下一条请求(如果有的话),接下来讲解一下客户端怎么发送数据到服务器,串口中断程序点击(此处)折叠或打开1. void UART0_IRQHandler(void)2. 3. static uint8_t data_arrayBLE_NUS_MAX_DATA_LEN;4. static uint8_t index=0;5. uint32_t err_code;6.7. /*snippetHandling the data received over UART*/8.9. data_arrayindex=simple_uart_get();10. index+;11.12. if(data_arrayindex-1=n)|(index=(BLE_NUS_MAX_DATA_LEN-1)13. 14. /发送数据到服务器15. tx_send(&m_ble_nus_c,data_array,index);16. index=0;17. 18.19. /*snippetHandling the data received over UART*/20. 点击(此处)折叠或打开1. void tx_send(ble_nus_c_t * p_ble_nus_c,char *str ,unsigned char len)2.3. tx_message_t*p_msg;4. if(lenWRITE_MESSAGE_LENGTH)5. return;6. 7.8. /发送队列9. p_msg=&m_tx_bufferm_tx_insert_index+;10. m_tx_insert_index &=TX_BUFFER_MASK;11. strncpy(p_msg-req.write_req.gattc_value,str,len);12. /属性句柄13. p_msg-req.write_r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辅警调解业务知识培训课件
- 中国银行2025六盘水市秋招面试典型题目及参考答案
- 交通银行2025武汉市笔试英文行测高频题含答案
- 中国银行2025保山市结构化面试15问及话术
- 2025年3D打印技术的个性化定制优势
- 2025海洋塑料污染的源头控制
- 2025行业数字化转型挑战与对策-1
- 2025应急管理行业创新发展报告
- 邮储银行2025黄山市秋招半结构化面试题库及参考答案
- 交通银行2025威海市数据分析师笔试题及答案
- 2025年公共营养师三级考试试卷及答案
- 开工前安全培训教学课件
- 高铁隧道配套施工方案
- 三人合伙工程合同协议书
- 2025曲靖市事业单位定向招聘驻曲部队未就业随军家属(8人)备考练习试题及答案解析
- 包子铺合伙开店协议合同
- 2025广西现代物流集团第三次招聘109人笔试备考题库及答案解析
- 轴承装配工标准化作业考核试卷及答案
- 入住敬老院协议合同模板
- 英语教学发音课件下载
- 2025年特种设备检验人员资格考试(压力管道检验师GDS)历年参考题库含答案详解(5套)
评论
0/150
提交评论