鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    serial串口通信

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    串口 通信
    5
    15
    2.9k
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小鱼小
      小鱼 技术大佬 @凌云
      最后由 编辑

      @凌云

      1. 字节数组和字符串可以直接互转的
      2. 可以直接使用std::bind将普通函数变为回调函数形式

      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

      凌云凌 1 条回复 最后回复 回复 引用 0
      • 凌云凌
        凌云 @小鱼
        最后由 编辑

        @小鱼 thanks!

        1 条回复 最后回复 回复 引用 0
        • 毛哥成山轮胎机油保养毛
          毛哥成山轮胎机油保养 活跃VIP @小鱼
          最后由 编辑

          @小鱼 最近入手了一个JY_ 95t imu ,只找到了python的程序,没有c++的,这个imu在接收数据以前,需要发送一段16进制的数据:0xA4 0x03 0x08 0x23 0xD2配置imu 我看了你的程序,protocol->ProtocolSendRawData("Hello FishBot!"); 只能发送字符串,怎样才能发送16进制的数据呢?这是你的示例程序返回的结果:open with/dev/ttyUSB0
          send14
          start send******
          0x48 0x65 0x6C 0x6C 0x6F 0x20 0x46 0x69 0x73 0x68 0x42 0x6F 0x74 0x21

          小鱼小 1 条回复 最后回复 回复 引用 0
          • 小鱼小
            小鱼 技术大佬 @毛哥成山轮胎机油保养
            最后由 编辑

            @毛哥成山轮胎机油保养 一个字符串刚好是一个byte,8个bit。
            所以bytes可以和string可以互相转换


            当你想要在 C++ 中将 std::string 和字节数组之间进行转换时,可以使用 reinterpret_cast 进行转换。下面是一个示例代码,展示了如何在两者之间进行互相转换:

            #include <iostream>
            #include <string>
            #include <vector>
            
            // 将字节数组转换为 std::string
            std::string ByteArrayToString(const std::vector<unsigned char>& byteArray) {
                return std::string(reinterpret_cast<const char*>(byteArray.data()), byteArray.size());
            }
            
            // 将 std::string 转换为字节数组
            std::vector<unsigned char> StringToByteArray(const std::string& str) {
                std::vector<unsigned char> byteArray(str.begin(), str.end());
                return byteArray;
            }
            
            int main() {
                // 示例:将字节数组转换为 std::string
                std::vector<unsigned char> byteArray = {72, 101, 108, 108, 111, 33};
                std::string str = ByteArrayToString(byteArray);
                std::cout << "String: " << str << std::endl;
            
                // 示例:将 std::string 转换为字节数组
                std::string message = "Hello, world!";
                std::vector<unsigned char> convertedArray = StringToByteArray(message);
                std::cout << "Byte Array: ";
                for (unsigned char byte : convertedArray) {
                    std::cout << static_cast<int>(byte) << " ";
                }
                std::cout << std::endl;
            
                return 0;
            }
            

            上述代码中,ByteArrayToString 函数接收一个字节数组(std::vector<unsigned char>),并使用 reinterpret_cast 将其转换为 const char*,然后通过构造函数将其转换为 std::string。

            StringToByteArray 函数接收一个 std::string,并通过使用迭代器将其转换为 std::vector<unsigned char>。

            请注意,这种方法假设字节数组中的每个字节都对应一个有效的字符,且字符编码没有发生变化。在某些情况下,这种转换可能不是无损的,因此在实际应用中要小心处理。

            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

            毛哥成山轮胎机油保养毛 1 条回复 最后回复 回复 引用 0
            • 毛哥成山轮胎机油保养毛
              毛哥成山轮胎机油保养 活跃VIP @小鱼
              最后由 编辑

              @小鱼 在 serial串口通信 中说:

              // 示例:将 std::string 转换为字节数组
              std::string message = "Hello, world!";
              std::vector<unsigned char> convertedArray = StringToByteArray(message);
              std::cout << "Byte Array: ";
              for (unsigned char byte : convertedArray) {
              std::cout << static_cast<int>(byte) << " ";
              }
              std::cout << std::endl;

              #include "fish_protocol/fish_protocol.h"
              //#include <iostream>
              //#include <string>
              //#include <vector>

              // 将字节数组转换为 std::string
              std::string ByteArrayToString(const std::vector<unsigned char>& byteArray) {
              return std::string(reinterpret_cast<const char*>(byteArray.data()), byteArray.size());
              }

              // 将 std::string 转换为字节数组
              std::vector<unsigned char> StringToByteArray(const std::string& str) {
              std::vector<unsigned char> byteArray(str.begin(), str.end());
              return byteArray;
              }

              int main(int argc, char const* argv[]) {
              fish_protocol::ProtocolConfig proto_config;
              proto_config.protocol_type_ = fish_protocol::PROTOCOL_TYPE::SERIAL;
              proto_config.serial_baut_ = 115200;
              proto_config.serial_address_ = "/dev/ttyUSB0";

              // 初始化
              auto protocol = GetProtocolByConfig(proto_config);

              //send_data = [0xA4,0x03,0x08,0x23,0xD2]
              // 将字节数组转换为 std::string
              std::vector<unsigned char> byteArray = {0xA4,0x03,0x08,0x23,0xD2};
              std::string str = ByteArrayToString(byteArray);

              // 发送数据
              protocol->ProtocolSendRawData(str);

              // 接收数据
              protocol->SetDataRecvCallback([](const std::string& data) -> void {

              //将接收到的 std::string & data转换为字节数组
              std::vector<unsigned char> convertedArray = StringToByteArray(data);
              std::cout << "Byte Array: ";
              for (unsigned char byte : convertedArray) {
                  std::cout << static_cast<int>(byte) << " ";
              }
              std::cout << std::endl;
              

              });

              // 销毁
              protocol->ProtocolDestory();
              return 0;
              }

              可以正常发送16进制数据了,可是为什么没有读到imu发回的数据呢?
              open with/dev/ttyUSB0
              send5
              start send******
              0xA4 0x03 0x08 0x23 0xD2
              end send******

              小鱼小 1 条回复 最后回复 回复 引用 0
              • 小鱼小
                小鱼 技术大佬 @毛哥成山轮胎机油保养
                最后由 编辑

                @毛哥成山轮胎机油保养 在 serial串口通信 中说:

                // 销毁
                protocol->ProtocolDestory();

                这句之前加上个delay,还没来得及接受到数据就exit了

                新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                8679758198 2 条回复 最后回复 回复 引用 0
                • 8679758198
                  圆梦 @小鱼
                  最后由 编辑

                  @小鱼 那我想发送一个uint8或者float型的数据该怎么办?

                  1 条回复 最后回复 回复 引用 0
                  • 8679758198
                    圆梦 @小鱼
                    最后由 编辑

                    @小鱼 他只能发送一种类型?

                    小鱼小 1 条回复 最后回复 回复 引用 0
                    • 小鱼小
                      小鱼 技术大佬 @867975819
                      最后由 编辑

                      @867975819 bytes可以代表一切类型

                      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                      1 条回复 最后回复 回复 引用 0
                      • 32904162883
                        鲜橙多 @小鱼
                        最后由 编辑

                        @小鱼 41af58e1-ce07-4033-88dc-37071021ba29-image.png 为什么在容器中安装,执行cpp文件一直显示无法找到对应的package呢

                        小鱼小 1 条回复 最后回复 回复 引用 0
                        • 小鱼小
                          小鱼 技术大佬 @3290416288
                          最后由 编辑

                          @3290416288 只支持ROS2

                          新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                          1 条回复 最后回复 回复 引用 0
                          • 第一个帖子
                            最后一个帖子
                          皖ICP备16016415号-7
                          Powered by NodeBB | 鱼香ROS