根据以下api和数据结构写出一个将adc转换出来的数据通过GATT发给手机端的代码void ble_controller_init(uint8_t task_priority) int hci_driver_init(void) int bt_enable(bt_ready_cb_t cb)int bt_le_adv_start(const struct bt_le_adv_param *param,const struct bt_data *ad, size_t ad_len, const struct bt_data *sd, size_t sd_len)int bt_le_adv_update_data(const struct bt_data *ad, size_t ad_len,const struct bt_data *sd, size_t sd_len)int bt_le_adv_stop(void)int bt_le_scan_start(const struct bt_le_scan_param *param, bt_le_scan_cb_t cb)int bt_le_scan_stop(void)int bt_le_whitelist_add(const bt_addr_le_t *addr)int bt_le_whitelist_rem(const bt_addr_le_t *addr)int bt_le_whitelist_clear(void)int bt_le_set_chan_map(u8_t chan_map[5])int bt_unpair(u8_t id, const bt_addr_le_t *addr)int bt_conn_get_info(const struct bt_conn *conn, struct bt_conn_info *info)int bt_conn_get_remote_dev_info(struct bt_conn_info *info)int bt_conn_le_param_update(struct bt_conn *conn,const struct bt_le_conn_param *param)int bt_conn_disconnect(struct bt_conn *conn, u8_t reason)struct bt_conn *bt_conn_create_le(const bt_addr_le_t *peer,const struct bt_le_conn_param *param)int bt_conn_create_auto_le(const struct bt_le_conn_param *param)int bt_conn_create_auto_stop(void)int bt_le_set_auto_conn(const bt_addr_le_t *addr,const struct bt_le_conn_param *param)struct bt_conn *bt_conn_create_slave_le(const bt_addr_le_t *peer,const struct bt_le_adv_param *param)int bt_conn_set_security(struct bt_conn *conn, bt_security_t sec)bt_security_t bt_conn_get_security(struct bt_conn *conn)u8_t bt_conn_enc_key_size(struct bt_conn *conn)void bt_conn_cb_register(struct bt_conn_cb *cb)void bt_set_bondable(bool enable)int bt_conn_auth_cb_register(const struct bt_conn_auth_cb *cb)int bt_conn_auth_passkey_entry(struct bt_conn *conn, unsigned int passkey)int bt_conn_auth_cancel(struct bt_conn *conn)int bt_conn_auth_passkey_confirm(struct bt_conn *conn)int bt_conn_auth_pincode_entry(struct bt_conn *conn, const char *pin)int bt_le_read_rssi(u16_t handle,int8_t *rssi)int bt_get_local_address(bt_addr_le_t *adv_addr)int bt_set_tx_pwr(int8_t power)bt_le_adv_parambt_databt_le_scan_parambt_le_conn_parambt_conn,并加入已经写好的adc代码bflb_adc_init(adc, &cfg); bflb_adc_channel_config(adc, chan, TEST_ADC_CHANNEL); for (uint32_t i = 0; i < 10; i++) { bflb_adc_start_conversion(adc); struct bflb_adc_result_s result; uint32_t raw_data = bflb_adc_read_raw(adc); bflb_adc_parse_result(adc, &raw_data, &result, 1); printf("pos chan %d,%d mv \r\n", result.pos_chan, result.millivolt); // char data[20]; // sprintf(data,"ADC result:%d",result.millivolt); // if(conn){ // bt_gatt_notify(conn,&attrs[1],data,sizeof(data)); // } bflb_mtimer_delay_ms(250); }

时间: 2023-06-27 13:03:13 浏览: 144
这段代码需要补充一些信息才能完整地实现将adc转换出来的数据通过GATT发给手机端的功能。以下是可能需要补充的信息: - GATT服务的UUID和特征的UUID - GATT服务和特征的定义和初始化 - 连接的回调函数 - 连接对象的定义和初始化 假设以上信息已经准备好了,那么可以根据以下步骤完成代码的编写: 1. 在ble_controller_init函数中初始化GATT服务和特征,并注册连接的回调函数。 2. 在adc转换完成后,将结果存储到一个变量中。 3. 在连接回调函数中,当有连接建立时,获取连接对象,并在连接对象有效的情况下,通过bt_gatt_notify函数将adc结果发送出去。 以下是可能需要补充的代码: ```c #define ADC_GATT_SERVICE_UUID BT_UUID_DECLARE_16(0x1234) #define ADC_GATT_CHAR_UUID BT_UUID_DECLARE_16(0x5678) static struct bt_conn *current_conn; static struct bt_gatt_attr attrs[] = { BT_GATT_PRIMARY_SERVICE(ADC_GATT_SERVICE_UUID), BT_GATT_CHARACTERISTIC(ADC_GATT_CHAR_UUID, BT_GATT_CHRC_NOTIFY, BT_GATT_PERM_NONE, NULL, NULL, NULL), BT_GATT_CCC(NULL, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), }; static void connected(struct bt_conn *conn, u8_t err) { if (err) { return; } current_conn = bt_conn_ref(conn); } static void disconnected(struct bt_conn *conn, u8_t reason) { if (current_conn == conn) { bt_conn_unref(current_conn); current_conn = NULL; } } static struct bt_conn_cb conn_callbacks = { .connected = connected, .disconnected = disconnected, }; void ble_controller_init(uint8_t task_priority) { int err; err = bt_gatt_service_register(attrs, ARRAY_SIZE(attrs)); if (err) { return; } bt_conn_cb_register(&conn_callbacks); bt_enable(NULL); bt_le_adv_start(...); } void adc_to_gatt(void) { int adc = 0; // assume adc result is stored in this variable char data[20]; sprintf(data, "ADC result: %d", adc); if (current_conn) { bt_gatt_notify(current_conn, &attrs[1], data, sizeof(data)); } } ```

相关推荐

#define DEVICE_NAME "BL618_GATT" // 设备名称 #define PROFILE_NUM 1 // 设备支持的服务数量 #define PROFILE_A_APP_ID 0 // 第一个服务的ID static void gap_event_handler(ble_event_t *event); static void gatt_event_handler(ble_event_t *event); int main(void) { // 初始化蓝牙协议栈 bluetooth_init(gap_event_handler, gatt_event_handler); // 设置设备名称 bluetooth_set_device_name(DEVICE_NAME); // 创建一个服务 bluetooth_gatt_create_service(PROFILE_NUM); // 添加服务的特征值 bluetooth_gatt_add_char(PROFILE_A_APP_ID, "CHAR_A", 0xFF01, 0x20, NULL); // 开始广播 bluetooth_start_advertising(); while (1) { // 等待事件 bluetooth_wait_for_event(); } return 0; } static void gap_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GAP_EVENT_ADV_IND: { // 收到广播包,可以连接该设备 ble_gap_connect(&event->gap_event.adv_ind.address); break; } case BLE_GAP_EVENT_CONNECTED: { // 连接成功,可以开始 GATT 操作 break; } case BLE_GAP_EVENT_DISCONNECTED: { // 断开连接,重新开始广播 bluetooth_start_advertising(); break; } default: break; } } static void gatt_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GATT_EVENT_READ: { // 处理读操作 break; } case BLE_GATT_EVENT_WRITE: { // 处理写操作 ble_err_t err = ble_gatt_server_send_indication(event->conn_handle, 0x1234, raw_data, sizeof(raw_data)); // 发送通知给主机 if (err != BLE_ERR_NONE) { // 发送失败,需要处理错误 break; } break; } default: break; } }给出无注释代码

#define DEVICE_NAME "BL618_GATT" // 设备名称 #define PROFILE_NUM 1 // 设备支持的服务数量 #define PROFILE_A_APP_ID 0 // 第一个服务的ID static void gap_event_handler(ble_event_t *event) { // 处理 GAP 事件 } static void gatt_event_handler(ble_event_t *event) { // 处理 GATT 事件 } int main(void) { // 初始化蓝牙协议栈 bluetooth_init(gap_event_handler, gatt_event_handler); // 设置设备名称 bluetooth_set_device_name(DEVICE_NAME); // 创建一个服务 bluetooth_gatt_create_service(PROFILE_NUM); // 添加服务的特征值 bluetooth_gatt_add_char(PROFILE_A_APP_ID, "CHAR_A", 0xFF01, 0x20, NULL); // 开始广播 bluetooth_start_advertising(); while (1) { // 等待事件 bluetooth_wait_for_event(); } return 0; static void gap_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GAP_EVENT_ADV_IND: { // 收到广播包,可以连接该设备 ble_gap_connect(&event->gap_event.adv_ind.address); break; } case BLE_GAP_EVENT_CONNECTED: { // 连接成功,可以开始 GATT 操作 break; } case BLE_GAP_EVENT_DISCONNECTED: { // 断开连接,重新开始广播 bluetooth_start_advertising(); break; } default: break; } } static void gatt_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GATT_EVENT_READ: { // 处理读操作 break; } case BLE_GATT_EVENT_WRITE: { // 处理写操作 ble_gatt_server_send_indication(event->conn_handle, 0x1234, raw_data, sizeof(raw_data)); // 发送通知给主机 break; } default: break; } } } }优化

对以下代码进行注释并给出可复制代码static void ble_tp_notify_task(void *pvParameters) { int err = -1; char data[244] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; while(1) { err = bt_gatt_notify(ble_tp_conn, get_attr(BT_CHAR_BLE_TP_NOT_ATTR_VAL_INDEX), data, (tx_mtu_size - 3)); BT_WARN("ble tp send notify : %d", err); } } static void ble_tp_not_ccc_changed(const struct bt_gatt_attr attr, u16_t value) { int err; BT_WARN("ccc:value=[%d]",value); if(tp_start) { if(value == BT_GATT_CCC_NOTIFY) { if(xTaskCreate(ble_tp_notify_task, (char)"bletp", 256, NULL, TP_PRIO, &ble_tp_task_h) == pdPASS) { created_tp_task = 1; BT_WARN("Create throughput tx task success."); } else { created_tp_task = 0; BT_WARN("Create throughput tx task fail."); } } else { if(created_tp_task) { BT_WARN("Delete throughput tx task."); vTaskDelete(ble_tp_task_h); created_tp_task = 0; } } } else { if(created_tp_task) { BT_WARN("Delete throughput tx task."); vTaskDelete(ble_tp_task_h); created_tp_task = 0; } if(value == BT_GATT_CCC_NOTIFY) { err = bt_gatt_notify(ble_tp_conn, get_attr(BT_CHAR_BLE_TP_NOT_ATTR_VAL_INDEX), "notify", strlen("notify")); BT_WARN("ble tp send indatcate: %d", err); } } } static struct bt_gatt_attr attrs[]= { BT_GATT_PRIMARY_SERVICE(BT_UUID_SVC_BLE_TP), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_RD, BT_GATT_CHRC_READ, BT_GATT_PERM_READ, ble_tp_recv_rd, NULL, NULL), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_WR, BT_GATT_CHRC_WRITE |BT_GATT_CHRC_WRITE_WITHOUT_RESP, BT_GATT_PERM_WRITE|BT_GATT_PERM_PREPARE_WRITE, NULL, ble_tp_recv_wr, NULL), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_IND, BT_GATT_CHRC_INDICATE, 0, NULL, NULL, NULL), BT_GATT_CCC(ble_tp_ind_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE), BT_GATT_CHARACTERISTIC(BT_UUID_CHAR_BLE_TP_NOT, BT_GATT_CHRC_NOTIFY, 0, NULL, NULL, NULL), BT_GATT_CCC(ble_tp_not_ccc_changed, BT_GATT_PERM_READ | BT_GATT_PERM_WRITE) };

