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

    使用小鱼的串口代码间歇性串口打开失败

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

      @sen 串口通信是全双功的,所以一定是收发不是同步的,不过你可以在数据接收那里进行数据标志的检测,然后他通过一个原子变量进行标志,应该可以达到同样的效果。

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

        @小鱼 之前我测试的时候就是在串口接收函数的回调里面对数据进行分类处理,然后每一类数据都有一个flag,我在发送指令后while检测了一段时间应该有变化的那个flag,但是每次在while里面都检测不到flag就很奇怪,示例代码如下:
        4ae35a17-e92d-45ff-8ab4-30efb88e9fd1-image.png
        不知道哪里出问题了

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

          @sen 这个你把返回的所有数据打印出来瞅瞅就可以给问题定位了,是没收到还是没发过来,都加个时间戳看看

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

            @小鱼 小鱼,今天又出现了打开后出错的情况,如下:d950ca0b-1dbc-41ec-a715-3863dd2df897-1670505759714.jpg
            最开始怀疑是数据量太大,做了几次测试之后,发现如果在启动串口时,缓存区已有大量数据,则会导致出错。如果启动时,缓存区数据较少,则可以正常使用,请问小鱼有解决办法吗?

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

              此回复已被删除!
              1 条回复 最后回复 回复 引用 0
              • 小鱼小
                小鱼 技术大佬
                最后由 编辑

                @sen 感谢反馈,我又仔细去看了下代码,问题是出在了,打开串口和设置回调函数的顺序问题,先打开了串口后设置了回调函数,如果此时有数据就没有办法进入回调.目前猜测最有可能是这里造成的问题,你可以将设置回调函数放在对串口对象的构造中,然后在构造函数里就完成对回调函数的设置,这样应该就没有问题了.

                祝好!

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

                  @小鱼 小鱼你好,你的代码里面定义回调函数使用的是lambda函数体,我不太了解应该怎么将其放在串口对象的构造函数中,之前试过使用普通函数定义回调,但是编译有问题,请问能帮忙修改一下吗?谢谢小鱼了。

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

                    @sen 最近抽个空我更新一下,更新后再回复

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

                      @小鱼 好的,麻烦小鱼了!谢谢!

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

                        @sen 问题应该已经修复了,加了一个判断,回调函数不为空时再进行调用。

                        2aa1204e-2110-43b5-a560-2d529651bdf2-image.png

                        你下载最新的代码试试看~,或者直接在自己的程序上加上这个判断

                            if (bytes_transferred > 0)
                            {
                              std::string data_str(recv_data_buffer_, bytes_transferred);
                              if (recv_data_callback_)
                              {
                                // 回调数据
                                recv_data_callback_(data_str);
                              }
                        
                        senS 2 条回复 最后回复 回复 引用 0
                        • 小鱼小 小鱼 在 中 引用了 这个主题
                        • senS
                          Sen @小鱼
                          最后由 编辑

                          @小鱼 好的,我找时间试试,谢谢小鱼!

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

                            @小鱼 刚才测试了一下,暂时未出现过之前的问题了。不过我又有了新问题了😂 ,请问小鱼,使用异步读取的时候 进入一次回调函数最多的数据量为32bytes(我这边测试最多出现过32bytes),请问有什么办法能提高这个“进入一次回调函数的最大数据量”吗?谢谢小鱼了

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

                              @sen 可以尝试增加单次处理回调的处理时间,也就是在回调函数里休眠,或者要改一下程序,把多次接收的数据进行保存,满足条件后调用回调

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

                                @小鱼 好的,谢谢小鱼!

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