[{"data":1,"prerenderedAt":5291},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver":3,"wiki-doc-items-2023-12-30-ros2-tutorial":4870,"wiki:author-members":5279},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":231,"chapterOrder":4858,"date":4859,"description":190,"docKey":4860,"docRoot":4861,"docTitle":4862,"extension":4863,"isWikiDoc":256,"isWikiIndex":4864,"meta":4865,"navigation":256,"path":4866,"seo":4867,"stem":4868,"wikiDepth":197,"__hash__":4869},"wiki\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2_serial_driver.md","ROS2 Serial Driver库",[7],"董佳辉",{"type":9,"value":10,"toc":4854},"minimark",[11,16,20,28,32,35,38,41,47,53,56,61,64,76,90,103,127,133,137,140,143,146,149,153,159,177,184,319,325,328,333,343,349,365,370,379,395,400,406,457,460,463,468,485,490,528,535,538,544,584,595,601,606,611,616,623,626,629,636,641,646,668,672,675,678,683,690,693,696,699,702,705,712,717,720,723,728,731,734,745,750,755,758,763,1866,1871,1876,1879,1883,2781,2786,2790,3647,3652,3656,4822,4827,4835,4838,4850],[12,13,15],"h3",{"id":14},"ros1串口库11","ROS1串口库1.1",[17,18,19],"p",{},"这是ROS1的库，但是也可以从第三方源码编译这个库，用于ROS2.",[17,21,22],{},[23,24,25],"a",{"href":25,"rel":26},"http:\u002F\u002Fwjwwood.io\u002Fserial\u002Fdoc\u002F1.1.0\u002Findex.html",[27],"nofollow",[12,29,31],{"id":30},"ros2串口库12","ROS2串口库1.2",[17,33,34],{},"顾名思义，是一个串口包，",[17,36,37],{},"该库适用于ROS Humble和ROS Jazzy版本。",[17,39,40],{},"官方详解:",[17,42,43],{},[23,44,45],{"href":45,"rel":46},"https:\u002F\u002Fdocs.ros.org\u002Fen\u002Fhumble\u002Fp\u002Fserial_driver\u002Fgenerated\u002Findex.html#",[27],[17,48,49],{},[23,50,51],{"href":51,"rel":52},"https:\u002F\u002Findex.ros.org\u002Fp\u002Fserial_driver\u002F",[27],[17,54,55],{},"下面是根据官方文档手搓的教程（截至教程出之前，还没有任何一个像样的教程）",[57,58,60],"h4",{"id":59},"serialdriver库特点","SerialDriver库特点",[17,62,63],{},"该库主要基于Boost.Asio库，所以说原理就是Boost.Asio库的特点：",[17,65,66,70,71,75],{},[67,68,69],"strong",{},"事件驱动"," Boost.Asio 使用操作系统提供的底层 I\u002FO 复用机制（如 Linux 的 ",[72,73,74],"code",{},"epoll","、Windows 的 I\u002FO Completion Ports）来监控文件描述符（如串口、套接字等）是否有可用的数据。当数据到达时，触发相应的事件。",[17,77,78,81,82,85,86,89],{},[67,79,80],{},"回调机制"," 用户调用异步方法（如 ",[72,83,84],{},"async_read"," 或 ",[72,87,88],{},"async_receive","）时，传入一个回调函数。当指定的事件（如数据接收完成）发生后，Boost.Asio 会自动调用用户提供的回调函数。",[17,91,92,95,96,85,99,102],{},[67,93,94],{},"I\u002FO 服务对象"," Boost.Asio 的核心是一个 ",[72,97,98],{},"io_service",[72,100,101],{},"io_context"," 对象，它管理所有的异步操作和回调的调度。异步接收时：",[104,105,106,116,121],"ul",{},[107,108,109,110,112,113,115],"li",{},"用户将操作（如 ",[72,111,88],{},"）注册到 ",[72,114,101],{},"。",[107,117,118,120],{},[72,119,101],{}," 将异步操作挂起，并等待 I\u002FO 事件的触发。",[107,122,123,124,126],{},"当 I\u002FO 事件触发时，",[72,125,101],{}," 调用对应的回调函数。",[17,128,129,132],{},[67,130,131],{},"不阻塞主线程"," 异步操作不会阻塞调用线程。主线程可以继续执行其他任务，而异步操作在后台完成。",[57,134,136],{"id":135},"基于boostasio库的优点","基于Boost.Asio库的优点",[17,138,139],{},"Boost.Asio库是靠系统IO进行事件触发的，并且单独开了一个线程去干这件事，所以这就使boost库拥有单片机的串口中断的特点，又拥有真多线程的特点。",[17,141,142],{},"而单片机的串口中断，虽然也能通过IO进行事件触发，但是由于单片机只有一个真线程，所以在进入中断时，一定会阻塞主线程，造成效率损失。",[17,144,145],{},"如果在主线程里直接接收并加上死循环和延时，这种效率往往是最低的，并且有很大的安全风险，非常不建议使用。",[17,147,148],{},"效率：Boost.Asio接收 >> 单片机串口中断 >> 多线程阻塞式接收 >> 单线程阻塞式接收（在传输速度非常快的情况下，全都是远远大于>>）",[57,150,152],{"id":151},"安装ros2串口包","安装ROS2串口包",[17,154,155,158],{},[67,156,157],{},"serial_driver"," 是一个封装了串口通信功能的库，它分为两个部分：",[104,160,161,171],{},[107,162,163,166,167,170],{},[67,164,165],{},"ROS2 依赖版本"," ：用于 ROS2 环境中，依赖于 ROS2 的通信机制（如 ",[72,168,169],{},"rclcpp","）。",[107,172,173,176],{},[67,174,175],{},"独立库版本"," ：不依赖 ROS2，可以直接在普通的 C++ 项目中使用。(未经测试)",[178,179,181],"h5",{"id":180},"方式一在ros2中安装",[67,182,183],{},"方式一：在ROS2中安装",[185,186,191],"pre",{"className":187,"code":188,"language":189,"meta":190,"style":190},"language-bash shiki shiki-themes github-light github-dark","sudo apt install ros-\u003Cros2-distro>-asio-cmake-module\nsudo apt install ros-\u003Cros2-distro>-serial-driver\n\n#humble\nsudo apt install ros-humble-asio-cmake-module\nsudo apt install ros-humble-serial-driver\n#jazzy\nsudo apt install ros-jazzy-asio-cmake-module\nsudo apt install ros-jazzy-serial-driver\n","bash","",[72,192,193,229,251,258,265,277,289,295,307],{"__ignoreMap":190},[194,195,198,202,206,209,212,216,219,223,226],"span",{"class":196,"line":197},"line",1,[194,199,201],{"class":200},"sScJk","sudo",[194,203,205],{"class":204},"sZZnC"," apt",[194,207,208],{"class":204}," install",[194,210,211],{"class":204}," ros-",[194,213,215],{"class":214},"szBVR","\u003C",[194,217,218],{"class":204},"ros2-distr",[194,220,222],{"class":221},"sVt8B","o",[194,224,225],{"class":214},">",[194,227,228],{"class":204},"-asio-cmake-module\n",[194,230,232,234,236,238,240,242,244,246,248],{"class":196,"line":231},2,[194,233,201],{"class":200},[194,235,205],{"class":204},[194,237,208],{"class":204},[194,239,211],{"class":204},[194,241,215],{"class":214},[194,243,218],{"class":204},[194,245,222],{"class":221},[194,247,225],{"class":214},[194,249,250],{"class":204},"-serial-driver\n",[194,252,254],{"class":196,"line":253},3,[194,255,257],{"emptyLinePlaceholder":256},true,"\n",[194,259,261],{"class":196,"line":260},4,[194,262,264],{"class":263},"sJ8bj","#humble\n",[194,266,268,270,272,274],{"class":196,"line":267},5,[194,269,201],{"class":200},[194,271,205],{"class":204},[194,273,208],{"class":204},[194,275,276],{"class":204}," ros-humble-asio-cmake-module\n",[194,278,280,282,284,286],{"class":196,"line":279},6,[194,281,201],{"class":200},[194,283,205],{"class":204},[194,285,208],{"class":204},[194,287,288],{"class":204}," ros-humble-serial-driver\n",[194,290,292],{"class":196,"line":291},7,[194,293,294],{"class":263},"#jazzy\n",[194,296,298,300,302,304],{"class":196,"line":297},8,[194,299,201],{"class":200},[194,301,205],{"class":204},[194,303,208],{"class":204},[194,305,306],{"class":204}," ros-jazzy-asio-cmake-module\n",[194,308,310,312,314,316],{"class":196,"line":309},9,[194,311,201],{"class":200},[194,313,205],{"class":204},[194,315,208],{"class":204},[194,317,318],{"class":204}," ros-jazzy-serial-driver\n",[178,320,322],{"id":321},"方式二通用该方法未经测试如果你测试了请帮忙删掉本句话",[67,323,324],{},"方式二：通用（该方法未经测试，如果你测试了，请帮忙删掉本句话）",[17,326,327],{},"如果你在ROS1或者说其他地方使用，而且没有安装ROS2，请选择该方法。",[17,329,330],{},[67,331,332],{},"克隆仓库",[17,334,335,336,339,340,342],{},"首先，克隆 ",[67,337,338],{},"transport_drivers"," 仓库（包含 ",[72,341,157],{},"）：",[17,344,345],{},[23,346,347],{"href":347,"rel":348},"https:\u002F\u002Fgithub.com\u002Fros-drivers\u002Ftransport_drivers",[27],[185,350,352],{"className":187,"code":351,"language":189,"meta":190,"style":190},"git clone https:\u002F\u002Fgithub.com\u002Fros-drivers\u002Ftransport_drivers.git\n",[72,353,354],{"__ignoreMap":190},[194,355,356,359,362],{"class":196,"line":197},[194,357,358],{"class":200},"git",[194,360,361],{"class":204}," clone",[194,363,364],{"class":204}," https:\u002F\u002Fgithub.com\u002Fros-drivers\u002Ftransport_drivers.git\n",[17,366,367],{},[67,368,369],{},"安装依赖",[17,371,372,374,375,378],{},[72,373,157],{}," 依赖于 ",[67,376,377],{},"ASIO"," 库（一个跨平台的 C++ 网络编程库）。确保系统中已安装 ASIO：",[185,380,382],{"className":187,"code":381,"language":189,"meta":190,"style":190},"sudo apt install libasio-dev\n",[72,383,384],{"__ignoreMap":190},[194,385,386,388,390,392],{"class":196,"line":197},[194,387,201],{"class":200},[194,389,205],{"class":204},[194,391,208],{"class":204},[194,393,394],{"class":204}," libasio-dev\n",[17,396,397],{},[67,398,399],{},"编译独立库",[17,401,402,403,405],{},"进入 ",[72,404,157],{}," 目录并编译：",[185,407,409],{"className":187,"code":408,"language":189,"meta":190,"style":190},"cd transport_drivers\u002Fserial_driver\nmkdir build\ncd build\ncmake ..\nmake\nsudo make install\n",[72,410,411,420,428,434,442,447],{"__ignoreMap":190},[194,412,413,417],{"class":196,"line":197},[194,414,416],{"class":415},"sj4cs","cd",[194,418,419],{"class":204}," transport_drivers\u002Fserial_driver\n",[194,421,422,425],{"class":196,"line":231},[194,423,424],{"class":200},"mkdir",[194,426,427],{"class":204}," build\n",[194,429,430,432],{"class":196,"line":253},[194,431,416],{"class":415},[194,433,427],{"class":204},[194,435,436,439],{"class":196,"line":260},[194,437,438],{"class":200},"cmake",[194,440,441],{"class":204}," ..\n",[194,443,444],{"class":196,"line":267},[194,445,446],{"class":200},"make\n",[194,448,449,451,454],{"class":196,"line":279},[194,450,201],{"class":200},[194,452,453],{"class":204}," make",[194,455,456],{"class":204}," install\n",[17,458,459],{},"安装完毕后，在CMake里正常添加该包就可以。",[178,461,462],{"id":462},"其他准备工作",[17,464,465],{},[67,466,467],{},"串口调试助手安装(Linux版) (如果需要Windows版，问控制组要去)",[185,469,471],{"className":187,"code":470,"language":189,"meta":190,"style":190},"sudo apt-get install cutecom\n",[72,472,473],{"__ignoreMap":190},[194,474,475,477,480,482],{"class":196,"line":197},[194,476,201],{"class":200},[194,478,479],{"class":204}," apt-get",[194,481,208],{"class":204},[194,483,484],{"class":204}," cutecom\n",[17,486,487],{},[67,488,489],{},"权限",[185,491,493],{"className":187,"code":492,"language":189,"meta":190,"style":190},"\n# 将用户权限提高\nsudo usermod -aG dialout $USER\nnewgrp dialout\n",[72,494,495,499,504,520],{"__ignoreMap":190},[194,496,497],{"class":196,"line":197},[194,498,257],{"emptyLinePlaceholder":256},[194,500,501],{"class":196,"line":231},[194,502,503],{"class":263},"# 将用户权限提高\n",[194,505,506,508,511,514,517],{"class":196,"line":253},[194,507,201],{"class":200},[194,509,510],{"class":204}," usermod",[194,512,513],{"class":415}," -aG",[194,515,516],{"class":204}," dialout",[194,518,519],{"class":221}," $USER\n",[194,521,522,525],{"class":196,"line":260},[194,523,524],{"class":200},"newgrp",[194,526,527],{"class":204}," dialout\n",[17,529,530,531],{},"有关Linux的USB设备的更多操作请看",[23,532,534],{"href":533},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0900-qi-ta-cao-zuo#usb%E7%AB%AF%E5%8F%A3%E8%AE%BE%E7%BD%AE","Vinci机器人队Linux入门教程",[57,536,537],{"id":537},"初始化详解",[539,540,541],"ol",{},[107,542,543],{},"创建功能包",[185,545,547],{"className":187,"code":546,"language":189,"meta":190,"style":190},"ros2 pkg create cpp01_serial --build-type ament_cmake --dependencies rclcpp serial_driver --node-name demo01_uart_send\n",[72,548,549],{"__ignoreMap":190},[194,550,551,554,557,560,563,566,569,572,575,578,581],{"class":196,"line":197},[194,552,553],{"class":200},"ros2",[194,555,556],{"class":204}," pkg",[194,558,559],{"class":204}," create",[194,561,562],{"class":204}," cpp01_serial",[194,564,565],{"class":415}," --build-type",[194,567,568],{"class":204}," ament_cmake",[194,570,571],{"class":415}," --dependencies",[194,573,574],{"class":204}," rclcpp",[194,576,577],{"class":204}," serial_driver",[194,579,580],{"class":415}," --node-name",[194,582,583],{"class":204}," demo01_uart_send\n",[539,585,586,592],{"start":231},[107,587,588,589],{},"引用头文件：",[72,590,591],{},"#include \"serial_driver\u002Fserial_driver.hpp\"",[107,593,594],{},"首先要初始化串口：",[17,596,597],{},[598,599],"img",{"alt":190,"src":600},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1772.webp",[17,602,603],{},[598,604],{"alt":190,"src":605},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1773.webp",[17,607,608],{},[598,609],{"alt":190,"src":610},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1774.webp",[17,612,613],{},[598,614],{"alt":190,"src":615},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1775.webp",[17,617,618,619,622],{},"串口初始化函数",[72,620,621],{},"init_port()","有俩参数，",[17,624,625],{},"第一个参数device_name 是端口名称",[17,627,628],{},"第二个参数config 是串口参数设置",[17,630,631,632,635],{},"device_name是个字符串，是填",[72,633,634],{},"\u002Fdev","下的设备名",[17,637,638],{},[598,639],{"alt":190,"src":640},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1776.webp",[17,642,643],{},[598,644],{"alt":190,"src":645},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1777.webp",[185,647,649],{"className":187,"code":648,"language":189,"meta":190,"style":190},"ls \u002Fdev | grep USB\n",[72,650,651],{"__ignoreMap":190},[194,652,653,656,659,662,665],{"class":196,"line":197},[194,654,655],{"class":200},"ls",[194,657,658],{"class":204}," \u002Fdev",[194,660,661],{"class":214}," |",[194,663,664],{"class":200}," grep",[194,666,667],{"class":204}," USB\n",[17,669,530,670],{},[23,671,534],{"href":533},[17,673,674],{},"config是个类对象，所以要创建一下这个类对象如下：",[17,676,677],{},"这玩意是个轻量化的类，没必要放在堆区，直接在栈区里创建即可。",[17,679,680],{},[598,681],{"alt":190,"src":682},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1778.webp",[17,684,685,686,689],{},"SerialPortConfig(uint32_t baud_rate, ",[67,687,688],{},"drivers::serial_driver::FlowControl flow_control"," , drivers::serial_driver::Parity parity, drivers::serial_driver::StopBits stop_bits)",[17,691,692],{},"从这个重载函数可以看到(参数不懂的问控制组)",[17,694,695],{},"第一个参数baud_rate 波特率",[17,697,698],{},"第二个参数flow_control 流控制",[17,700,701],{},"第三个参数parity 奇偶效验",[17,703,704],{},"第四个参数stop_bits 停止位",[17,706,707,708,711],{},"具体的参数在",[72,709,710],{},"serial_port.hpp","中有",[17,713,714],{},[598,715],{"alt":190,"src":716},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1779.webp",[17,718,719],{},"这样串口就初始化成功了。",[57,721,722],{"id":722},"发送代码详解",[539,724,725],{},[107,726,727],{},"发送主逻辑",[17,729,730],{},"我们接下来写发送主逻辑，首先要创建一个延时，不要使用while(true)这种死循环延迟，ROS2提供了定时器。",[17,732,733],{},"先创建定时器（创建定时器不用详解了，不懂的回顾上面赵老师的视频）",[17,735,736,737,740,741,744],{},"就需要注意一个点，我们用的是 ",[67,738,739],{},"毫秒milliseconds"," ，不是 ",[67,742,743],{},"微秒microseconds"," 。",[17,746,747],{},[598,748],{"alt":190,"src":749},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1780.webp",[17,751,752],{},[598,753],{"alt":190,"src":754},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1781.webp",[17,756,757],{},"发送核心函数是这个send函数，可以看到，入口参数是vector类型的向量，",[17,759,760],{},[598,761],{"alt":190,"src":762},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1782.webp",[185,764,768],{"className":765,"code":766,"language":767,"meta":190,"style":190},"language-cpp shiki shiki-themes github-light github-dark","#include \"rclcpp\u002Frclcpp.hpp\"\n#include \"serial_driver\u002Fserial_driver.hpp\"\n\nclass Serial_Node : public rclcpp::Node\n{\npublic:\n  Serial_Node() : Node(\"serial_node_cpp\")\n  {\n    \u002F\u002F 等设备准备好再初始化\n    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n\n    \u002F\u002F 串口设备名（根据实际设备调整）\n    const std::string device_name = \"\u002Fdev\u002FttyUSB0\";\n\n    RCLCPP_INFO(this->get_logger(), \"Serial port Node Open!\");\n    \u002F\u002F 创建串口配置对象\n    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n    drivers::serial_driver::SerialPortConfig config(\n        9600,\n        drivers::serial_driver::FlowControl::NONE,\n        drivers::serial_driver::Parity::NONE,\n        drivers::serial_driver::StopBits::ONE);\n\n    \u002F\u002F 初始化串口\n    try\n    {\n      io_context_ = std::make_shared\u003Cdrivers::common::IoContext>(1);\n      \u002F\u002F 初始化 serial_driver_\n      serial_driver_ = std::make_shared\u003Cdrivers::serial_driver::SerialDriver>(*io_context_);\n      serial_driver_->init_port(device_name, config);\n      serial_driver_->port()->open();\n\n      RCLCPP_INFO(this->get_logger(), \"Serial port initialized successfully\");\n      RCLCPP_INFO(this->get_logger(), \"Using device: %s\", serial_driver_->port().get()->device_name().c_str());\n      RCLCPP_INFO(this->get_logger(), \"Baud_rate: %d\", config.get_baud_rate());\n    }\n    catch (const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Failed to initialize serial port: %s\", ex.what());\n      return;\n    }\n\n    \u002F\u002F 设置发送定时器\n    send_timer_ = this->create_wall_timer(\n        std::chrono::milliseconds(500),\n        std::bind(&Serial_Node::send_message_timer_callback, this));\n  }\n\nprivate:\n  void send_message_timer_callback()\n  {\n    \u002F\u002F 发送一串字符串\n    const std::string message = \"Hello from ROS 2!\\n\";\n    std::vector\u003Cuint8_t> data(message.begin(), message.end());\n    \u002F\u002F std::vector\u003Cuint8_t> hex_data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; \u002F\u002F \"Hello\" in ASCII\n    auto port = serial_driver_->port();\n\n    try\n    {\n      size_t bytes_sent_size = port->send(data);\n      RCLCPP_INFO(this->get_logger(), \"Sent: %s (%ld bytes)\", message.c_str(), bytes_sent_size);\n    }\n    catch(const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Error Transmiting from serial port:%s\",ex.what());\n    }\n  }\n\n  std::shared_ptr\u003Cdrivers::serial_driver::SerialDriver> serial_driver_;\n  std::shared_ptr\u003Cdrivers::common::IoContext> io_context_;\n  rclcpp::TimerBase::SharedPtr send_timer_;\n};\n\nint main(int argc, char **argv)\n{\n  rclcpp::init(argc, argv);\n\n  auto node = std::make_shared\u003CSerial_Node>();\n\n  rclcpp::spin(node);\n\n  rclcpp::shutdown();\n  return 0;\n}\n","cpp",[72,769,770,778,785,789,811,816,821,841,846,851,857,862,868,889,894,920,926,932,951,960,978,994,1011,1016,1022,1028,1034,1072,1078,1113,1125,1142,1147,1168,1216,1247,1253,1276,1281,1312,1320,1325,1330,1336,1354,1378,1403,1409,1414,1420,1432,1437,1443,1465,1494,1503,1521,1526,1531,1536,1556,1592,1597,1614,1619,1648,1653,1658,1663,1688,1711,1725,1731,1736,1767,1772,1785,1790,1814,1819,1832,1837,1849,1860],{"__ignoreMap":190},[194,771,772,775],{"class":196,"line":197},[194,773,774],{"class":214},"#include",[194,776,777],{"class":204}," \"rclcpp\u002Frclcpp.hpp\"\n",[194,779,780,782],{"class":196,"line":231},[194,781,774],{"class":214},[194,783,784],{"class":204}," \"serial_driver\u002Fserial_driver.hpp\"\n",[194,786,787],{"class":196,"line":253},[194,788,257],{"emptyLinePlaceholder":256},[194,790,791,794,797,800,803,805,808],{"class":196,"line":260},[194,792,793],{"class":214},"class",[194,795,796],{"class":200}," Serial_Node",[194,798,799],{"class":221}," : ",[194,801,802],{"class":214},"public",[194,804,574],{"class":200},[194,806,807],{"class":221},"::",[194,809,810],{"class":200},"Node\n",[194,812,813],{"class":196,"line":267},[194,814,815],{"class":221},"{\n",[194,817,818],{"class":196,"line":279},[194,819,820],{"class":214},"public:\n",[194,822,823,826,829,832,835,838],{"class":196,"line":291},[194,824,825],{"class":200},"  Serial_Node",[194,827,828],{"class":221},"() : ",[194,830,831],{"class":200},"Node",[194,833,834],{"class":221},"(",[194,836,837],{"class":204},"\"serial_node_cpp\"",[194,839,840],{"class":221},")\n",[194,842,843],{"class":196,"line":297},[194,844,845],{"class":221},"  {\n",[194,847,848],{"class":196,"line":309},[194,849,850],{"class":263},"    \u002F\u002F 等设备准备好再初始化\n",[194,852,854],{"class":196,"line":853},10,[194,855,856],{"class":263},"    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n",[194,858,860],{"class":196,"line":859},11,[194,861,257],{"emptyLinePlaceholder":256},[194,863,865],{"class":196,"line":864},12,[194,866,867],{"class":263},"    \u002F\u002F 串口设备名（根据实际设备调整）\n",[194,869,871,874,877,880,883,886],{"class":196,"line":870},13,[194,872,873],{"class":214},"    const",[194,875,876],{"class":200}," std",[194,878,879],{"class":221},"::string device_name ",[194,881,882],{"class":214},"=",[194,884,885],{"class":204}," \"\u002Fdev\u002FttyUSB0\"",[194,887,888],{"class":221},";\n",[194,890,892],{"class":196,"line":891},14,[194,893,257],{"emptyLinePlaceholder":256},[194,895,897,900,902,905,908,911,914,917],{"class":196,"line":896},15,[194,898,899],{"class":200},"    RCLCPP_INFO",[194,901,834],{"class":221},[194,903,904],{"class":415},"this",[194,906,907],{"class":221},"->",[194,909,910],{"class":200},"get_logger",[194,912,913],{"class":221},"(), ",[194,915,916],{"class":204},"\"Serial port Node Open!\"",[194,918,919],{"class":221},");\n",[194,921,923],{"class":196,"line":922},16,[194,924,925],{"class":263},"    \u002F\u002F 创建串口配置对象\n",[194,927,929],{"class":196,"line":928},17,[194,930,931],{"class":263},"    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n",[194,933,935,938,940,942,945,948],{"class":196,"line":934},18,[194,936,937],{"class":200},"    drivers",[194,939,807],{"class":221},[194,941,157],{"class":200},[194,943,944],{"class":221},"::SerialPortConfig ",[194,946,947],{"class":200},"config",[194,949,950],{"class":221},"(\n",[194,952,954,957],{"class":196,"line":953},19,[194,955,956],{"class":415},"        9600",[194,958,959],{"class":221},",\n",[194,961,963,966,968,970,972,975],{"class":196,"line":962},20,[194,964,965],{"class":200},"        drivers",[194,967,807],{"class":221},[194,969,157],{"class":200},[194,971,807],{"class":221},[194,973,974],{"class":200},"FlowControl",[194,976,977],{"class":221},"::NONE,\n",[194,979,981,983,985,987,989,992],{"class":196,"line":980},21,[194,982,965],{"class":200},[194,984,807],{"class":221},[194,986,157],{"class":200},[194,988,807],{"class":221},[194,990,991],{"class":200},"Parity",[194,993,977],{"class":221},[194,995,997,999,1001,1003,1005,1008],{"class":196,"line":996},22,[194,998,965],{"class":200},[194,1000,807],{"class":221},[194,1002,157],{"class":200},[194,1004,807],{"class":221},[194,1006,1007],{"class":200},"StopBits",[194,1009,1010],{"class":221},"::ONE);\n",[194,1012,1014],{"class":196,"line":1013},23,[194,1015,257],{"emptyLinePlaceholder":256},[194,1017,1019],{"class":196,"line":1018},24,[194,1020,1021],{"class":263},"    \u002F\u002F 初始化串口\n",[194,1023,1025],{"class":196,"line":1024},25,[194,1026,1027],{"class":214},"    try\n",[194,1029,1031],{"class":196,"line":1030},26,[194,1032,1033],{"class":221},"    {\n",[194,1035,1037,1040,1042,1044,1046,1049,1051,1054,1056,1059,1061,1064,1067,1070],{"class":196,"line":1036},27,[194,1038,1039],{"class":221},"      io_context_ ",[194,1041,882],{"class":214},[194,1043,876],{"class":200},[194,1045,807],{"class":221},[194,1047,1048],{"class":200},"make_shared",[194,1050,215],{"class":221},[194,1052,1053],{"class":200},"drivers",[194,1055,807],{"class":221},[194,1057,1058],{"class":200},"common",[194,1060,807],{"class":221},[194,1062,1063],{"class":200},"IoContext",[194,1065,1066],{"class":221},">(",[194,1068,1069],{"class":415},"1",[194,1071,919],{"class":221},[194,1073,1075],{"class":196,"line":1074},28,[194,1076,1077],{"class":263},"      \u002F\u002F 初始化 serial_driver_\n",[194,1079,1081,1084,1086,1088,1090,1092,1094,1096,1098,1100,1102,1105,1107,1110],{"class":196,"line":1080},29,[194,1082,1083],{"class":221},"      serial_driver_ ",[194,1085,882],{"class":214},[194,1087,876],{"class":200},[194,1089,807],{"class":221},[194,1091,1048],{"class":200},[194,1093,215],{"class":221},[194,1095,1053],{"class":200},[194,1097,807],{"class":221},[194,1099,157],{"class":200},[194,1101,807],{"class":221},[194,1103,1104],{"class":200},"SerialDriver",[194,1106,1066],{"class":221},[194,1108,1109],{"class":214},"*",[194,1111,1112],{"class":221},"io_context_);\n",[194,1114,1116,1119,1122],{"class":196,"line":1115},30,[194,1117,1118],{"class":221},"      serial_driver_->",[194,1120,1121],{"class":200},"init_port",[194,1123,1124],{"class":221},"(device_name, config);\n",[194,1126,1128,1130,1133,1136,1139],{"class":196,"line":1127},31,[194,1129,1118],{"class":221},[194,1131,1132],{"class":200},"port",[194,1134,1135],{"class":221},"()->",[194,1137,1138],{"class":200},"open",[194,1140,1141],{"class":221},"();\n",[194,1143,1145],{"class":196,"line":1144},32,[194,1146,257],{"emptyLinePlaceholder":256},[194,1148,1150,1153,1155,1157,1159,1161,1163,1166],{"class":196,"line":1149},33,[194,1151,1152],{"class":200},"      RCLCPP_INFO",[194,1154,834],{"class":221},[194,1156,904],{"class":415},[194,1158,907],{"class":221},[194,1160,910],{"class":200},[194,1162,913],{"class":221},[194,1164,1165],{"class":204},"\"Serial port initialized successfully\"",[194,1167,919],{"class":221},[194,1169,1171,1173,1175,1177,1179,1181,1183,1186,1189,1192,1195,1197,1200,1203,1205,1208,1210,1213],{"class":196,"line":1170},34,[194,1172,1152],{"class":200},[194,1174,834],{"class":221},[194,1176,904],{"class":415},[194,1178,907],{"class":221},[194,1180,910],{"class":200},[194,1182,913],{"class":221},[194,1184,1185],{"class":204},"\"Using device: ",[194,1187,1188],{"class":415},"%s",[194,1190,1191],{"class":204},"\"",[194,1193,1194],{"class":221},", serial_driver_->",[194,1196,1132],{"class":200},[194,1198,1199],{"class":221},"().",[194,1201,1202],{"class":200},"get",[194,1204,1135],{"class":221},[194,1206,1207],{"class":200},"device_name",[194,1209,1199],{"class":221},[194,1211,1212],{"class":200},"c_str",[194,1214,1215],{"class":221},"());\n",[194,1217,1219,1221,1223,1225,1227,1229,1231,1234,1237,1239,1242,1245],{"class":196,"line":1218},35,[194,1220,1152],{"class":200},[194,1222,834],{"class":221},[194,1224,904],{"class":415},[194,1226,907],{"class":221},[194,1228,910],{"class":200},[194,1230,913],{"class":221},[194,1232,1233],{"class":204},"\"Baud_rate: ",[194,1235,1236],{"class":415},"%d",[194,1238,1191],{"class":204},[194,1240,1241],{"class":221},", config.",[194,1243,1244],{"class":200},"get_baud_rate",[194,1246,1215],{"class":221},[194,1248,1250],{"class":196,"line":1249},36,[194,1251,1252],{"class":221},"    }\n",[194,1254,1256,1259,1262,1265,1267,1270,1273],{"class":196,"line":1255},37,[194,1257,1258],{"class":214},"    catch",[194,1260,1261],{"class":221}," (",[194,1263,1264],{"class":214},"const",[194,1266,876],{"class":200},[194,1268,1269],{"class":221},"::exception ",[194,1271,1272],{"class":214},"&",[194,1274,1275],{"class":221},"ex)\n",[194,1277,1279],{"class":196,"line":1278},38,[194,1280,1033],{"class":221},[194,1282,1284,1287,1289,1291,1293,1295,1297,1300,1302,1304,1307,1310],{"class":196,"line":1283},39,[194,1285,1286],{"class":200},"      RCLCPP_ERROR",[194,1288,834],{"class":221},[194,1290,904],{"class":415},[194,1292,907],{"class":221},[194,1294,910],{"class":200},[194,1296,913],{"class":221},[194,1298,1299],{"class":204},"\"Failed to initialize serial port: ",[194,1301,1188],{"class":415},[194,1303,1191],{"class":204},[194,1305,1306],{"class":221},", ex.",[194,1308,1309],{"class":200},"what",[194,1311,1215],{"class":221},[194,1313,1315,1318],{"class":196,"line":1314},40,[194,1316,1317],{"class":214},"      return",[194,1319,888],{"class":221},[194,1321,1323],{"class":196,"line":1322},41,[194,1324,1252],{"class":221},[194,1326,1328],{"class":196,"line":1327},42,[194,1329,257],{"emptyLinePlaceholder":256},[194,1331,1333],{"class":196,"line":1332},43,[194,1334,1335],{"class":263},"    \u002F\u002F 设置发送定时器\n",[194,1337,1339,1342,1344,1347,1349,1352],{"class":196,"line":1338},44,[194,1340,1341],{"class":221},"    send_timer_ ",[194,1343,882],{"class":214},[194,1345,1346],{"class":415}," this",[194,1348,907],{"class":221},[194,1350,1351],{"class":200},"create_wall_timer",[194,1353,950],{"class":221},[194,1355,1357,1360,1362,1365,1367,1370,1372,1375],{"class":196,"line":1356},45,[194,1358,1359],{"class":200},"        std",[194,1361,807],{"class":221},[194,1363,1364],{"class":200},"chrono",[194,1366,807],{"class":221},[194,1368,1369],{"class":200},"milliseconds",[194,1371,834],{"class":221},[194,1373,1374],{"class":415},"500",[194,1376,1377],{"class":221},"),\n",[194,1379,1381,1383,1385,1388,1390,1392,1395,1398,1400],{"class":196,"line":1380},46,[194,1382,1359],{"class":200},[194,1384,807],{"class":221},[194,1386,1387],{"class":200},"bind",[194,1389,834],{"class":221},[194,1391,1272],{"class":214},[194,1393,1394],{"class":200},"Serial_Node",[194,1396,1397],{"class":221},"::send_message_timer_callback, ",[194,1399,904],{"class":415},[194,1401,1402],{"class":221},"));\n",[194,1404,1406],{"class":196,"line":1405},47,[194,1407,1408],{"class":221},"  }\n",[194,1410,1412],{"class":196,"line":1411},48,[194,1413,257],{"emptyLinePlaceholder":256},[194,1415,1417],{"class":196,"line":1416},49,[194,1418,1419],{"class":214},"private:\n",[194,1421,1423,1426,1429],{"class":196,"line":1422},50,[194,1424,1425],{"class":214},"  void",[194,1427,1428],{"class":200}," send_message_timer_callback",[194,1430,1431],{"class":221},"()\n",[194,1433,1435],{"class":196,"line":1434},51,[194,1436,845],{"class":221},[194,1438,1440],{"class":196,"line":1439},52,[194,1441,1442],{"class":263},"    \u002F\u002F 发送一串字符串\n",[194,1444,1446,1448,1450,1453,1455,1458,1461,1463],{"class":196,"line":1445},53,[194,1447,873],{"class":214},[194,1449,876],{"class":200},[194,1451,1452],{"class":221},"::string message ",[194,1454,882],{"class":214},[194,1456,1457],{"class":204}," \"Hello from ROS 2!",[194,1459,1460],{"class":415},"\\n",[194,1462,1191],{"class":204},[194,1464,888],{"class":221},[194,1466,1468,1471,1474,1477,1480,1483,1486,1489,1492],{"class":196,"line":1467},54,[194,1469,1470],{"class":200},"    std",[194,1472,1473],{"class":221},"::vector",[194,1475,1476],{"class":214},"\u003Cuint8_t>",[194,1478,1479],{"class":200}," data",[194,1481,1482],{"class":221},"(message.",[194,1484,1485],{"class":200},"begin",[194,1487,1488],{"class":221},"(), message.",[194,1490,1491],{"class":200},"end",[194,1493,1215],{"class":221},[194,1495,1497,1500],{"class":196,"line":1496},55,[194,1498,1499],{"class":263},"    \u002F\u002F std::vector\u003Cuint8_t> hex_data = {0x48, 0x65, 0x6C, 0x6C, 0x6F};",[194,1501,1502],{"class":263}," \u002F\u002F \"Hello\" in ASCII\n",[194,1504,1506,1509,1512,1514,1517,1519],{"class":196,"line":1505},56,[194,1507,1508],{"class":214},"    auto",[194,1510,1511],{"class":221}," port ",[194,1513,882],{"class":214},[194,1515,1516],{"class":221}," serial_driver_->",[194,1518,1132],{"class":200},[194,1520,1141],{"class":221},[194,1522,1524],{"class":196,"line":1523},57,[194,1525,257],{"emptyLinePlaceholder":256},[194,1527,1529],{"class":196,"line":1528},58,[194,1530,1027],{"class":214},[194,1532,1534],{"class":196,"line":1533},59,[194,1535,1033],{"class":221},[194,1537,1539,1542,1545,1547,1550,1553],{"class":196,"line":1538},60,[194,1540,1541],{"class":214},"      size_t",[194,1543,1544],{"class":221}," bytes_sent_size ",[194,1546,882],{"class":214},[194,1548,1549],{"class":221}," port->",[194,1551,1552],{"class":200},"send",[194,1554,1555],{"class":221},"(data);\n",[194,1557,1559,1561,1563,1565,1567,1569,1571,1574,1576,1578,1581,1584,1587,1589],{"class":196,"line":1558},61,[194,1560,1152],{"class":200},[194,1562,834],{"class":221},[194,1564,904],{"class":415},[194,1566,907],{"class":221},[194,1568,910],{"class":200},[194,1570,913],{"class":221},[194,1572,1573],{"class":204},"\"Sent: ",[194,1575,1188],{"class":415},[194,1577,1261],{"class":204},[194,1579,1580],{"class":415},"%ld",[194,1582,1583],{"class":204}," bytes)\"",[194,1585,1586],{"class":221},", message.",[194,1588,1212],{"class":200},[194,1590,1591],{"class":221},"(), bytes_sent_size);\n",[194,1593,1595],{"class":196,"line":1594},62,[194,1596,1252],{"class":221},[194,1598,1600,1602,1604,1606,1608,1610,1612],{"class":196,"line":1599},63,[194,1601,1258],{"class":214},[194,1603,834],{"class":221},[194,1605,1264],{"class":214},[194,1607,876],{"class":200},[194,1609,1269],{"class":221},[194,1611,1272],{"class":214},[194,1613,1275],{"class":221},[194,1615,1617],{"class":196,"line":1616},64,[194,1618,1033],{"class":221},[194,1620,1622,1624,1626,1628,1630,1632,1634,1637,1639,1641,1644,1646],{"class":196,"line":1621},65,[194,1623,1286],{"class":200},[194,1625,834],{"class":221},[194,1627,904],{"class":415},[194,1629,907],{"class":221},[194,1631,910],{"class":200},[194,1633,913],{"class":221},[194,1635,1636],{"class":204},"\"Error Transmiting from serial port:",[194,1638,1188],{"class":415},[194,1640,1191],{"class":204},[194,1642,1643],{"class":221},",ex.",[194,1645,1309],{"class":200},[194,1647,1215],{"class":221},[194,1649,1651],{"class":196,"line":1650},66,[194,1652,1252],{"class":221},[194,1654,1656],{"class":196,"line":1655},67,[194,1657,1408],{"class":221},[194,1659,1661],{"class":196,"line":1660},68,[194,1662,257],{"emptyLinePlaceholder":256},[194,1664,1666,1669,1672,1674,1676,1678,1680,1683,1685],{"class":196,"line":1665},69,[194,1667,1668],{"class":200},"  std",[194,1670,1671],{"class":221},"::shared_ptr",[194,1673,215],{"class":214},[194,1675,1053],{"class":200},[194,1677,807],{"class":221},[194,1679,157],{"class":200},[194,1681,1682],{"class":221},"::SerialDriver",[194,1684,225],{"class":214},[194,1686,1687],{"class":221}," serial_driver_;\n",[194,1689,1691,1693,1695,1697,1699,1701,1703,1706,1708],{"class":196,"line":1690},70,[194,1692,1668],{"class":200},[194,1694,1671],{"class":221},[194,1696,215],{"class":214},[194,1698,1053],{"class":200},[194,1700,807],{"class":221},[194,1702,1058],{"class":200},[194,1704,1705],{"class":221},"::IoContext",[194,1707,225],{"class":214},[194,1709,1710],{"class":221}," io_context_;\n",[194,1712,1714,1717,1719,1722],{"class":196,"line":1713},71,[194,1715,1716],{"class":200},"  rclcpp",[194,1718,807],{"class":221},[194,1720,1721],{"class":200},"TimerBase",[194,1723,1724],{"class":221},"::SharedPtr send_timer_;\n",[194,1726,1728],{"class":196,"line":1727},72,[194,1729,1730],{"class":221},"};\n",[194,1732,1734],{"class":196,"line":1733},73,[194,1735,257],{"emptyLinePlaceholder":256},[194,1737,1739,1742,1745,1747,1749,1753,1756,1759,1762,1765],{"class":196,"line":1738},74,[194,1740,1741],{"class":214},"int",[194,1743,1744],{"class":200}," main",[194,1746,834],{"class":221},[194,1748,1741],{"class":214},[194,1750,1752],{"class":1751},"s4XuR"," argc",[194,1754,1755],{"class":221},", ",[194,1757,1758],{"class":214},"char",[194,1760,1761],{"class":214}," **",[194,1763,1764],{"class":1751},"argv",[194,1766,840],{"class":221},[194,1768,1770],{"class":196,"line":1769},75,[194,1771,815],{"class":221},[194,1773,1775,1777,1779,1782],{"class":196,"line":1774},76,[194,1776,1716],{"class":200},[194,1778,807],{"class":221},[194,1780,1781],{"class":200},"init",[194,1783,1784],{"class":221},"(argc, argv);\n",[194,1786,1788],{"class":196,"line":1787},77,[194,1789,257],{"emptyLinePlaceholder":256},[194,1791,1793,1796,1799,1801,1803,1805,1807,1809,1811],{"class":196,"line":1792},78,[194,1794,1795],{"class":214},"  auto",[194,1797,1798],{"class":221}," node ",[194,1800,882],{"class":214},[194,1802,876],{"class":200},[194,1804,807],{"class":221},[194,1806,1048],{"class":200},[194,1808,215],{"class":221},[194,1810,1394],{"class":200},[194,1812,1813],{"class":221},">();\n",[194,1815,1817],{"class":196,"line":1816},79,[194,1818,257],{"emptyLinePlaceholder":256},[194,1820,1822,1824,1826,1829],{"class":196,"line":1821},80,[194,1823,1716],{"class":200},[194,1825,807],{"class":221},[194,1827,1828],{"class":200},"spin",[194,1830,1831],{"class":221},"(node);\n",[194,1833,1835],{"class":196,"line":1834},81,[194,1836,257],{"emptyLinePlaceholder":256},[194,1838,1840,1842,1844,1847],{"class":196,"line":1839},82,[194,1841,1716],{"class":200},[194,1843,807],{"class":221},[194,1845,1846],{"class":200},"shutdown",[194,1848,1141],{"class":221},[194,1850,1852,1855,1858],{"class":196,"line":1851},83,[194,1853,1854],{"class":214},"  return",[194,1856,1857],{"class":415}," 0",[194,1859,888],{"class":221},[194,1861,1863],{"class":196,"line":1862},84,[194,1864,1865],{"class":221},"}\n",[17,1867,1868],{},[598,1869],{"alt":190,"src":1870},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1783.webp",[17,1872,1873],{},[598,1874],{"alt":190,"src":1875},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1784.webp",[57,1877,1878],{"id":1878},"接收代码详解",[178,1880,1882],{"id":1881},"定时器方式低效不建议用","定时器方式(低效，不建议用)",[185,1884,1886],{"className":765,"code":1885,"language":767,"meta":190,"style":190},"#include \"rclcpp\u002Frclcpp.hpp\"\n#include \"serial_driver\u002Fserial_driver.hpp\"\n#include \u003Cstring>\n\nclass Serial_Node : public rclcpp::Node\n{\npublic:\n  Serial_Node() : Node(\"serial_node_cpp\")\n  {\n    \u002F\u002F 等设备准备好再初始化\n    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n\n    \u002F\u002F 串口设备名（根据实际设备调整）\n    const std::string device_name = \"\u002Fdev\u002FttyUSB0\";\n\n    RCLCPP_INFO(this->get_logger(), \"Serial port Node Open!\");\n    \u002F\u002F 创建串口配置对象\n    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n    drivers::serial_driver::SerialPortConfig config(\n        9600,\n        drivers::serial_driver::FlowControl::NONE,\n        drivers::serial_driver::Parity::NONE,\n        drivers::serial_driver::StopBits::ONE);\n\n    \u002F\u002F 初始化串口\n    try\n    {\n      io_context_ = std::make_shared\u003Cdrivers::common::IoContext>(1);\n      \u002F\u002F 初始化 serial_driver_\n      serial_driver_ = std::make_shared\u003Cdrivers::serial_driver::SerialDriver>(*io_context_);\n      serial_driver_->init_port(device_name, config);\n      serial_driver_->port()->open();\n\n      RCLCPP_INFO(this->get_logger(), \"Serial port initialized successfully\");\n      RCLCPP_INFO(this->get_logger(), \"Using device: %s\", serial_driver_->port().get()->device_name().c_str());\n      RCLCPP_INFO(this->get_logger(), \"Baud_rate: %d\", config.get_baud_rate());\n    }\n    catch (const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Failed to initialize serial port: %s\", ex.what());\n      return;\n    }\n\n    \u002F\u002F 设置发送定时器\n    receive_timer_ = this->create_wall_timer(\n        std::chrono::milliseconds(3),\n        std::bind(&Serial_Node::receive_message_timer_callback, this));\n  }\n\nprivate:\n  void receive_message_timer_callback()\n  {\n    std::vector\u003Cuint8_t> data(100); \u002F\u002F \"Hello\" in ASCII\n    auto port = serial_driver_->port();\n\n    try\n    {\n      size_t bytes_receive_size = port->receive(data);\n      if(bytes_receive_size > 0)\n      {\n        std::string message(data.begin(),data.begin() + bytes_receive_size);\n        RCLCPP_INFO(this->get_logger(), \"Receive: %s (%ld bytes)\", message.c_str(), bytes_receive_size);\n      }\n    }\n    catch(const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Error Receiving from serial port:%s\",ex.what());\n    }\n  }\n\n  std::shared_ptr\u003Cdrivers::serial_driver::SerialDriver> serial_driver_;\n  std::shared_ptr\u003Cdrivers::common::IoContext> io_context_;\n  rclcpp::TimerBase::SharedPtr receive_timer_;\n};\n\nint main(int argc, char **argv)\n{\n  rclcpp::init(argc, argv);\n\n  auto node = std::make_shared\u003CSerial_Node>();\n\n  rclcpp::spin(node);\n\n  rclcpp::shutdown();\n  return 0;\n}\n",[72,1887,1888,1894,1900,1907,1911,1927,1931,1935,1949,1953,1957,1961,1965,1969,1983,1987,2005,2009,2013,2027,2033,2047,2061,2075,2079,2083,2087,2091,2121,2125,2155,2163,2175,2179,2197,2235,2261,2265,2281,2285,2311,2317,2321,2325,2329,2344,2363,2384,2388,2392,2396,2405,2409,2429,2443,2447,2451,2455,2471,2485,2490,2519,2552,2557,2561,2577,2581,2608,2612,2616,2620,2640,2660,2671,2675,2679,2701,2705,2715,2719,2739,2743,2753,2757,2767,2776],{"__ignoreMap":190},[194,1889,1890,1892],{"class":196,"line":197},[194,1891,774],{"class":214},[194,1893,777],{"class":204},[194,1895,1896,1898],{"class":196,"line":231},[194,1897,774],{"class":214},[194,1899,784],{"class":204},[194,1901,1902,1904],{"class":196,"line":253},[194,1903,774],{"class":214},[194,1905,1906],{"class":204}," \u003Cstring>\n",[194,1908,1909],{"class":196,"line":260},[194,1910,257],{"emptyLinePlaceholder":256},[194,1912,1913,1915,1917,1919,1921,1923,1925],{"class":196,"line":267},[194,1914,793],{"class":214},[194,1916,796],{"class":200},[194,1918,799],{"class":221},[194,1920,802],{"class":214},[194,1922,574],{"class":200},[194,1924,807],{"class":221},[194,1926,810],{"class":200},[194,1928,1929],{"class":196,"line":279},[194,1930,815],{"class":221},[194,1932,1933],{"class":196,"line":291},[194,1934,820],{"class":214},[194,1936,1937,1939,1941,1943,1945,1947],{"class":196,"line":297},[194,1938,825],{"class":200},[194,1940,828],{"class":221},[194,1942,831],{"class":200},[194,1944,834],{"class":221},[194,1946,837],{"class":204},[194,1948,840],{"class":221},[194,1950,1951],{"class":196,"line":309},[194,1952,845],{"class":221},[194,1954,1955],{"class":196,"line":853},[194,1956,850],{"class":263},[194,1958,1959],{"class":196,"line":859},[194,1960,856],{"class":263},[194,1962,1963],{"class":196,"line":864},[194,1964,257],{"emptyLinePlaceholder":256},[194,1966,1967],{"class":196,"line":870},[194,1968,867],{"class":263},[194,1970,1971,1973,1975,1977,1979,1981],{"class":196,"line":891},[194,1972,873],{"class":214},[194,1974,876],{"class":200},[194,1976,879],{"class":221},[194,1978,882],{"class":214},[194,1980,885],{"class":204},[194,1982,888],{"class":221},[194,1984,1985],{"class":196,"line":896},[194,1986,257],{"emptyLinePlaceholder":256},[194,1988,1989,1991,1993,1995,1997,1999,2001,2003],{"class":196,"line":922},[194,1990,899],{"class":200},[194,1992,834],{"class":221},[194,1994,904],{"class":415},[194,1996,907],{"class":221},[194,1998,910],{"class":200},[194,2000,913],{"class":221},[194,2002,916],{"class":204},[194,2004,919],{"class":221},[194,2006,2007],{"class":196,"line":928},[194,2008,925],{"class":263},[194,2010,2011],{"class":196,"line":934},[194,2012,931],{"class":263},[194,2014,2015,2017,2019,2021,2023,2025],{"class":196,"line":953},[194,2016,937],{"class":200},[194,2018,807],{"class":221},[194,2020,157],{"class":200},[194,2022,944],{"class":221},[194,2024,947],{"class":200},[194,2026,950],{"class":221},[194,2028,2029,2031],{"class":196,"line":962},[194,2030,956],{"class":415},[194,2032,959],{"class":221},[194,2034,2035,2037,2039,2041,2043,2045],{"class":196,"line":980},[194,2036,965],{"class":200},[194,2038,807],{"class":221},[194,2040,157],{"class":200},[194,2042,807],{"class":221},[194,2044,974],{"class":200},[194,2046,977],{"class":221},[194,2048,2049,2051,2053,2055,2057,2059],{"class":196,"line":996},[194,2050,965],{"class":200},[194,2052,807],{"class":221},[194,2054,157],{"class":200},[194,2056,807],{"class":221},[194,2058,991],{"class":200},[194,2060,977],{"class":221},[194,2062,2063,2065,2067,2069,2071,2073],{"class":196,"line":1013},[194,2064,965],{"class":200},[194,2066,807],{"class":221},[194,2068,157],{"class":200},[194,2070,807],{"class":221},[194,2072,1007],{"class":200},[194,2074,1010],{"class":221},[194,2076,2077],{"class":196,"line":1018},[194,2078,257],{"emptyLinePlaceholder":256},[194,2080,2081],{"class":196,"line":1024},[194,2082,1021],{"class":263},[194,2084,2085],{"class":196,"line":1030},[194,2086,1027],{"class":214},[194,2088,2089],{"class":196,"line":1036},[194,2090,1033],{"class":221},[194,2092,2093,2095,2097,2099,2101,2103,2105,2107,2109,2111,2113,2115,2117,2119],{"class":196,"line":1074},[194,2094,1039],{"class":221},[194,2096,882],{"class":214},[194,2098,876],{"class":200},[194,2100,807],{"class":221},[194,2102,1048],{"class":200},[194,2104,215],{"class":221},[194,2106,1053],{"class":200},[194,2108,807],{"class":221},[194,2110,1058],{"class":200},[194,2112,807],{"class":221},[194,2114,1063],{"class":200},[194,2116,1066],{"class":221},[194,2118,1069],{"class":415},[194,2120,919],{"class":221},[194,2122,2123],{"class":196,"line":1080},[194,2124,1077],{"class":263},[194,2126,2127,2129,2131,2133,2135,2137,2139,2141,2143,2145,2147,2149,2151,2153],{"class":196,"line":1115},[194,2128,1083],{"class":221},[194,2130,882],{"class":214},[194,2132,876],{"class":200},[194,2134,807],{"class":221},[194,2136,1048],{"class":200},[194,2138,215],{"class":221},[194,2140,1053],{"class":200},[194,2142,807],{"class":221},[194,2144,157],{"class":200},[194,2146,807],{"class":221},[194,2148,1104],{"class":200},[194,2150,1066],{"class":221},[194,2152,1109],{"class":214},[194,2154,1112],{"class":221},[194,2156,2157,2159,2161],{"class":196,"line":1127},[194,2158,1118],{"class":221},[194,2160,1121],{"class":200},[194,2162,1124],{"class":221},[194,2164,2165,2167,2169,2171,2173],{"class":196,"line":1144},[194,2166,1118],{"class":221},[194,2168,1132],{"class":200},[194,2170,1135],{"class":221},[194,2172,1138],{"class":200},[194,2174,1141],{"class":221},[194,2176,2177],{"class":196,"line":1149},[194,2178,257],{"emptyLinePlaceholder":256},[194,2180,2181,2183,2185,2187,2189,2191,2193,2195],{"class":196,"line":1170},[194,2182,1152],{"class":200},[194,2184,834],{"class":221},[194,2186,904],{"class":415},[194,2188,907],{"class":221},[194,2190,910],{"class":200},[194,2192,913],{"class":221},[194,2194,1165],{"class":204},[194,2196,919],{"class":221},[194,2198,2199,2201,2203,2205,2207,2209,2211,2213,2215,2217,2219,2221,2223,2225,2227,2229,2231,2233],{"class":196,"line":1218},[194,2200,1152],{"class":200},[194,2202,834],{"class":221},[194,2204,904],{"class":415},[194,2206,907],{"class":221},[194,2208,910],{"class":200},[194,2210,913],{"class":221},[194,2212,1185],{"class":204},[194,2214,1188],{"class":415},[194,2216,1191],{"class":204},[194,2218,1194],{"class":221},[194,2220,1132],{"class":200},[194,2222,1199],{"class":221},[194,2224,1202],{"class":200},[194,2226,1135],{"class":221},[194,2228,1207],{"class":200},[194,2230,1199],{"class":221},[194,2232,1212],{"class":200},[194,2234,1215],{"class":221},[194,2236,2237,2239,2241,2243,2245,2247,2249,2251,2253,2255,2257,2259],{"class":196,"line":1249},[194,2238,1152],{"class":200},[194,2240,834],{"class":221},[194,2242,904],{"class":415},[194,2244,907],{"class":221},[194,2246,910],{"class":200},[194,2248,913],{"class":221},[194,2250,1233],{"class":204},[194,2252,1236],{"class":415},[194,2254,1191],{"class":204},[194,2256,1241],{"class":221},[194,2258,1244],{"class":200},[194,2260,1215],{"class":221},[194,2262,2263],{"class":196,"line":1255},[194,2264,1252],{"class":221},[194,2266,2267,2269,2271,2273,2275,2277,2279],{"class":196,"line":1278},[194,2268,1258],{"class":214},[194,2270,1261],{"class":221},[194,2272,1264],{"class":214},[194,2274,876],{"class":200},[194,2276,1269],{"class":221},[194,2278,1272],{"class":214},[194,2280,1275],{"class":221},[194,2282,2283],{"class":196,"line":1283},[194,2284,1033],{"class":221},[194,2286,2287,2289,2291,2293,2295,2297,2299,2301,2303,2305,2307,2309],{"class":196,"line":1314},[194,2288,1286],{"class":200},[194,2290,834],{"class":221},[194,2292,904],{"class":415},[194,2294,907],{"class":221},[194,2296,910],{"class":200},[194,2298,913],{"class":221},[194,2300,1299],{"class":204},[194,2302,1188],{"class":415},[194,2304,1191],{"class":204},[194,2306,1306],{"class":221},[194,2308,1309],{"class":200},[194,2310,1215],{"class":221},[194,2312,2313,2315],{"class":196,"line":1322},[194,2314,1317],{"class":214},[194,2316,888],{"class":221},[194,2318,2319],{"class":196,"line":1327},[194,2320,1252],{"class":221},[194,2322,2323],{"class":196,"line":1332},[194,2324,257],{"emptyLinePlaceholder":256},[194,2326,2327],{"class":196,"line":1338},[194,2328,1335],{"class":263},[194,2330,2331,2334,2336,2338,2340,2342],{"class":196,"line":1356},[194,2332,2333],{"class":221},"    receive_timer_ ",[194,2335,882],{"class":214},[194,2337,1346],{"class":415},[194,2339,907],{"class":221},[194,2341,1351],{"class":200},[194,2343,950],{"class":221},[194,2345,2346,2348,2350,2352,2354,2356,2358,2361],{"class":196,"line":1380},[194,2347,1359],{"class":200},[194,2349,807],{"class":221},[194,2351,1364],{"class":200},[194,2353,807],{"class":221},[194,2355,1369],{"class":200},[194,2357,834],{"class":221},[194,2359,2360],{"class":415},"3",[194,2362,1377],{"class":221},[194,2364,2365,2367,2369,2371,2373,2375,2377,2380,2382],{"class":196,"line":1405},[194,2366,1359],{"class":200},[194,2368,807],{"class":221},[194,2370,1387],{"class":200},[194,2372,834],{"class":221},[194,2374,1272],{"class":214},[194,2376,1394],{"class":200},[194,2378,2379],{"class":221},"::receive_message_timer_callback, ",[194,2381,904],{"class":415},[194,2383,1402],{"class":221},[194,2385,2386],{"class":196,"line":1411},[194,2387,1408],{"class":221},[194,2389,2390],{"class":196,"line":1416},[194,2391,257],{"emptyLinePlaceholder":256},[194,2393,2394],{"class":196,"line":1422},[194,2395,1419],{"class":214},[194,2397,2398,2400,2403],{"class":196,"line":1434},[194,2399,1425],{"class":214},[194,2401,2402],{"class":200}," receive_message_timer_callback",[194,2404,1431],{"class":221},[194,2406,2407],{"class":196,"line":1439},[194,2408,845],{"class":221},[194,2410,2411,2413,2415,2417,2419,2421,2424,2427],{"class":196,"line":1445},[194,2412,1470],{"class":200},[194,2414,1473],{"class":221},[194,2416,1476],{"class":214},[194,2418,1479],{"class":200},[194,2420,834],{"class":221},[194,2422,2423],{"class":415},"100",[194,2425,2426],{"class":221},");",[194,2428,1502],{"class":263},[194,2430,2431,2433,2435,2437,2439,2441],{"class":196,"line":1467},[194,2432,1508],{"class":214},[194,2434,1511],{"class":221},[194,2436,882],{"class":214},[194,2438,1516],{"class":221},[194,2440,1132],{"class":200},[194,2442,1141],{"class":221},[194,2444,2445],{"class":196,"line":1496},[194,2446,257],{"emptyLinePlaceholder":256},[194,2448,2449],{"class":196,"line":1505},[194,2450,1027],{"class":214},[194,2452,2453],{"class":196,"line":1523},[194,2454,1033],{"class":221},[194,2456,2457,2459,2462,2464,2466,2469],{"class":196,"line":1528},[194,2458,1541],{"class":214},[194,2460,2461],{"class":221}," bytes_receive_size ",[194,2463,882],{"class":214},[194,2465,1549],{"class":221},[194,2467,2468],{"class":200},"receive",[194,2470,1555],{"class":221},[194,2472,2473,2476,2479,2481,2483],{"class":196,"line":1533},[194,2474,2475],{"class":214},"      if",[194,2477,2478],{"class":221},"(bytes_receive_size ",[194,2480,225],{"class":214},[194,2482,1857],{"class":415},[194,2484,840],{"class":221},[194,2486,2487],{"class":196,"line":1538},[194,2488,2489],{"class":221},"      {\n",[194,2491,2492,2494,2497,2500,2503,2505,2508,2510,2513,2516],{"class":196,"line":1558},[194,2493,1359],{"class":200},[194,2495,2496],{"class":221},"::string ",[194,2498,2499],{"class":200},"message",[194,2501,2502],{"class":221},"(data.",[194,2504,1485],{"class":200},[194,2506,2507],{"class":221},"(),data.",[194,2509,1485],{"class":200},[194,2511,2512],{"class":221},"() ",[194,2514,2515],{"class":214},"+",[194,2517,2518],{"class":221}," bytes_receive_size);\n",[194,2520,2521,2524,2526,2528,2530,2532,2534,2537,2539,2541,2543,2545,2547,2549],{"class":196,"line":1594},[194,2522,2523],{"class":200},"        RCLCPP_INFO",[194,2525,834],{"class":221},[194,2527,904],{"class":415},[194,2529,907],{"class":221},[194,2531,910],{"class":200},[194,2533,913],{"class":221},[194,2535,2536],{"class":204},"\"Receive: ",[194,2538,1188],{"class":415},[194,2540,1261],{"class":204},[194,2542,1580],{"class":415},[194,2544,1583],{"class":204},[194,2546,1586],{"class":221},[194,2548,1212],{"class":200},[194,2550,2551],{"class":221},"(), bytes_receive_size);\n",[194,2553,2554],{"class":196,"line":1599},[194,2555,2556],{"class":221},"      }\n",[194,2558,2559],{"class":196,"line":1616},[194,2560,1252],{"class":221},[194,2562,2563,2565,2567,2569,2571,2573,2575],{"class":196,"line":1621},[194,2564,1258],{"class":214},[194,2566,834],{"class":221},[194,2568,1264],{"class":214},[194,2570,876],{"class":200},[194,2572,1269],{"class":221},[194,2574,1272],{"class":214},[194,2576,1275],{"class":221},[194,2578,2579],{"class":196,"line":1650},[194,2580,1033],{"class":221},[194,2582,2583,2585,2587,2589,2591,2593,2595,2598,2600,2602,2604,2606],{"class":196,"line":1655},[194,2584,1286],{"class":200},[194,2586,834],{"class":221},[194,2588,904],{"class":415},[194,2590,907],{"class":221},[194,2592,910],{"class":200},[194,2594,913],{"class":221},[194,2596,2597],{"class":204},"\"Error Receiving from serial port:",[194,2599,1188],{"class":415},[194,2601,1191],{"class":204},[194,2603,1643],{"class":221},[194,2605,1309],{"class":200},[194,2607,1215],{"class":221},[194,2609,2610],{"class":196,"line":1660},[194,2611,1252],{"class":221},[194,2613,2614],{"class":196,"line":1665},[194,2615,1408],{"class":221},[194,2617,2618],{"class":196,"line":1690},[194,2619,257],{"emptyLinePlaceholder":256},[194,2621,2622,2624,2626,2628,2630,2632,2634,2636,2638],{"class":196,"line":1713},[194,2623,1668],{"class":200},[194,2625,1671],{"class":221},[194,2627,215],{"class":214},[194,2629,1053],{"class":200},[194,2631,807],{"class":221},[194,2633,157],{"class":200},[194,2635,1682],{"class":221},[194,2637,225],{"class":214},[194,2639,1687],{"class":221},[194,2641,2642,2644,2646,2648,2650,2652,2654,2656,2658],{"class":196,"line":1727},[194,2643,1668],{"class":200},[194,2645,1671],{"class":221},[194,2647,215],{"class":214},[194,2649,1053],{"class":200},[194,2651,807],{"class":221},[194,2653,1058],{"class":200},[194,2655,1705],{"class":221},[194,2657,225],{"class":214},[194,2659,1710],{"class":221},[194,2661,2662,2664,2666,2668],{"class":196,"line":1733},[194,2663,1716],{"class":200},[194,2665,807],{"class":221},[194,2667,1721],{"class":200},[194,2669,2670],{"class":221},"::SharedPtr receive_timer_;\n",[194,2672,2673],{"class":196,"line":1738},[194,2674,1730],{"class":221},[194,2676,2677],{"class":196,"line":1769},[194,2678,257],{"emptyLinePlaceholder":256},[194,2680,2681,2683,2685,2687,2689,2691,2693,2695,2697,2699],{"class":196,"line":1774},[194,2682,1741],{"class":214},[194,2684,1744],{"class":200},[194,2686,834],{"class":221},[194,2688,1741],{"class":214},[194,2690,1752],{"class":1751},[194,2692,1755],{"class":221},[194,2694,1758],{"class":214},[194,2696,1761],{"class":214},[194,2698,1764],{"class":1751},[194,2700,840],{"class":221},[194,2702,2703],{"class":196,"line":1787},[194,2704,815],{"class":221},[194,2706,2707,2709,2711,2713],{"class":196,"line":1792},[194,2708,1716],{"class":200},[194,2710,807],{"class":221},[194,2712,1781],{"class":200},[194,2714,1784],{"class":221},[194,2716,2717],{"class":196,"line":1816},[194,2718,257],{"emptyLinePlaceholder":256},[194,2720,2721,2723,2725,2727,2729,2731,2733,2735,2737],{"class":196,"line":1821},[194,2722,1795],{"class":214},[194,2724,1798],{"class":221},[194,2726,882],{"class":214},[194,2728,876],{"class":200},[194,2730,807],{"class":221},[194,2732,1048],{"class":200},[194,2734,215],{"class":221},[194,2736,1394],{"class":200},[194,2738,1813],{"class":221},[194,2740,2741],{"class":196,"line":1834},[194,2742,257],{"emptyLinePlaceholder":256},[194,2744,2745,2747,2749,2751],{"class":196,"line":1839},[194,2746,1716],{"class":200},[194,2748,807],{"class":221},[194,2750,1828],{"class":200},[194,2752,1831],{"class":221},[194,2754,2755],{"class":196,"line":1851},[194,2756,257],{"emptyLinePlaceholder":256},[194,2758,2759,2761,2763,2765],{"class":196,"line":1862},[194,2760,1716],{"class":200},[194,2762,807],{"class":221},[194,2764,1846],{"class":200},[194,2766,1141],{"class":221},[194,2768,2770,2772,2774],{"class":196,"line":2769},85,[194,2771,1854],{"class":214},[194,2773,1857],{"class":415},[194,2775,888],{"class":221},[194,2777,2779],{"class":196,"line":2778},86,[194,2780,1865],{"class":221},[17,2782,2783],{},[598,2784],{"alt":190,"src":2785},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1785.webp",[178,2787,2789],{"id":2788},"异步方式高效","异步方式(高效)",[185,2791,2793],{"className":765,"code":2792,"language":767,"meta":190,"style":190},"#include \"rclcpp\u002Frclcpp.hpp\"\n#include \"serial_driver\u002Fserial_driver.hpp\"\n#include \u003Cstring>\n\nclass Serial_Node : public rclcpp::Node\n{\npublic:\n  Serial_Node() : Node(\"serial_node_cpp\")\n  {\n    \u002F\u002F 等设备准备好再初始化\n    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n\n    \u002F\u002F 串口设备名（根据实际设备调整）\n    const std::string device_name = \"\u002Fdev\u002FttyUSB0\";\n\n    RCLCPP_INFO(this->get_logger(), \"Serial port Node Open!\");\n    \u002F\u002F 创建串口配置对象\n    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n    drivers::serial_driver::SerialPortConfig config(\n        9600,\n        drivers::serial_driver::FlowControl::NONE,\n        drivers::serial_driver::Parity::NONE,\n        drivers::serial_driver::StopBits::ONE);\n\n    \u002F\u002F 初始化串口\n    try\n    {\n      io_context_ = std::make_shared\u003Cdrivers::common::IoContext>(1);\n      \u002F\u002F 初始化 serial_driver_\n      serial_driver_ = std::make_shared\u003Cdrivers::serial_driver::SerialDriver>(*io_context_);\n      serial_driver_->init_port(device_name, config);\n      serial_driver_->port()->open();\n\n      RCLCPP_INFO(this->get_logger(), \"Serial port initialized successfully\");\n      RCLCPP_INFO(this->get_logger(), \"Using device: %s\", serial_driver_->port().get()->device_name().c_str());\n      RCLCPP_INFO(this->get_logger(), \"Baud_rate: %d\", config.get_baud_rate());\n    }\n    catch (const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Failed to initialize serial port: %s\", ex.what());\n      return;\n    }\n\n    async_receive_message();\n  }\n\nprivate:\n  void async_receive_message()  \u002F\u002F创建一个函数更方便重新调用\n  {\n    auto port = serial_driver_->port();\n\n    \u002F\u002F 设置接收回调函数\n    port->async_receive([this](const std::vector\u003Cuint8_t> &data,const size_t &size) \n    {\n        if (size > 0)\n        {\n            \u002F\u002F 处理接收到的数据\n            std::string received_message(data.begin(), data.begin() + size);\n            RCLCPP_INFO(this->get_logger(), \"Received: %s (%ld bytes)\", received_message.c_str(),size);\n        }\n        \u002F\u002F 继续监听新的数据\n        async_receive_message();\n    }\n    );\n  }\n\n  std::shared_ptr\u003Cdrivers::serial_driver::SerialDriver> serial_driver_;\n  std::shared_ptr\u003Cdrivers::common::IoContext> io_context_;\n  std::vector\u003Cuint8_t> receive_data_buffer = std::vector\u003Cuint8_t>(1024); \u002F\u002F 接收缓冲区\n};\n\nint main(int argc, char **argv)\n{\n  rclcpp::init(argc, argv);\n\n  auto node = std::make_shared\u003CSerial_Node>();\n\n  rclcpp::spin(node);\n\n  rclcpp::shutdown();\n  return 0;\n}\n",[72,2794,2795,2801,2807,2813,2817,2833,2837,2841,2855,2859,2863,2867,2871,2875,2889,2893,2911,2915,2919,2933,2939,2953,2967,2981,2985,2989,2993,2997,3027,3031,3061,3069,3081,3085,3103,3141,3167,3171,3187,3191,3217,3223,3227,3231,3238,3242,3246,3250,3263,3267,3281,3285,3290,3344,3348,3362,3367,3372,3398,3432,3437,3442,3449,3453,3458,3462,3466,3486,3506,3539,3543,3547,3569,3573,3583,3587,3607,3611,3621,3625,3635,3643],{"__ignoreMap":190},[194,2796,2797,2799],{"class":196,"line":197},[194,2798,774],{"class":214},[194,2800,777],{"class":204},[194,2802,2803,2805],{"class":196,"line":231},[194,2804,774],{"class":214},[194,2806,784],{"class":204},[194,2808,2809,2811],{"class":196,"line":253},[194,2810,774],{"class":214},[194,2812,1906],{"class":204},[194,2814,2815],{"class":196,"line":260},[194,2816,257],{"emptyLinePlaceholder":256},[194,2818,2819,2821,2823,2825,2827,2829,2831],{"class":196,"line":267},[194,2820,793],{"class":214},[194,2822,796],{"class":200},[194,2824,799],{"class":221},[194,2826,802],{"class":214},[194,2828,574],{"class":200},[194,2830,807],{"class":221},[194,2832,810],{"class":200},[194,2834,2835],{"class":196,"line":279},[194,2836,815],{"class":221},[194,2838,2839],{"class":196,"line":291},[194,2840,820],{"class":214},[194,2842,2843,2845,2847,2849,2851,2853],{"class":196,"line":297},[194,2844,825],{"class":200},[194,2846,828],{"class":221},[194,2848,831],{"class":200},[194,2850,834],{"class":221},[194,2852,837],{"class":204},[194,2854,840],{"class":221},[194,2856,2857],{"class":196,"line":309},[194,2858,845],{"class":221},[194,2860,2861],{"class":196,"line":853},[194,2862,850],{"class":263},[194,2864,2865],{"class":196,"line":859},[194,2866,856],{"class":263},[194,2868,2869],{"class":196,"line":864},[194,2870,257],{"emptyLinePlaceholder":256},[194,2872,2873],{"class":196,"line":870},[194,2874,867],{"class":263},[194,2876,2877,2879,2881,2883,2885,2887],{"class":196,"line":891},[194,2878,873],{"class":214},[194,2880,876],{"class":200},[194,2882,879],{"class":221},[194,2884,882],{"class":214},[194,2886,885],{"class":204},[194,2888,888],{"class":221},[194,2890,2891],{"class":196,"line":896},[194,2892,257],{"emptyLinePlaceholder":256},[194,2894,2895,2897,2899,2901,2903,2905,2907,2909],{"class":196,"line":922},[194,2896,899],{"class":200},[194,2898,834],{"class":221},[194,2900,904],{"class":415},[194,2902,907],{"class":221},[194,2904,910],{"class":200},[194,2906,913],{"class":221},[194,2908,916],{"class":204},[194,2910,919],{"class":221},[194,2912,2913],{"class":196,"line":928},[194,2914,925],{"class":263},[194,2916,2917],{"class":196,"line":934},[194,2918,931],{"class":263},[194,2920,2921,2923,2925,2927,2929,2931],{"class":196,"line":953},[194,2922,937],{"class":200},[194,2924,807],{"class":221},[194,2926,157],{"class":200},[194,2928,944],{"class":221},[194,2930,947],{"class":200},[194,2932,950],{"class":221},[194,2934,2935,2937],{"class":196,"line":962},[194,2936,956],{"class":415},[194,2938,959],{"class":221},[194,2940,2941,2943,2945,2947,2949,2951],{"class":196,"line":980},[194,2942,965],{"class":200},[194,2944,807],{"class":221},[194,2946,157],{"class":200},[194,2948,807],{"class":221},[194,2950,974],{"class":200},[194,2952,977],{"class":221},[194,2954,2955,2957,2959,2961,2963,2965],{"class":196,"line":996},[194,2956,965],{"class":200},[194,2958,807],{"class":221},[194,2960,157],{"class":200},[194,2962,807],{"class":221},[194,2964,991],{"class":200},[194,2966,977],{"class":221},[194,2968,2969,2971,2973,2975,2977,2979],{"class":196,"line":1013},[194,2970,965],{"class":200},[194,2972,807],{"class":221},[194,2974,157],{"class":200},[194,2976,807],{"class":221},[194,2978,1007],{"class":200},[194,2980,1010],{"class":221},[194,2982,2983],{"class":196,"line":1018},[194,2984,257],{"emptyLinePlaceholder":256},[194,2986,2987],{"class":196,"line":1024},[194,2988,1021],{"class":263},[194,2990,2991],{"class":196,"line":1030},[194,2992,1027],{"class":214},[194,2994,2995],{"class":196,"line":1036},[194,2996,1033],{"class":221},[194,2998,2999,3001,3003,3005,3007,3009,3011,3013,3015,3017,3019,3021,3023,3025],{"class":196,"line":1074},[194,3000,1039],{"class":221},[194,3002,882],{"class":214},[194,3004,876],{"class":200},[194,3006,807],{"class":221},[194,3008,1048],{"class":200},[194,3010,215],{"class":221},[194,3012,1053],{"class":200},[194,3014,807],{"class":221},[194,3016,1058],{"class":200},[194,3018,807],{"class":221},[194,3020,1063],{"class":200},[194,3022,1066],{"class":221},[194,3024,1069],{"class":415},[194,3026,919],{"class":221},[194,3028,3029],{"class":196,"line":1080},[194,3030,1077],{"class":263},[194,3032,3033,3035,3037,3039,3041,3043,3045,3047,3049,3051,3053,3055,3057,3059],{"class":196,"line":1115},[194,3034,1083],{"class":221},[194,3036,882],{"class":214},[194,3038,876],{"class":200},[194,3040,807],{"class":221},[194,3042,1048],{"class":200},[194,3044,215],{"class":221},[194,3046,1053],{"class":200},[194,3048,807],{"class":221},[194,3050,157],{"class":200},[194,3052,807],{"class":221},[194,3054,1104],{"class":200},[194,3056,1066],{"class":221},[194,3058,1109],{"class":214},[194,3060,1112],{"class":221},[194,3062,3063,3065,3067],{"class":196,"line":1127},[194,3064,1118],{"class":221},[194,3066,1121],{"class":200},[194,3068,1124],{"class":221},[194,3070,3071,3073,3075,3077,3079],{"class":196,"line":1144},[194,3072,1118],{"class":221},[194,3074,1132],{"class":200},[194,3076,1135],{"class":221},[194,3078,1138],{"class":200},[194,3080,1141],{"class":221},[194,3082,3083],{"class":196,"line":1149},[194,3084,257],{"emptyLinePlaceholder":256},[194,3086,3087,3089,3091,3093,3095,3097,3099,3101],{"class":196,"line":1170},[194,3088,1152],{"class":200},[194,3090,834],{"class":221},[194,3092,904],{"class":415},[194,3094,907],{"class":221},[194,3096,910],{"class":200},[194,3098,913],{"class":221},[194,3100,1165],{"class":204},[194,3102,919],{"class":221},[194,3104,3105,3107,3109,3111,3113,3115,3117,3119,3121,3123,3125,3127,3129,3131,3133,3135,3137,3139],{"class":196,"line":1218},[194,3106,1152],{"class":200},[194,3108,834],{"class":221},[194,3110,904],{"class":415},[194,3112,907],{"class":221},[194,3114,910],{"class":200},[194,3116,913],{"class":221},[194,3118,1185],{"class":204},[194,3120,1188],{"class":415},[194,3122,1191],{"class":204},[194,3124,1194],{"class":221},[194,3126,1132],{"class":200},[194,3128,1199],{"class":221},[194,3130,1202],{"class":200},[194,3132,1135],{"class":221},[194,3134,1207],{"class":200},[194,3136,1199],{"class":221},[194,3138,1212],{"class":200},[194,3140,1215],{"class":221},[194,3142,3143,3145,3147,3149,3151,3153,3155,3157,3159,3161,3163,3165],{"class":196,"line":1249},[194,3144,1152],{"class":200},[194,3146,834],{"class":221},[194,3148,904],{"class":415},[194,3150,907],{"class":221},[194,3152,910],{"class":200},[194,3154,913],{"class":221},[194,3156,1233],{"class":204},[194,3158,1236],{"class":415},[194,3160,1191],{"class":204},[194,3162,1241],{"class":221},[194,3164,1244],{"class":200},[194,3166,1215],{"class":221},[194,3168,3169],{"class":196,"line":1255},[194,3170,1252],{"class":221},[194,3172,3173,3175,3177,3179,3181,3183,3185],{"class":196,"line":1278},[194,3174,1258],{"class":214},[194,3176,1261],{"class":221},[194,3178,1264],{"class":214},[194,3180,876],{"class":200},[194,3182,1269],{"class":221},[194,3184,1272],{"class":214},[194,3186,1275],{"class":221},[194,3188,3189],{"class":196,"line":1283},[194,3190,1033],{"class":221},[194,3192,3193,3195,3197,3199,3201,3203,3205,3207,3209,3211,3213,3215],{"class":196,"line":1314},[194,3194,1286],{"class":200},[194,3196,834],{"class":221},[194,3198,904],{"class":415},[194,3200,907],{"class":221},[194,3202,910],{"class":200},[194,3204,913],{"class":221},[194,3206,1299],{"class":204},[194,3208,1188],{"class":415},[194,3210,1191],{"class":204},[194,3212,1306],{"class":221},[194,3214,1309],{"class":200},[194,3216,1215],{"class":221},[194,3218,3219,3221],{"class":196,"line":1322},[194,3220,1317],{"class":214},[194,3222,888],{"class":221},[194,3224,3225],{"class":196,"line":1327},[194,3226,1252],{"class":221},[194,3228,3229],{"class":196,"line":1332},[194,3230,257],{"emptyLinePlaceholder":256},[194,3232,3233,3236],{"class":196,"line":1338},[194,3234,3235],{"class":200},"    async_receive_message",[194,3237,1141],{"class":221},[194,3239,3240],{"class":196,"line":1356},[194,3241,1408],{"class":221},[194,3243,3244],{"class":196,"line":1380},[194,3245,257],{"emptyLinePlaceholder":256},[194,3247,3248],{"class":196,"line":1405},[194,3249,1419],{"class":214},[194,3251,3252,3254,3257,3260],{"class":196,"line":1411},[194,3253,1425],{"class":214},[194,3255,3256],{"class":200}," async_receive_message",[194,3258,3259],{"class":221},"()",[194,3261,3262],{"class":263},"  \u002F\u002F创建一个函数更方便重新调用\n",[194,3264,3265],{"class":196,"line":1416},[194,3266,845],{"class":221},[194,3268,3269,3271,3273,3275,3277,3279],{"class":196,"line":1422},[194,3270,1508],{"class":214},[194,3272,1511],{"class":221},[194,3274,882],{"class":214},[194,3276,1516],{"class":221},[194,3278,1132],{"class":200},[194,3280,1141],{"class":221},[194,3282,3283],{"class":196,"line":1434},[194,3284,257],{"emptyLinePlaceholder":256},[194,3286,3287],{"class":196,"line":1439},[194,3288,3289],{"class":263},"    \u002F\u002F 设置接收回调函数\n",[194,3291,3292,3295,3297,3300,3302,3305,3307,3309,3311,3314,3316,3319,3322,3324,3327,3330,3332,3335,3338,3341],{"class":196,"line":1445},[194,3293,3294],{"class":221},"    port->",[194,3296,88],{"class":200},[194,3298,3299],{"class":221},"([",[194,3301,904],{"class":415},[194,3303,3304],{"class":221},"](",[194,3306,1264],{"class":214},[194,3308,876],{"class":200},[194,3310,807],{"class":221},[194,3312,3313],{"class":200},"vector",[194,3315,215],{"class":221},[194,3317,3318],{"class":214},"uint8_t",[194,3320,3321],{"class":221},"> ",[194,3323,1272],{"class":214},[194,3325,3326],{"class":1751},"data",[194,3328,3329],{"class":221},",",[194,3331,1264],{"class":214},[194,3333,3334],{"class":214}," size_t",[194,3336,3337],{"class":214}," &",[194,3339,3340],{"class":1751},"size",[194,3342,3343],{"class":221},") \n",[194,3345,3346],{"class":196,"line":1467},[194,3347,1033],{"class":221},[194,3349,3350,3353,3356,3358,3360],{"class":196,"line":1496},[194,3351,3352],{"class":214},"        if",[194,3354,3355],{"class":221}," (size ",[194,3357,225],{"class":214},[194,3359,1857],{"class":415},[194,3361,840],{"class":221},[194,3363,3364],{"class":196,"line":1505},[194,3365,3366],{"class":221},"        {\n",[194,3368,3369],{"class":196,"line":1523},[194,3370,3371],{"class":263},"            \u002F\u002F 处理接收到的数据\n",[194,3373,3374,3377,3379,3382,3384,3386,3389,3391,3393,3395],{"class":196,"line":1528},[194,3375,3376],{"class":200},"            std",[194,3378,2496],{"class":221},[194,3380,3381],{"class":200},"received_message",[194,3383,2502],{"class":221},[194,3385,1485],{"class":200},[194,3387,3388],{"class":221},"(), data.",[194,3390,1485],{"class":200},[194,3392,2512],{"class":221},[194,3394,2515],{"class":214},[194,3396,3397],{"class":221}," size);\n",[194,3399,3400,3403,3405,3407,3409,3411,3413,3416,3418,3420,3422,3424,3427,3429],{"class":196,"line":1533},[194,3401,3402],{"class":200},"            RCLCPP_INFO",[194,3404,834],{"class":221},[194,3406,904],{"class":415},[194,3408,907],{"class":221},[194,3410,910],{"class":200},[194,3412,913],{"class":221},[194,3414,3415],{"class":204},"\"Received: ",[194,3417,1188],{"class":415},[194,3419,1261],{"class":204},[194,3421,1580],{"class":415},[194,3423,1583],{"class":204},[194,3425,3426],{"class":221},", received_message.",[194,3428,1212],{"class":200},[194,3430,3431],{"class":221},"(),size);\n",[194,3433,3434],{"class":196,"line":1538},[194,3435,3436],{"class":221},"        }\n",[194,3438,3439],{"class":196,"line":1558},[194,3440,3441],{"class":263},"        \u002F\u002F 继续监听新的数据\n",[194,3443,3444,3447],{"class":196,"line":1594},[194,3445,3446],{"class":200},"        async_receive_message",[194,3448,1141],{"class":221},[194,3450,3451],{"class":196,"line":1599},[194,3452,1252],{"class":221},[194,3454,3455],{"class":196,"line":1616},[194,3456,3457],{"class":221},"    );\n",[194,3459,3460],{"class":196,"line":1621},[194,3461,1408],{"class":221},[194,3463,3464],{"class":196,"line":1650},[194,3465,257],{"emptyLinePlaceholder":256},[194,3467,3468,3470,3472,3474,3476,3478,3480,3482,3484],{"class":196,"line":1655},[194,3469,1668],{"class":200},[194,3471,1671],{"class":221},[194,3473,215],{"class":214},[194,3475,1053],{"class":200},[194,3477,807],{"class":221},[194,3479,157],{"class":200},[194,3481,1682],{"class":221},[194,3483,225],{"class":214},[194,3485,1687],{"class":221},[194,3487,3488,3490,3492,3494,3496,3498,3500,3502,3504],{"class":196,"line":1660},[194,3489,1668],{"class":200},[194,3491,1671],{"class":221},[194,3493,215],{"class":214},[194,3495,1053],{"class":200},[194,3497,807],{"class":221},[194,3499,1058],{"class":200},[194,3501,1705],{"class":221},[194,3503,225],{"class":214},[194,3505,1710],{"class":221},[194,3507,3508,3510,3512,3514,3517,3519,3521,3523,3525,3527,3529,3531,3534,3536],{"class":196,"line":1665},[194,3509,1668],{"class":200},[194,3511,1473],{"class":221},[194,3513,1476],{"class":214},[194,3515,3516],{"class":221}," receive_data_buffer ",[194,3518,882],{"class":214},[194,3520,876],{"class":200},[194,3522,807],{"class":221},[194,3524,3313],{"class":200},[194,3526,215],{"class":221},[194,3528,3318],{"class":214},[194,3530,1066],{"class":221},[194,3532,3533],{"class":415},"1024",[194,3535,2426],{"class":221},[194,3537,3538],{"class":263}," \u002F\u002F 接收缓冲区\n",[194,3540,3541],{"class":196,"line":1690},[194,3542,1730],{"class":221},[194,3544,3545],{"class":196,"line":1713},[194,3546,257],{"emptyLinePlaceholder":256},[194,3548,3549,3551,3553,3555,3557,3559,3561,3563,3565,3567],{"class":196,"line":1727},[194,3550,1741],{"class":214},[194,3552,1744],{"class":200},[194,3554,834],{"class":221},[194,3556,1741],{"class":214},[194,3558,1752],{"class":1751},[194,3560,1755],{"class":221},[194,3562,1758],{"class":214},[194,3564,1761],{"class":214},[194,3566,1764],{"class":1751},[194,3568,840],{"class":221},[194,3570,3571],{"class":196,"line":1733},[194,3572,815],{"class":221},[194,3574,3575,3577,3579,3581],{"class":196,"line":1738},[194,3576,1716],{"class":200},[194,3578,807],{"class":221},[194,3580,1781],{"class":200},[194,3582,1784],{"class":221},[194,3584,3585],{"class":196,"line":1769},[194,3586,257],{"emptyLinePlaceholder":256},[194,3588,3589,3591,3593,3595,3597,3599,3601,3603,3605],{"class":196,"line":1774},[194,3590,1795],{"class":214},[194,3592,1798],{"class":221},[194,3594,882],{"class":214},[194,3596,876],{"class":200},[194,3598,807],{"class":221},[194,3600,1048],{"class":200},[194,3602,215],{"class":221},[194,3604,1394],{"class":200},[194,3606,1813],{"class":221},[194,3608,3609],{"class":196,"line":1787},[194,3610,257],{"emptyLinePlaceholder":256},[194,3612,3613,3615,3617,3619],{"class":196,"line":1792},[194,3614,1716],{"class":200},[194,3616,807],{"class":221},[194,3618,1828],{"class":200},[194,3620,1831],{"class":221},[194,3622,3623],{"class":196,"line":1816},[194,3624,257],{"emptyLinePlaceholder":256},[194,3626,3627,3629,3631,3633],{"class":196,"line":1821},[194,3628,1716],{"class":200},[194,3630,807],{"class":221},[194,3632,1846],{"class":200},[194,3634,1141],{"class":221},[194,3636,3637,3639,3641],{"class":196,"line":1834},[194,3638,1854],{"class":214},[194,3640,1857],{"class":415},[194,3642,888],{"class":221},[194,3644,3645],{"class":196,"line":1839},[194,3646,1865],{"class":221},[17,3648,3649],{},[598,3650],{"alt":190,"src":3651},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1786.webp",[57,3653,3655],{"id":3654},"总代码又发又收","总代码(又发又收)",[185,3657,3659],{"className":765,"code":3658,"language":767,"meta":190,"style":190},"#include \"rclcpp\u002Frclcpp.hpp\"\n#include \"serial_driver\u002Fserial_driver.hpp\"\n#include \u003Cstring>\n\nclass Serial_Node : public rclcpp::Node\n{\npublic:\n  Serial_Node() : Node(\"serial_node_cpp\")\n  {\n    \u002F\u002F 等设备准备好再初始化\n    \u002F\u002F std::this_thread::sleep_for(std::chrono::milliseconds(500));\n\n    \u002F\u002F 串口设备名（根据实际设备调整）\n    const std::string device_name = \"\u002Fdev\u002FttyUSB0\";\n\n    RCLCPP_INFO(this->get_logger(), \"Serial port Node Open!\");\n    \u002F\u002F 创建串口配置对象\n    \u002F\u002F 波特率115200；不开启流控制；无奇偶效验；停止位1。\n    drivers::serial_driver::SerialPortConfig config(\n        9600,\n        drivers::serial_driver::FlowControl::NONE,\n        drivers::serial_driver::Parity::NONE,\n        drivers::serial_driver::StopBits::ONE);\n\n    \u002F\u002F 初始化串口\n    try\n    {\n      io_context_ = std::make_shared\u003Cdrivers::common::IoContext>(1);\n      \u002F\u002F 初始化 serial_driver_\n      serial_driver_ = std::make_shared\u003Cdrivers::serial_driver::SerialDriver>(*io_context_);\n      serial_driver_->init_port(device_name, config);\n      serial_driver_->port()->open();\n\n      RCLCPP_INFO(this->get_logger(), \"Serial port initialized successfully\");\n      RCLCPP_INFO(this->get_logger(), \"Using device: %s\", serial_driver_->port().get()->device_name().c_str());\n      RCLCPP_INFO(this->get_logger(), \"Baud_rate: %d\", config.get_baud_rate());\n    }\n    catch (const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Failed to initialize serial port: %s\", ex.what());\n      return;\n    }\n\n        \u002F\u002F 设置发送定时器\n    transmit_timer_ = this->create_wall_timer(\n        std::chrono::milliseconds(5000),\n        std::bind(&Serial_Node::send_message_timer_callback, this));\n\n    async_receive_message();   \u002F\u002F进入异步接收\n  }\n\nprivate:\n\n  void send_message_timer_callback()\n  {\n    \u002F\u002F 发送一串字符串\n    const std::string transmitted_message = \"Hello from ROS 2!\\n\";\n    transmit_data_buffer = std::vector\u003Cuint8_t>(transmitted_message.begin(), transmitted_message.end());\n    \u002F\u002F std::vector\u003Cuint8_t> hex_data = {0x48, 0x65, 0x6C, 0x6C, 0x6F}; \u002F\u002F \"Hello\" in ASCII\n    auto port = serial_driver_->port();\n\n    try\n    {\n      size_t bytes_transmit_size = port->send(transmit_data_buffer);\n      RCLCPP_INFO(this->get_logger(), \"Transmitted: %s (%ld bytes)\", transmitted_message.c_str(), bytes_transmit_size);\n    }\n    catch(const std::exception &ex)\n    {\n      RCLCPP_ERROR(this->get_logger(), \"Error Transmiting from serial port:%s\",ex.what());\n    }\n  }\n\n  void async_receive_message()  \u002F\u002F创建一个函数更方便重新调用\n  {\n    auto port = serial_driver_->port();\n\n    \u002F\u002F 设置接收回调函数\n    port->async_receive([this](const std::vector\u003Cuint8_t> &data,const size_t &size) \n    {\n        if (size > 0)\n        {\n            \u002F\u002F 处理接收到的数据\n            std::string received_message(data.begin(), data.begin() + size);\n            RCLCPP_INFO(this->get_logger(), \"Received: %s (%ld bytes)\", received_message.c_str(),size);\n        }\n        \u002F\u002F 继续监听新的数据\n        async_receive_message();\n    }\n    );\n  }\n\n  std::shared_ptr\u003Cdrivers::serial_driver::SerialDriver> serial_driver_;\n  std::shared_ptr\u003Cdrivers::common::IoContext> io_context_;\n  rclcpp::TimerBase::SharedPtr transmit_timer_;\n  std::vector\u003Cuint8_t> transmit_data_buffer = std::vector\u003Cuint8_t>(1024); \u002F\u002F 发送缓冲区\n  std::vector\u003Cuint8_t> receive_data_buffer = std::vector\u003Cuint8_t>(1024);  \u002F\u002F 接收缓冲区\n};\n\nint main(int argc, char **argv)\n{\n  rclcpp::init(argc, argv);\n\n  auto node = std::make_shared\u003CSerial_Node>();\n\n  rclcpp::spin(node);\n\n  rclcpp::shutdown();\n  return 0;\n}\n",[72,3660,3661,3667,3673,3679,3683,3699,3703,3707,3721,3725,3729,3733,3737,3741,3755,3759,3777,3781,3785,3799,3805,3819,3833,3847,3851,3855,3859,3863,3893,3897,3927,3935,3947,3951,3969,4007,4033,4037,4053,4057,4083,4089,4093,4097,4102,4117,4136,4156,4160,4170,4174,4178,4182,4186,4194,4198,4202,4221,4250,4256,4270,4274,4278,4282,4298,4331,4335,4351,4355,4381,4385,4389,4393,4403,4407,4421,4425,4429,4471,4475,4487,4491,4495,4517,4547,4551,4555,4562,4567,4572,4577,4582,4603,4624,4636,4669,4701,4706,4711,4734,4739,4750,4755,4776,4781,4792,4797,4808,4817],{"__ignoreMap":190},[194,3662,3663,3665],{"class":196,"line":197},[194,3664,774],{"class":214},[194,3666,777],{"class":204},[194,3668,3669,3671],{"class":196,"line":231},[194,3670,774],{"class":214},[194,3672,784],{"class":204},[194,3674,3675,3677],{"class":196,"line":253},[194,3676,774],{"class":214},[194,3678,1906],{"class":204},[194,3680,3681],{"class":196,"line":260},[194,3682,257],{"emptyLinePlaceholder":256},[194,3684,3685,3687,3689,3691,3693,3695,3697],{"class":196,"line":267},[194,3686,793],{"class":214},[194,3688,796],{"class":200},[194,3690,799],{"class":221},[194,3692,802],{"class":214},[194,3694,574],{"class":200},[194,3696,807],{"class":221},[194,3698,810],{"class":200},[194,3700,3701],{"class":196,"line":279},[194,3702,815],{"class":221},[194,3704,3705],{"class":196,"line":291},[194,3706,820],{"class":214},[194,3708,3709,3711,3713,3715,3717,3719],{"class":196,"line":297},[194,3710,825],{"class":200},[194,3712,828],{"class":221},[194,3714,831],{"class":200},[194,3716,834],{"class":221},[194,3718,837],{"class":204},[194,3720,840],{"class":221},[194,3722,3723],{"class":196,"line":309},[194,3724,845],{"class":221},[194,3726,3727],{"class":196,"line":853},[194,3728,850],{"class":263},[194,3730,3731],{"class":196,"line":859},[194,3732,856],{"class":263},[194,3734,3735],{"class":196,"line":864},[194,3736,257],{"emptyLinePlaceholder":256},[194,3738,3739],{"class":196,"line":870},[194,3740,867],{"class":263},[194,3742,3743,3745,3747,3749,3751,3753],{"class":196,"line":891},[194,3744,873],{"class":214},[194,3746,876],{"class":200},[194,3748,879],{"class":221},[194,3750,882],{"class":214},[194,3752,885],{"class":204},[194,3754,888],{"class":221},[194,3756,3757],{"class":196,"line":896},[194,3758,257],{"emptyLinePlaceholder":256},[194,3760,3761,3763,3765,3767,3769,3771,3773,3775],{"class":196,"line":922},[194,3762,899],{"class":200},[194,3764,834],{"class":221},[194,3766,904],{"class":415},[194,3768,907],{"class":221},[194,3770,910],{"class":200},[194,3772,913],{"class":221},[194,3774,916],{"class":204},[194,3776,919],{"class":221},[194,3778,3779],{"class":196,"line":928},[194,3780,925],{"class":263},[194,3782,3783],{"class":196,"line":934},[194,3784,931],{"class":263},[194,3786,3787,3789,3791,3793,3795,3797],{"class":196,"line":953},[194,3788,937],{"class":200},[194,3790,807],{"class":221},[194,3792,157],{"class":200},[194,3794,944],{"class":221},[194,3796,947],{"class":200},[194,3798,950],{"class":221},[194,3800,3801,3803],{"class":196,"line":962},[194,3802,956],{"class":415},[194,3804,959],{"class":221},[194,3806,3807,3809,3811,3813,3815,3817],{"class":196,"line":980},[194,3808,965],{"class":200},[194,3810,807],{"class":221},[194,3812,157],{"class":200},[194,3814,807],{"class":221},[194,3816,974],{"class":200},[194,3818,977],{"class":221},[194,3820,3821,3823,3825,3827,3829,3831],{"class":196,"line":996},[194,3822,965],{"class":200},[194,3824,807],{"class":221},[194,3826,157],{"class":200},[194,3828,807],{"class":221},[194,3830,991],{"class":200},[194,3832,977],{"class":221},[194,3834,3835,3837,3839,3841,3843,3845],{"class":196,"line":1013},[194,3836,965],{"class":200},[194,3838,807],{"class":221},[194,3840,157],{"class":200},[194,3842,807],{"class":221},[194,3844,1007],{"class":200},[194,3846,1010],{"class":221},[194,3848,3849],{"class":196,"line":1018},[194,3850,257],{"emptyLinePlaceholder":256},[194,3852,3853],{"class":196,"line":1024},[194,3854,1021],{"class":263},[194,3856,3857],{"class":196,"line":1030},[194,3858,1027],{"class":214},[194,3860,3861],{"class":196,"line":1036},[194,3862,1033],{"class":221},[194,3864,3865,3867,3869,3871,3873,3875,3877,3879,3881,3883,3885,3887,3889,3891],{"class":196,"line":1074},[194,3866,1039],{"class":221},[194,3868,882],{"class":214},[194,3870,876],{"class":200},[194,3872,807],{"class":221},[194,3874,1048],{"class":200},[194,3876,215],{"class":221},[194,3878,1053],{"class":200},[194,3880,807],{"class":221},[194,3882,1058],{"class":200},[194,3884,807],{"class":221},[194,3886,1063],{"class":200},[194,3888,1066],{"class":221},[194,3890,1069],{"class":415},[194,3892,919],{"class":221},[194,3894,3895],{"class":196,"line":1080},[194,3896,1077],{"class":263},[194,3898,3899,3901,3903,3905,3907,3909,3911,3913,3915,3917,3919,3921,3923,3925],{"class":196,"line":1115},[194,3900,1083],{"class":221},[194,3902,882],{"class":214},[194,3904,876],{"class":200},[194,3906,807],{"class":221},[194,3908,1048],{"class":200},[194,3910,215],{"class":221},[194,3912,1053],{"class":200},[194,3914,807],{"class":221},[194,3916,157],{"class":200},[194,3918,807],{"class":221},[194,3920,1104],{"class":200},[194,3922,1066],{"class":221},[194,3924,1109],{"class":214},[194,3926,1112],{"class":221},[194,3928,3929,3931,3933],{"class":196,"line":1127},[194,3930,1118],{"class":221},[194,3932,1121],{"class":200},[194,3934,1124],{"class":221},[194,3936,3937,3939,3941,3943,3945],{"class":196,"line":1144},[194,3938,1118],{"class":221},[194,3940,1132],{"class":200},[194,3942,1135],{"class":221},[194,3944,1138],{"class":200},[194,3946,1141],{"class":221},[194,3948,3949],{"class":196,"line":1149},[194,3950,257],{"emptyLinePlaceholder":256},[194,3952,3953,3955,3957,3959,3961,3963,3965,3967],{"class":196,"line":1170},[194,3954,1152],{"class":200},[194,3956,834],{"class":221},[194,3958,904],{"class":415},[194,3960,907],{"class":221},[194,3962,910],{"class":200},[194,3964,913],{"class":221},[194,3966,1165],{"class":204},[194,3968,919],{"class":221},[194,3970,3971,3973,3975,3977,3979,3981,3983,3985,3987,3989,3991,3993,3995,3997,3999,4001,4003,4005],{"class":196,"line":1218},[194,3972,1152],{"class":200},[194,3974,834],{"class":221},[194,3976,904],{"class":415},[194,3978,907],{"class":221},[194,3980,910],{"class":200},[194,3982,913],{"class":221},[194,3984,1185],{"class":204},[194,3986,1188],{"class":415},[194,3988,1191],{"class":204},[194,3990,1194],{"class":221},[194,3992,1132],{"class":200},[194,3994,1199],{"class":221},[194,3996,1202],{"class":200},[194,3998,1135],{"class":221},[194,4000,1207],{"class":200},[194,4002,1199],{"class":221},[194,4004,1212],{"class":200},[194,4006,1215],{"class":221},[194,4008,4009,4011,4013,4015,4017,4019,4021,4023,4025,4027,4029,4031],{"class":196,"line":1249},[194,4010,1152],{"class":200},[194,4012,834],{"class":221},[194,4014,904],{"class":415},[194,4016,907],{"class":221},[194,4018,910],{"class":200},[194,4020,913],{"class":221},[194,4022,1233],{"class":204},[194,4024,1236],{"class":415},[194,4026,1191],{"class":204},[194,4028,1241],{"class":221},[194,4030,1244],{"class":200},[194,4032,1215],{"class":221},[194,4034,4035],{"class":196,"line":1255},[194,4036,1252],{"class":221},[194,4038,4039,4041,4043,4045,4047,4049,4051],{"class":196,"line":1278},[194,4040,1258],{"class":214},[194,4042,1261],{"class":221},[194,4044,1264],{"class":214},[194,4046,876],{"class":200},[194,4048,1269],{"class":221},[194,4050,1272],{"class":214},[194,4052,1275],{"class":221},[194,4054,4055],{"class":196,"line":1283},[194,4056,1033],{"class":221},[194,4058,4059,4061,4063,4065,4067,4069,4071,4073,4075,4077,4079,4081],{"class":196,"line":1314},[194,4060,1286],{"class":200},[194,4062,834],{"class":221},[194,4064,904],{"class":415},[194,4066,907],{"class":221},[194,4068,910],{"class":200},[194,4070,913],{"class":221},[194,4072,1299],{"class":204},[194,4074,1188],{"class":415},[194,4076,1191],{"class":204},[194,4078,1306],{"class":221},[194,4080,1309],{"class":200},[194,4082,1215],{"class":221},[194,4084,4085,4087],{"class":196,"line":1322},[194,4086,1317],{"class":214},[194,4088,888],{"class":221},[194,4090,4091],{"class":196,"line":1327},[194,4092,1252],{"class":221},[194,4094,4095],{"class":196,"line":1332},[194,4096,257],{"emptyLinePlaceholder":256},[194,4098,4099],{"class":196,"line":1338},[194,4100,4101],{"class":263},"        \u002F\u002F 设置发送定时器\n",[194,4103,4104,4107,4109,4111,4113,4115],{"class":196,"line":1356},[194,4105,4106],{"class":221},"    transmit_timer_ ",[194,4108,882],{"class":214},[194,4110,1346],{"class":415},[194,4112,907],{"class":221},[194,4114,1351],{"class":200},[194,4116,950],{"class":221},[194,4118,4119,4121,4123,4125,4127,4129,4131,4134],{"class":196,"line":1380},[194,4120,1359],{"class":200},[194,4122,807],{"class":221},[194,4124,1364],{"class":200},[194,4126,807],{"class":221},[194,4128,1369],{"class":200},[194,4130,834],{"class":221},[194,4132,4133],{"class":415},"5000",[194,4135,1377],{"class":221},[194,4137,4138,4140,4142,4144,4146,4148,4150,4152,4154],{"class":196,"line":1405},[194,4139,1359],{"class":200},[194,4141,807],{"class":221},[194,4143,1387],{"class":200},[194,4145,834],{"class":221},[194,4147,1272],{"class":214},[194,4149,1394],{"class":200},[194,4151,1397],{"class":221},[194,4153,904],{"class":415},[194,4155,1402],{"class":221},[194,4157,4158],{"class":196,"line":1411},[194,4159,257],{"emptyLinePlaceholder":256},[194,4161,4162,4164,4167],{"class":196,"line":1416},[194,4163,3235],{"class":200},[194,4165,4166],{"class":221},"();",[194,4168,4169],{"class":263},"   \u002F\u002F进入异步接收\n",[194,4171,4172],{"class":196,"line":1422},[194,4173,1408],{"class":221},[194,4175,4176],{"class":196,"line":1434},[194,4177,257],{"emptyLinePlaceholder":256},[194,4179,4180],{"class":196,"line":1439},[194,4181,1419],{"class":214},[194,4183,4184],{"class":196,"line":1445},[194,4185,257],{"emptyLinePlaceholder":256},[194,4187,4188,4190,4192],{"class":196,"line":1467},[194,4189,1425],{"class":214},[194,4191,1428],{"class":200},[194,4193,1431],{"class":221},[194,4195,4196],{"class":196,"line":1496},[194,4197,845],{"class":221},[194,4199,4200],{"class":196,"line":1505},[194,4201,1442],{"class":263},[194,4203,4204,4206,4208,4211,4213,4215,4217,4219],{"class":196,"line":1523},[194,4205,873],{"class":214},[194,4207,876],{"class":200},[194,4209,4210],{"class":221},"::string transmitted_message ",[194,4212,882],{"class":214},[194,4214,1457],{"class":204},[194,4216,1460],{"class":415},[194,4218,1191],{"class":204},[194,4220,888],{"class":221},[194,4222,4223,4226,4228,4230,4232,4234,4236,4238,4241,4243,4246,4248],{"class":196,"line":1528},[194,4224,4225],{"class":221},"    transmit_data_buffer ",[194,4227,882],{"class":214},[194,4229,876],{"class":200},[194,4231,807],{"class":221},[194,4233,3313],{"class":200},[194,4235,215],{"class":221},[194,4237,3318],{"class":214},[194,4239,4240],{"class":221},">(transmitted_message.",[194,4242,1485],{"class":200},[194,4244,4245],{"class":221},"(), transmitted_message.",[194,4247,1491],{"class":200},[194,4249,1215],{"class":221},[194,4251,4252,4254],{"class":196,"line":1533},[194,4253,1499],{"class":263},[194,4255,1502],{"class":263},[194,4257,4258,4260,4262,4264,4266,4268],{"class":196,"line":1538},[194,4259,1508],{"class":214},[194,4261,1511],{"class":221},[194,4263,882],{"class":214},[194,4265,1516],{"class":221},[194,4267,1132],{"class":200},[194,4269,1141],{"class":221},[194,4271,4272],{"class":196,"line":1558},[194,4273,257],{"emptyLinePlaceholder":256},[194,4275,4276],{"class":196,"line":1594},[194,4277,1027],{"class":214},[194,4279,4280],{"class":196,"line":1599},[194,4281,1033],{"class":221},[194,4283,4284,4286,4289,4291,4293,4295],{"class":196,"line":1616},[194,4285,1541],{"class":214},[194,4287,4288],{"class":221}," bytes_transmit_size ",[194,4290,882],{"class":214},[194,4292,1549],{"class":221},[194,4294,1552],{"class":200},[194,4296,4297],{"class":221},"(transmit_data_buffer);\n",[194,4299,4300,4302,4304,4306,4308,4310,4312,4315,4317,4319,4321,4323,4326,4328],{"class":196,"line":1621},[194,4301,1152],{"class":200},[194,4303,834],{"class":221},[194,4305,904],{"class":415},[194,4307,907],{"class":221},[194,4309,910],{"class":200},[194,4311,913],{"class":221},[194,4313,4314],{"class":204},"\"Transmitted: ",[194,4316,1188],{"class":415},[194,4318,1261],{"class":204},[194,4320,1580],{"class":415},[194,4322,1583],{"class":204},[194,4324,4325],{"class":221},", transmitted_message.",[194,4327,1212],{"class":200},[194,4329,4330],{"class":221},"(), bytes_transmit_size);\n",[194,4332,4333],{"class":196,"line":1650},[194,4334,1252],{"class":221},[194,4336,4337,4339,4341,4343,4345,4347,4349],{"class":196,"line":1655},[194,4338,1258],{"class":214},[194,4340,834],{"class":221},[194,4342,1264],{"class":214},[194,4344,876],{"class":200},[194,4346,1269],{"class":221},[194,4348,1272],{"class":214},[194,4350,1275],{"class":221},[194,4352,4353],{"class":196,"line":1660},[194,4354,1033],{"class":221},[194,4356,4357,4359,4361,4363,4365,4367,4369,4371,4373,4375,4377,4379],{"class":196,"line":1665},[194,4358,1286],{"class":200},[194,4360,834],{"class":221},[194,4362,904],{"class":415},[194,4364,907],{"class":221},[194,4366,910],{"class":200},[194,4368,913],{"class":221},[194,4370,1636],{"class":204},[194,4372,1188],{"class":415},[194,4374,1191],{"class":204},[194,4376,1643],{"class":221},[194,4378,1309],{"class":200},[194,4380,1215],{"class":221},[194,4382,4383],{"class":196,"line":1690},[194,4384,1252],{"class":221},[194,4386,4387],{"class":196,"line":1713},[194,4388,1408],{"class":221},[194,4390,4391],{"class":196,"line":1727},[194,4392,257],{"emptyLinePlaceholder":256},[194,4394,4395,4397,4399,4401],{"class":196,"line":1733},[194,4396,1425],{"class":214},[194,4398,3256],{"class":200},[194,4400,3259],{"class":221},[194,4402,3262],{"class":263},[194,4404,4405],{"class":196,"line":1738},[194,4406,845],{"class":221},[194,4408,4409,4411,4413,4415,4417,4419],{"class":196,"line":1769},[194,4410,1508],{"class":214},[194,4412,1511],{"class":221},[194,4414,882],{"class":214},[194,4416,1516],{"class":221},[194,4418,1132],{"class":200},[194,4420,1141],{"class":221},[194,4422,4423],{"class":196,"line":1774},[194,4424,257],{"emptyLinePlaceholder":256},[194,4426,4427],{"class":196,"line":1787},[194,4428,3289],{"class":263},[194,4430,4431,4433,4435,4437,4439,4441,4443,4445,4447,4449,4451,4453,4455,4457,4459,4461,4463,4465,4467,4469],{"class":196,"line":1792},[194,4432,3294],{"class":221},[194,4434,88],{"class":200},[194,4436,3299],{"class":221},[194,4438,904],{"class":415},[194,4440,3304],{"class":221},[194,4442,1264],{"class":214},[194,4444,876],{"class":200},[194,4446,807],{"class":221},[194,4448,3313],{"class":200},[194,4450,215],{"class":221},[194,4452,3318],{"class":214},[194,4454,3321],{"class":221},[194,4456,1272],{"class":214},[194,4458,3326],{"class":1751},[194,4460,3329],{"class":221},[194,4462,1264],{"class":214},[194,4464,3334],{"class":214},[194,4466,3337],{"class":214},[194,4468,3340],{"class":1751},[194,4470,3343],{"class":221},[194,4472,4473],{"class":196,"line":1816},[194,4474,1033],{"class":221},[194,4476,4477,4479,4481,4483,4485],{"class":196,"line":1821},[194,4478,3352],{"class":214},[194,4480,3355],{"class":221},[194,4482,225],{"class":214},[194,4484,1857],{"class":415},[194,4486,840],{"class":221},[194,4488,4489],{"class":196,"line":1834},[194,4490,3366],{"class":221},[194,4492,4493],{"class":196,"line":1839},[194,4494,3371],{"class":263},[194,4496,4497,4499,4501,4503,4505,4507,4509,4511,4513,4515],{"class":196,"line":1851},[194,4498,3376],{"class":200},[194,4500,2496],{"class":221},[194,4502,3381],{"class":200},[194,4504,2502],{"class":221},[194,4506,1485],{"class":200},[194,4508,3388],{"class":221},[194,4510,1485],{"class":200},[194,4512,2512],{"class":221},[194,4514,2515],{"class":214},[194,4516,3397],{"class":221},[194,4518,4519,4521,4523,4525,4527,4529,4531,4533,4535,4537,4539,4541,4543,4545],{"class":196,"line":1862},[194,4520,3402],{"class":200},[194,4522,834],{"class":221},[194,4524,904],{"class":415},[194,4526,907],{"class":221},[194,4528,910],{"class":200},[194,4530,913],{"class":221},[194,4532,3415],{"class":204},[194,4534,1188],{"class":415},[194,4536,1261],{"class":204},[194,4538,1580],{"class":415},[194,4540,1583],{"class":204},[194,4542,3426],{"class":221},[194,4544,1212],{"class":200},[194,4546,3431],{"class":221},[194,4548,4549],{"class":196,"line":2769},[194,4550,3436],{"class":221},[194,4552,4553],{"class":196,"line":2778},[194,4554,3441],{"class":263},[194,4556,4558,4560],{"class":196,"line":4557},87,[194,4559,3446],{"class":200},[194,4561,1141],{"class":221},[194,4563,4565],{"class":196,"line":4564},88,[194,4566,1252],{"class":221},[194,4568,4570],{"class":196,"line":4569},89,[194,4571,3457],{"class":221},[194,4573,4575],{"class":196,"line":4574},90,[194,4576,1408],{"class":221},[194,4578,4580],{"class":196,"line":4579},91,[194,4581,257],{"emptyLinePlaceholder":256},[194,4583,4585,4587,4589,4591,4593,4595,4597,4599,4601],{"class":196,"line":4584},92,[194,4586,1668],{"class":200},[194,4588,1671],{"class":221},[194,4590,215],{"class":214},[194,4592,1053],{"class":200},[194,4594,807],{"class":221},[194,4596,157],{"class":200},[194,4598,1682],{"class":221},[194,4600,225],{"class":214},[194,4602,1687],{"class":221},[194,4604,4606,4608,4610,4612,4614,4616,4618,4620,4622],{"class":196,"line":4605},93,[194,4607,1668],{"class":200},[194,4609,1671],{"class":221},[194,4611,215],{"class":214},[194,4613,1053],{"class":200},[194,4615,807],{"class":221},[194,4617,1058],{"class":200},[194,4619,1705],{"class":221},[194,4621,225],{"class":214},[194,4623,1710],{"class":221},[194,4625,4627,4629,4631,4633],{"class":196,"line":4626},94,[194,4628,1716],{"class":200},[194,4630,807],{"class":221},[194,4632,1721],{"class":200},[194,4634,4635],{"class":221},"::SharedPtr transmit_timer_;\n",[194,4637,4639,4641,4643,4645,4648,4650,4652,4654,4656,4658,4660,4662,4664,4666],{"class":196,"line":4638},95,[194,4640,1668],{"class":200},[194,4642,1473],{"class":221},[194,4644,1476],{"class":214},[194,4646,4647],{"class":221}," transmit_data_buffer ",[194,4649,882],{"class":214},[194,4651,876],{"class":200},[194,4653,807],{"class":221},[194,4655,3313],{"class":200},[194,4657,215],{"class":221},[194,4659,3318],{"class":214},[194,4661,1066],{"class":221},[194,4663,3533],{"class":415},[194,4665,2426],{"class":221},[194,4667,4668],{"class":263}," \u002F\u002F 发送缓冲区\n",[194,4670,4672,4674,4676,4678,4680,4682,4684,4686,4688,4690,4692,4694,4696,4698],{"class":196,"line":4671},96,[194,4673,1668],{"class":200},[194,4675,1473],{"class":221},[194,4677,1476],{"class":214},[194,4679,3516],{"class":221},[194,4681,882],{"class":214},[194,4683,876],{"class":200},[194,4685,807],{"class":221},[194,4687,3313],{"class":200},[194,4689,215],{"class":221},[194,4691,3318],{"class":214},[194,4693,1066],{"class":221},[194,4695,3533],{"class":415},[194,4697,2426],{"class":221},[194,4699,4700],{"class":263},"  \u002F\u002F 接收缓冲区\n",[194,4702,4704],{"class":196,"line":4703},97,[194,4705,1730],{"class":221},[194,4707,4709],{"class":196,"line":4708},98,[194,4710,257],{"emptyLinePlaceholder":256},[194,4712,4714,4716,4718,4720,4722,4724,4726,4728,4730,4732],{"class":196,"line":4713},99,[194,4715,1741],{"class":214},[194,4717,1744],{"class":200},[194,4719,834],{"class":221},[194,4721,1741],{"class":214},[194,4723,1752],{"class":1751},[194,4725,1755],{"class":221},[194,4727,1758],{"class":214},[194,4729,1761],{"class":214},[194,4731,1764],{"class":1751},[194,4733,840],{"class":221},[194,4735,4737],{"class":196,"line":4736},100,[194,4738,815],{"class":221},[194,4740,4742,4744,4746,4748],{"class":196,"line":4741},101,[194,4743,1716],{"class":200},[194,4745,807],{"class":221},[194,4747,1781],{"class":200},[194,4749,1784],{"class":221},[194,4751,4753],{"class":196,"line":4752},102,[194,4754,257],{"emptyLinePlaceholder":256},[194,4756,4758,4760,4762,4764,4766,4768,4770,4772,4774],{"class":196,"line":4757},103,[194,4759,1795],{"class":214},[194,4761,1798],{"class":221},[194,4763,882],{"class":214},[194,4765,876],{"class":200},[194,4767,807],{"class":221},[194,4769,1048],{"class":200},[194,4771,215],{"class":221},[194,4773,1394],{"class":200},[194,4775,1813],{"class":221},[194,4777,4779],{"class":196,"line":4778},104,[194,4780,257],{"emptyLinePlaceholder":256},[194,4782,4784,4786,4788,4790],{"class":196,"line":4783},105,[194,4785,1716],{"class":200},[194,4787,807],{"class":221},[194,4789,1828],{"class":200},[194,4791,1831],{"class":221},[194,4793,4795],{"class":196,"line":4794},106,[194,4796,257],{"emptyLinePlaceholder":256},[194,4798,4800,4802,4804,4806],{"class":196,"line":4799},107,[194,4801,1716],{"class":200},[194,4803,807],{"class":221},[194,4805,1846],{"class":200},[194,4807,1141],{"class":221},[194,4809,4811,4813,4815],{"class":196,"line":4810},108,[194,4812,1854],{"class":214},[194,4814,1857],{"class":415},[194,4816,888],{"class":221},[194,4818,4820],{"class":196,"line":4819},109,[194,4821,1865],{"class":221},[17,4823,4824],{},[598,4825],{"alt":190,"src":4826},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1787.webp",[17,4828,4829,4832],{},[598,4830],{"alt":190,"src":4831},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1788.webp",[598,4833],{"alt":190,"src":4834},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2023\u002F12\u002F30\u002Fimage1789.webp",[57,4836,4837],{"id":4837},"注意事项",[539,4839,4840],{},[107,4841,4842,4843,4846,4847,4849],{},"禁止引用",[72,4844,4845],{},"boost\u002Fasio.hpp","：由于该库的原理就是boost库，而且是ROS2自带的boost库，所以你用通用版的",[72,4848,4845],{},"，会导致报错出现很多标志重复的问题。",[4851,4852,4853],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":190,"searchDepth":231,"depth":231,"links":4855},[4856,4857],{"id":14,"depth":253,"text":15},{"id":30,"depth":253,"text":31},"1300-0100-0200","2023-12-30","2023-12-30-ros2-tutorial","\u002Fwiki\u002F2023-12-30-ros2-tutorial","Ros2 Tutorial","md",false,{},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2-serial-driver",{"title":5,"description":190},"wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0200-ros2_serial_driver","N0Y_uWGWK6q62EQCxHQnz6Xsh0_sxMAq7OB_5Hr76Jo",[4871,4878,4884,4890,4896,4902,4908,4914,4920,4926,4932,4938,4944,4950,4956,4962,4968,4974,4980,4986,4992,4998,5004,5010,5016,5022,5028,5034,5040,5046,5048,5054,5060,5066,5072,5077,5083,5088,5094,5100,5106,5112,5118,5124,5130,5136,5142,5148,5154,5160,5166,5172,5178,5184,5190,5196,5202,5208,5214,5220,5226,5232,5238,5244,5250,5256,5262,5268,5274],{"path":4872,"stem":4873,"title":4874,"authors":4875,"date":4859,"chapterOrder":4876,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0100-ros2-jie-shao","wiki\u002F2023-12-30-ros2-tutorial\u002F0100-ROS2介绍","ROS2介绍",[7],"0100",0,{"path":4879,"stem":4880,"title":4881,"authors":4882,"date":4859,"chapterOrder":4883,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0200-ru-men-cao-zuo","wiki\u002F2023-12-30-ros2-tutorial\u002F0200-入门操作","入门操作",[7],"0200",{"path":4885,"stem":4886,"title":4887,"authors":4888,"date":4859,"chapterOrder":4889,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0300-gong-zuo-kong-jian-yu-gong-neng-bao","wiki\u002F2023-12-30-ros2-tutorial\u002F0300-工作空间与功能包","工作空间与功能包",[7],"0300",{"path":4891,"stem":4892,"title":4893,"authors":4894,"date":4859,"chapterOrder":4895,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0400-si-da-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F0400-四大通信","四大通信",[7],"0400",{"path":4897,"stem":4898,"title":4899,"authors":4900,"date":4859,"chapterOrder":4901,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0500-ros2-qi-ta-tong-xin-ji-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F0500-ROS2其他通信机制","ROS2其他通信机制",[7],"0500",{"path":4903,"stem":4904,"title":4905,"authors":4906,"date":4859,"chapterOrder":4907,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0600-launch","wiki\u002F2023-12-30-ros2-tutorial\u002F0600-Launch","Launch",[7],"0600",{"path":4909,"stem":4910,"title":4911,"authors":4912,"date":4859,"chapterOrder":4913,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0700-hui-su-rosbag2","wiki\u002F2023-12-30-ros2-tutorial\u002F0700-回溯rosbag2","回溯rosbag2",[7],"0700",{"path":4915,"stem":4916,"title":4917,"authors":4918,"date":4859,"chapterOrder":4919,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0800-zuo-biao-bian-huan-tf","wiki\u002F2023-12-30-ros2-tutorial\u002F0800-坐标变换TF","坐标变换TF",[7],"0800",{"path":4921,"stem":4922,"title":4923,"authors":4924,"date":4859,"chapterOrder":4925,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F0900-ke-shi-hua-ping-tai-rviz2-yu-urdf-jian-mo-yu-yan","wiki\u002F2023-12-30-ros2-tutorial\u002F0900-可视化平台RVIZ2与URDF建模语言","可视化平台RVIZ2与URDF建模语言",[7],"0900",{"path":4927,"stem":4928,"title":4929,"authors":4930,"date":4859,"chapterOrder":4931,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1000-stage-ros2-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1000-Stage_Ros2仿真平台","Stage_Ros2仿真平台",[7],"1000",{"path":4933,"stem":4934,"title":4935,"authors":4936,"date":4859,"chapterOrder":4937,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-gazeboclassic","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0100-GazeboClassic","Gezebo Classic",[7],"1100-0100",{"path":4939,"stem":4940,"title":4941,"authors":4942,"date":4859,"chapterOrder":4943,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-ignitiongazebo","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0200-IgnitionGazebo","Ignition Gazebo（Gazebo Fortress）",[7],"1100-0200",{"path":4945,"stem":4946,"title":4947,"authors":4948,"date":4859,"chapterOrder":4949,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-gazebosim","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0300-GazeboSim","Gz Sim（Gazebo Harmonic）",[7],"1100-0300",{"path":4951,"stem":4952,"title":4953,"authors":4954,"date":4859,"chapterOrder":4955,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-igngz2gzsim","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-0400-Igngz2gzsim","将Ign Gazebo迁移至Gz Sim",[7],"1100-0400",{"path":4957,"stem":4958,"title":4959,"authors":4960,"date":4859,"chapterOrder":4961,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1100-gezebo-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1100-Gezebo仿真平台","Gezebo仿真平台",[7],"1100",{"path":4963,"stem":4964,"title":4965,"authors":4966,"date":4859,"chapterOrder":4967,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-humble-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0100-Humble版本","Humble导航仿真",[7],"1200-0100",{"path":4969,"stem":4970,"title":4971,"authors":4972,"date":4859,"chapterOrder":4973,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-jazzy-ban-ben","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0200-Jazzy版本","Jazzy导航仿真",[7],"1200-0200",{"path":4975,"stem":4976,"title":4977,"authors":4978,"date":4859,"chapterOrder":4979,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-humble2jazzy","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0300-Humble2Jazzy","Humble与Jazzy导航的差异",[7],"1200-0300",{"path":4981,"stem":4982,"title":4983,"authors":4984,"date":4859,"chapterOrder":4985,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-you-xian-zhuang-tai-ji-fsm","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0100-有限状态机FSM","有限状态机（Finite State Machine）",[7],"1200-0400-0100",{"path":4987,"stem":4988,"title":4989,"authors":4990,"date":4859,"chapterOrder":4991,"chapterDepth":253,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-ji-ben-gai-nian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0100-基本概念","基本概念",[7],"1200-0400-0200-0100",{"path":4993,"stem":4994,"title":4995,"authors":4996,"date":4859,"chapterOrder":4997,"chapterDepth":253,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-kong-zhi-yu-zhuang-shi-gui-ze","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0200-控制与装饰规则","控制与装饰规则",[7],"1200-0400-0200-0200",{"path":4999,"stem":5000,"title":5001,"authors":5002,"date":4859,"chapterOrder":5003,"chapterDepth":253,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-di-yi-ge-wan-zheng-cheng-xu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0300-第一个完整程序","第一个完整程序",[7],"1200-0400-0200-0300",{"path":5005,"stem":5006,"title":5007,"authors":5008,"date":4859,"chapterOrder":5009,"chapterDepth":253,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-jie-dian-zhi-jian-chuan-shu-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0400-节点之间传数据","节点之间传数据",[7],"1200-0400-0200-0400",{"path":5011,"stem":5012,"title":5013,"authors":5014,"date":4859,"chapterOrder":5015,"chapterDepth":253,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-chi-xu-ren-wu-yu-zhong-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0500-持续任务与中止","持续任务与中止",[7],"1200-0400-0200-0500",{"path":5017,"stem":5018,"title":5019,"authors":5020,"date":4859,"chapterOrder":5021,"chapterDepth":253,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-zu-he-shi-ji-ren-wu","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-0600-组合实际任务","组合实际任务",[7],"1200-0400-0200-0600",{"path":5023,"stem":5024,"title":5025,"authors":5026,"date":4859,"chapterOrder":5027,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-xing-wei-shu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-0200-行为树BT","行为树（BehaviorTree.CPP）",[7],"1200-0400-0200",{"path":5029,"stem":5030,"title":5031,"authors":5032,"date":4859,"chapterOrder":5033,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-fsm-yu-bt","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-0400-FSM与BT","有限状态机FSM与行为树BT",[7],"1200-0400",{"path":5035,"stem":5036,"title":5037,"authors":5038,"date":4859,"chapterOrder":5039,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1200-ji-qi-ren-dao-hang-navigation2-fang-zhen-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1200-机器人导航Navigation2(仿真篇)","机器人导航Navigation2(仿真篇)",[7],"1200",{"path":5041,"stem":5042,"title":5043,"authors":5044,"date":4859,"chapterOrder":5045,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-0100-Boost.Aiso","Boost.Asio库",[7],"1300-0100-0100",{"path":4866,"stem":4868,"title":5,"authors":5047,"date":4859,"chapterOrder":4858,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},[7],{"path":5049,"stem":5050,"title":5051,"authors":5052,"date":4859,"chapterOrder":5053,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-chuan-kou-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0100-串口通信","UART串口通信",[7],"1300-0100",{"path":5055,"stem":5056,"title":5057,"authors":5058,"date":4859,"chapterOrder":5059,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0100-socketcan","SocketCAN",[7],"1300-0200-0100",{"path":5061,"stem":5062,"title":5063,"authors":5064,"date":4859,"chapterOrder":5065,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2-socketcan","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-0200-ros2_socketcan","ROS2_SocketCAN",[7],"1300-0200-0200",{"path":5067,"stem":5068,"title":5069,"authors":5070,"date":4859,"chapterOrder":5071,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-can-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0200-CAN通信","CAN通信",[7],"1300-0200",{"path":5073,"stem":5074,"title":5043,"authors":5075,"date":4859,"chapterOrder":5076,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-0100-Boost.Aiso",[7],"1300-0300-0100",{"path":5078,"stem":5079,"title":5080,"authors":5081,"date":4859,"chapterOrder":5082,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-tcp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0300-TCP通信","TCP通信",[7],"1300-0300",{"path":5084,"stem":5085,"title":5043,"authors":5086,"date":4859,"chapterOrder":5087,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-boost-aiso","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-0100-Boost.Aiso",[7],"1300-0400-0100",{"path":5089,"stem":5090,"title":5091,"authors":5092,"date":4859,"chapterOrder":5093,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-udp-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-0400-UDP通信","UDP通信",[7],"1300-0400",{"path":5095,"stem":5096,"title":5097,"authors":5098,"date":4859,"chapterOrder":5099,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1300-linux-ying-jian-tong-xin","wiki\u002F2023-12-30-ros2-tutorial\u002F1300-Linux硬件通信","Linux硬件通信",[7],"1300",{"path":5101,"stem":5102,"title":5103,"authors":5104,"date":4859,"chapterOrder":5105,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-ji-qi-ren-zu-cheng","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0100-机器人组成","机器人组成",[7],"1400-0100",{"path":5107,"stem":5108,"title":5109,"authors":5110,"date":4859,"chapterOrder":5111,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-yuan-cheng-kai-fa-ssh","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0100-远程开发SSH","远程开发SSH",[7],"1400-0200-0100",{"path":5113,"stem":5114,"title":5115,"authors":5116,"date":4859,"chapterOrder":5117,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-yuan-cheng-fang-wen-zhuo-mian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-0200-远程访问桌面","远程访问桌面",[7],"1400-0200-0200",{"path":5119,"stem":5120,"title":5121,"authors":5122,"date":4859,"chapterOrder":5123,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-gong-kong-ji-zhi-yuan-cheng-kai-fa-huan-jing","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0200-工控机之远程开发环境","工控机之远程开发环境",[7],"1400-0200",{"path":5125,"stem":5126,"title":5127,"authors":5128,"date":4859,"chapterOrder":5129,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-gong-kong-ji-zhi-wai-jie-usb-she-bei","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0300-工控机之外接USB设备","工控机之外接USB设备",[7],"1400-0300",{"path":5131,"stem":5132,"title":5133,"authors":5134,"date":4859,"chapterOrder":5135,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-fen-bu-shi-da-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0400-分布式搭建","分布式搭建",[7],"1400-0400",{"path":5137,"stem":5138,"title":5139,"authors":5140,"date":4859,"chapterOrder":5141,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-you-hua-ri-zhi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0500-优化日志","优化日志",[7],"1400-0500",{"path":5143,"stem":5144,"title":5145,"authors":5146,"date":4859,"chapterOrder":5147,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-li-cheng-ji-odom","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0100-里程计Odom","里程计Odom",[7],"1400-0600-0100",{"path":5149,"stem":5150,"title":5151,"authors":5152,"date":4859,"chapterOrder":5153,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-guan-xing-ji-imu","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0200-惯性计IMU","惯性计IMU",[7],"1400-0600-0200",{"path":5155,"stem":5156,"title":5157,"authors":5158,"date":4859,"chapterOrder":5159,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-ji-guang-lei-da-lidar","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0300-激光雷达LiDAR","激光雷达LiDAR",[7],"1400-0600-0300",{"path":5161,"stem":5162,"title":5163,"authors":5164,"date":4859,"chapterOrder":5165,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-xiang-ji-camera","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0400-相机Camera","相机Camera",[7],"1400-0600-0400",{"path":5167,"stem":5168,"title":5169,"authors":5170,"date":4859,"chapterOrder":5171,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-quan-qiu-ding-wei-gnss","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0500-全球定位GNSS","全球定位GNSS",[7],"1400-0600-0500",{"path":5173,"stem":5174,"title":5175,"authors":5176,"date":4859,"chapterOrder":5177,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-shou-bing-joy","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0600-手柄joy","手柄JOY",[7],"1400-0600-0600",{"path":5179,"stem":5180,"title":5181,"authors":5182,"date":4859,"chapterOrder":5183,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-jian-pan-kong-zhi-jie-dian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-0700-键盘控制节点","键盘控制节点",[7],"1400-0600-0700",{"path":5185,"stem":5186,"title":5187,"authors":5188,"date":4859,"chapterOrder":5189,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-ying-jian-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0600-硬件平台","硬件平台",[7],"1400-0600",{"path":5191,"stem":5192,"title":5193,"authors":5194,"date":4859,"chapterOrder":5195,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-zuo-biao-xi-yu-hua-ti-guan-xi","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0700-坐标系与话题关系","坐标系与话题关系",[7],"1400-0700",{"path":5197,"stem":5198,"title":5199,"authors":5200,"date":4859,"chapterOrder":5201,"chapterDepth":253,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-lun-shi-li-cheng-ji-biao-ding","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0100-轮式里程计标定","轮式里程计标定",[7],"1400-0800-0100-0100",{"path":5203,"stem":5204,"title":5205,"authors":5206,"date":4859,"chapterOrder":5207,"chapterDepth":253,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-lun-shi-li-cheng-ji-yu-imu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-0200-轮式里程计与IMU融合","轮式里程计与IMU融合",[7],"1400-0800-0100-0200",{"path":5209,"stem":5210,"title":5211,"authors":5212,"date":4859,"chapterOrder":5213,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-lun-shi-li-cheng-ji-biao-ding-yu-rong-he","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0100-轮式里程计标定与融合","轮式里程计标定与融合",[7],"1400-0800-0100",{"path":5215,"stem":5216,"title":5217,"authors":5218,"date":4859,"chapterOrder":5219,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-ji-guang-lei-da-gong-ju","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0200-激光雷达工具","激光雷达工具",[7],"1400-0800-0200",{"path":5221,"stem":5222,"title":5223,"authors":5224,"date":4859,"chapterOrder":5225,"chapterDepth":231,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-xiang-ji-shi-yong-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-0300-相机使用进阶","相机使用进阶",[7],"1400-0800-0300",{"path":5227,"stem":5228,"title":5229,"authors":5230,"date":4859,"chapterOrder":5231,"chapterDepth":197,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-ying-jian-ping-tai-jin-jie","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-0800-硬件平台进阶","硬件平台进阶",[7],"1400-0800",{"path":5233,"stem":5234,"title":5235,"authors":5236,"date":4859,"chapterOrder":5237,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1400-ji-qi-ren-ying-jian","wiki\u002F2023-12-30-ros2-tutorial\u002F1400-机器人硬件","机器人硬件",[7],"1400",{"path":5239,"stem":5240,"title":5241,"authors":5242,"date":4859,"chapterOrder":5243,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1500-ros2-control","wiki\u002F2023-12-30-ros2-tutorial\u002F1500-ROS2_Control","ROS2_Control",[7],"1500",{"path":5245,"stem":5246,"title":5247,"authors":5248,"date":4859,"chapterOrder":5249,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1600-moveit2-gong-ye-ji-qi-ren-ji-xie-bi","wiki\u002F2023-12-30-ros2-tutorial\u002F1600-Moveit2工业机器人机械臂","Moveit2工业机器人机械臂",[7],"1600",{"path":5251,"stem":5252,"title":5253,"authors":5254,"date":4859,"chapterOrder":5255,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1700-ji-qi-ren-dao-hang-navigation2-shi-ti-pian","wiki\u002F2023-12-30-ros2-tutorial\u002F1700-机器人导航Navigation2(实体篇)","机器人导航Navigation2(实体篇)",[7],"1700",{"path":5257,"stem":5258,"title":5259,"authors":5260,"date":4859,"chapterOrder":5261,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1800-microros","wiki\u002F2023-12-30-ros2-tutorial\u002F1800-MicroROS","MicroROS",[7],"1800",{"path":5263,"stem":5264,"title":5265,"authors":5266,"date":4859,"chapterOrder":5267,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F1900-webots-fang-zhen-ping-tai","wiki\u002F2023-12-30-ros2-tutorial\u002F1900-Webots仿真平台","Webots仿真平台",[7],"1900",{"path":5269,"stem":5270,"title":5271,"authors":5272,"date":4859,"chapterOrder":5273,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":4864},"\u002Fwiki\u002F2023-12-30-ros2-tutorial\u002F2000-opencv","wiki\u002F2023-12-30-ros2-tutorial\u002F2000-OpenCV","OpenCV",[7],"2000",{"path":4861,"stem":5275,"title":5276,"authors":5277,"date":4859,"chapterOrder":5278,"chapterDepth":4877,"docKey":4860,"docRoot":4861,"docTitle":4862,"isWikiDoc":256,"isWikiIndex":256},"wiki\u002F2023-12-30-ros2-tutorial\u002Findex","ROS2机器人操作系统教程",[7],null,[5280,5282,5285,5288],{"name":7,"image":5281},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":5283,"image":5284},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":5286,"image":5287},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":5289,"image":5290},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431903735]