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