以下代码有什么错误static struct bflb_device_s uart0; extern void shell_init_with_task(struct bflb_device_s shell); static int btblecontroller_em_config(void) { extern uint8_t __LD_CONFIG_EM_SEL; volatile uint32_t em_size; em_size = (uint32_t)&__LD_CONFIG_EM_SEL; if (em_size == 0) { GLB_Set_EM_Sel(GLB_WRAM160KB_EM0KB); } else if (em_size == 321024) { GLB_Set_EM_Sel(GLB_WRAM128KB_EM32KB); } else if (em_size == 641024) { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } else { GLB_Set_EM_Sel(GLB_WRAM96KB_EM64KB); } return 0; } void bt_enable_cb(int err) { if (!err) { bt_addr_le_t bt_addr; bt_get_local_public_address(&bt_addr); printf("BD_ADDR:(MSB)%02x:%02x:%02x:%02x:%02x:%02x(LSB) \n", bt_addr.a.val[5], bt_addr.a.val[4], bt_addr.a.val[3], bt_addr.a.val[2], bt_addr.a.val[1], bt_addr.a.val[0]); ble_cli_register(); } } int main(void) { board_init(); configASSERT((configMAX_PRIORITIES > 4)); uart0 = bflb_device_get_by_name("uart0"); shell_init_with_task(uart0); /* set ble controller EM Size / btblecontroller_em_config(); / Init rf */ if (0 != rfparam_init(0, NULL, 0)) { printf("PHY RF init failed!\r\n"); return 0; } // Initialize BLE controller #if defined(BL702) || defined(BL602) ble_controller_init(configMAX_PRIORITIES - 1); #else btble_controller_init(configMAX_PRIORITIES - 1); #endif // Initialize BLE Host stack hci_driver_init(); bt_enable(bt_enable_cb); vTaskStartScheduler();#define DEVICE_NAME "BL618_GATT" #define PROFILE_NUM 1 #define PROFILE_A_APP_ID 0 static void gap_event_handler(ble_event_t *event); static void gatt_event_handler(ble_event_t *event); int main(void) { bluetooth_init(gap_event_handler, gatt_event_handler); bluetooth_set_device_name(DEVICE_NAME); bluetooth_gatt_create_service(PROFILE_NUM); bluetooth_gatt_add_char(PROFILE_A_APP_ID, "CHAR_A", 0xFF01, 0x20, NULL); bluetooth_start_advertising(); while (1) { bluetooth_wait_for_event(); } return 0; } static void gap_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GAP_EVENT_ADV_IND: { ble_gap_connect(&event->gap_event.adv_ind.address); break; } case BLE_GAP_EVENT_CONNECTED: { // 连接成功,可以开始 GATT 操作 break; } case BLE_GAP_EVENT_DISCONNECTED: { // 断开连接,重新开始广播 bluetooth_start_advertising(); break; } default: break; } } static void gatt_event_handler(ble_event_t *event) { switch (event->type) { case BLE_GATT_EVENT_READ: { // 处理读操作 break; } case BLE_GATT_EVENT_WRITE: { ble_err_t err = ble_gatt_server_send_indication(event->conn_handle, 0x1234, raw_data, sizeof(raw_data)); // 发送通知给主机 if (err != BLE_ERR_NONE) { // 发送失败,需要处理错误 break; } break; } default: break; } }

注释以下代码#define TP_PRIO configMAX_PRIORITIES - 5 static void ble_tp_connected(struct bt_conn *conn, u8_t err); static void ble_tp_disconnected(struct bt_conn *conn, u8_t reason); static int bl_tp_send_indicate(struct bt_conn *conn, const struct bt_gatt_attr *attr, const void *data, u16_t len); struct bt_conn *ble_tp_conn; struct bt_gatt_exchange_params exchg_mtu; TaskHandle_t ble_tp_task_h; int tx_mtu_size = 20; u8_t tp_start = 0; static u8_t created_tp_task = 0; static u8_t isRegister = 0; static struct bt_conn_cb ble_tp_conn_callbacks = { .connected = ble_tp_connected, .disconnected = ble_tp_disconnected, }; static void ble_tp_tx_mtu_size(struct bt_conn *conn, u8_t err, struct bt_gatt_exchange_params *params) { if(!err) { tx_mtu_size = bt_gatt_get_mtu(ble_tp_conn); BT_WARN("ble tp echange mtu size success, mtu size: %d", tx_mtu_size); } else { BT_WARN("ble tp echange mtu size failure, err: %d", err); } } static void ble_tp_connected(struct bt_conn *conn, u8_t err) { if(err || conn->type != BT_CONN_TYPE_LE) { return; } int tx_octets = 0x00fb; int tx_time = 0x0848; int ret = -1; BT_INFO("%s",__func__); ble_tp_conn = conn; . ret = bt_le_set_data_len(ble_tp_conn, tx_octets, tx_time); if(!ret) { BT_WARN("ble tp set data length success."); } else { BT_WARN("ble tp set data length failure, err: %d\n", ret); } exchg_mtu.func = ble_tp_tx_mtu_size; ret = bt_gatt_exchange_mtu(ble_tp_conn, &exchg_mtu); if (!ret) { BT_WARN("ble tp exchange mtu size pending."); } else { BT_WARN("ble tp exchange mtu size failure, err: %d", ret); } } static void ble_tp_disconnected(struct bt_conn *conn, u8_t reason) { if(conn->type != BT_CONN_TYPE_LE) { return; } BT_INFO("%s",__func__); ble_tp_conn = NULL; } static int ble_tp_recv_rd(struct bt_conn *conn, const struct bt_gatt_attr *attr, void *buf, u16_t len, u16_t offset) { int size = 9; char data[9] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09}; memcpy(buf, data, size); return size; }

最新推荐

recommend-type

android Ble 蓝牙4.0 GATT 错误代码

"Android Ble 蓝牙4.0 GATT 错误代码详解" ...Android Ble 蓝牙4.0 GATT 错误代码是 Android 蓝牙4.0 设备中一个重要的错误处理机制,通过了解这些错误代码,我们可以更好地开发和维护 Android 蓝牙4.0 设备。
recommend-type

AN_19071701-C1_Telink 8232 BLE SDK Developer Handbook

PHY层负责无线传输,LL层处理连接和数据传输,L2CAP层提供了复用和分片功能,ATT层定义了服务和属性,GATT层构建了服务的结构。开发者可以通过SDK提供的API来操作这些层次,实现BLE设备的功能。 版本历史: 该文档...
recommend-type

linux下接受蓝牙返回的数据(1).docx

在Linux环境下,特别是Ubuntu系统中,接收蓝牙设备发送的数据是一个涉及多步骤的过程,主要依赖于blueman和minicom这两个工具。以下将详细介绍这个过程及其相关的知识点。 首先,`blueman`是一个针对Linux的开源...
recommend-type

计算机系统基石:深度解析与优化秘籍

深入理解计算机系统(原书第2版)是一本备受推崇的计算机科学教材,由卡耐基梅隆大学计算机学院院长,IEEE和ACM双院院士推荐,被全球超过80所顶级大学选作计算机专业教材。该书被誉为“价值超过等重量黄金”的无价资源,其内容涵盖了计算机系统的核心概念,旨在帮助读者从底层操作和体系结构的角度全面掌握计算机工作原理。 本书的特点在于其起点低但覆盖广泛,特别适合大三或大四的本科生,以及已经完成基础课程如组成原理和体系结构的学习者。它不仅提供了对计算机原理、汇编语言和C语言的深入理解,还包含了诸如数字表示错误、代码优化、处理器和存储器系统、编译器的工作机制、安全漏洞预防、链接错误处理以及Unix系统编程等内容,这些都是提升程序员技能和理解计算机系统内部运作的关键。 通过阅读这本书,读者不仅能掌握系统组件的基本工作原理,还能学习到实用的编程技巧,如避免数字表示错误、优化代码以适应现代硬件、理解和利用过程调用、防止缓冲区溢出带来的安全问题,以及解决链接时的常见问题。这些知识对于提升程序的正确性和性能至关重要,使读者具备分析和解决问题的能力,从而在计算机行业中成为具有深厚技术实力的专家。 《深入理解计算机系统(原书第2版)》是一本既能满足理论学习需求,又能提供实践经验指导的经典之作,无论是对在校学生还是职业程序员,都是提升计算机系统知识水平的理想读物。如果你希望深入探究计算机系统的世界,这本书将是你探索之旅的重要伴侣。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

PHP数据库操作实战:手把手教你掌握数据库操作精髓,提升开发效率

![PHP数据库操作实战:手把手教你掌握数据库操作精髓,提升开发效率](https://img-blog.csdn.net/20180928141511915?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzE0NzU5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) # 1. PHP数据库操作基础** PHP数据库操作是使用PHP语言与数据库交互的基础,它允许开发者存储、检索和管理数据。本章将介绍PHP数据库操作的基本概念和操作,为后续章节奠定基础。
recommend-type

vue-worker

Vue Worker是一种利用Web Workers技术的 Vue.js 插件,它允许你在浏览器的后台线程中运行JavaScript代码,而不影响主线程的性能。Vue Worker通常用于处理计算密集型任务、异步I/O操作(如文件读取、网络请求等),或者是那些需要长时间运行但不需要立即响应的任务。 通过Vue Worker,你可以创建一个新的Worker实例,并将Vue实例的数据作为消息发送给它。Worker可以在后台执行这些数据相关的操作,然后返回结果到主页面上,实现了真正的非阻塞用户体验。 Vue Worker插件提供了一个简单的API,让你能够轻松地在Vue组件中管理worker实例
recommend-type

《ThinkingInJava》中文版:经典Java学习宝典

《Thinking in Java》中文版是由知名编程作家Bruce Eckel所著的经典之作,这本书被广泛认为是学习Java编程的必读书籍。作为一本面向对象的编程教程,它不仅适合初学者,也对有一定经验的开发者具有启发性。本书的核心目标不是传授Java平台特定的理论,而是教授Java语言本身,着重于其基本语法、高级特性和最佳实践。 在内容上,《Thinking in Java》涵盖了Java 1.2时期的大部分关键特性,包括Swing GUI框架和新集合类库。作者通过清晰的讲解和大量的代码示例,帮助读者深入理解诸如网络编程、多线程处理、虚拟机性能优化以及与其他非Java代码交互等高级概念。书中提供了320个实用的Java程序,超过15000行代码,这些都是理解和掌握Java语言的宝贵资源。 作为一本获奖作品,Thinking in Java曾荣获1995年的Software Development Jolt Award最佳书籍大奖,体现了其在业界的高度认可。Bruce Eckel不仅是一位经验丰富的编程专家,还是C++领域的权威,他拥有20年的编程经历,曾在世界各地教授对象编程,包括C++和Java。他的著作还包括Thinking in C++,该书同样广受好评。 作者不仅是一位技术导师,还是一位教育家,他善于用易于理解的方式阐述复杂的编程概念,使读者能够领略到编程中的“智慧”。与其他Java教材相比,《Thinking in Java》以其成熟、连贯、严谨的风格,赢得了读者的一致赞誉,被誉为最全面且实例恰当的编程指南,是学习Java过程中不可或缺的参考资料。 此外,本书还提供了配套的CD,包含15小时的语音授课,以及可以从Bruce Eckel的官方网站www.BruceEckel.com免费获取的源码和电子版更新,确保读者能够跟随最新的技术发展保持同步。无论你是Java新手还是进阶者,《Thinking in Java》都是一次深入探索Java世界的重要旅程。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

揭秘PHP文本分析:算法与技术大揭秘,助你深入理解文本处理

![揭秘PHP文本分析:算法与技术大揭秘,助你深入理解文本处理](https://img-blog.csdn.net/20180928170702309?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0pheTUzMTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) # 1. PHP文本分析概述 文本分析是利用计算机技术对文本数据进行处理和分析的过程,旨在从文本中提取有价值的信息和知识。PHP作为一种广泛使用的编程语言,提供了丰富的文本分析功能,包括正则表达式、字符串处理函数