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

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

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

      我使用小鱼的串口代码,然后自己删减了UDP部分的代码, 变成纯串口的代码,间歇性出现使用节点无法打开串口的情况,报错如下:
      6c2fe52f-5b1e-4015-89a5-ae806e887b62-image.png
      [INFO] [1667965376.500466884] [serial_test]: serial节点启动中...
      open with/dev/ttyUSB0
      terminate called after throwing an instance of 'std::bad_function_call'
      what(): bad_function_call
      但是使用ubuntu中的串口调试助手又能很轻松打开
      4df2dc6c-83e9-44da-9d52-8b4d06d77c1f-image.png
      求问各位大佬能帮忙解答一下吗?

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

        @746169690

        1. cutecom和串口程序不能同时运行
        2. 保证软件具备串口文件描述权限

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

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

          @小鱼 大佬 我尝试过使用sudo chmod 777 /dev/ttyU* sudo chmod 777 /dev/ttyUSB0赋予权限,但是结果还是无法打开,同时根据网上教程也添加了.rules也无法打开串口e5506ff3-8acd-4290-8183-523c0d6ae02c-image.png
          文件内容如下:
          878f2500-7a9a-49aa-bd44-f8bc58f76396-image.png
          在使用cutecom确定串口是可以使用的情况后,我是将cutecom关掉了再运行串口节点的

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

            @746169690 那就只能看你的代码了,直接测试我给的开源库会有问题吗?

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

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

              @小鱼 之前测试的时候可以打开串口,我修改删除UDP后的代码也是可以打开串口的,并且能跟下位机通信,今天早上突然就打不开了,添加权限尝试也不行,这是我的代码的github仓库:https://github.com/SenHe524/AGV.git
              大佬如果有时间可以clone下来尝试一下看看能不能打开串口,或者帮忙看看串口代码

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

                @sen 粗略看了下代码,没直接看出什么来,我抽时间按晚些切换Linux系统测试下看看再反馈。

                另外直接上传到Github非常方便,使用GithubDev可以直接看工程代码,推荐奇谭小伙伴也使用:https://github.dev/SenHe524/AGV

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

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

                  此回复已被删除!
                  1 条回复 最后回复 回复 引用 0
                  • senS
                    Sen @小鱼
                    最后由 编辑

                    @小鱼 晚上重新测试了一下小鱼你的库,是可以运行的,大概率是我修改代码有问题了,但是我自己找不到原因了,下面我是修改的地方:
                    1.删除了UDP部分的代码
                    2.删除了包装的用来选择serial或udp client和udp service的那一层代码
                    3.添加了发送uint8_t数组的函数
                    小鱼麻烦你帮忙看看了😂

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

                      @sen 测试了下,一切正常,多次打开和关闭都是正常的,应该是你哪里搞错了。

                      662551a1-b9dd-452a-bf8a-abae404b5af0-image.png

                      错误分析

                      我重新回头仔细看了下你的错误,核心错误是std::bad_function_call,这个应该是你调用函数错误造成的,其实串口已经被你打开了,你发送了错误的数据过去可能。

                      查了下:https://www.apiref.com/cpp-zh/cpp/utility/functional/bad_function_call.html

                      另外在代码中src/fish_protocol/src/serial_protocol.cpp中使用printf打印串口打开标识是打印不出来的,所以被你当作一打开就错误,你可以换成std::cout进行打印,应该就可以正常看到串口已经被打开的打印了。

                        std::cout << "open with" << protocol_config_.serial_address_ << std::endl;
                        serial_port_.open(protocol_config_.serial_address_, ec);
                        assert(!ec);
                        if(serial_port_.is_open())
                        printf("串口已打开!");
                      

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

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

                        @小鱼 我刚才测试了一下,确实不是串口的问题,是velocity速度话题订阅者的创建导致了std::bad_function_call,但是之前也是这样子使用的,完全不明白为什么突然不行了。
                        de7a3953-8250-42dc-9564-1cec51c6be05-image.png
                        另外,请问小鱼你测试的时候,更改了哪些地方呢?

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

                          @sen 我测试的时候,用你的代码,一句话没有改哈,就是发送数据用的cli发的。

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

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

                            @小鱼 在你那边订阅者创建没有问题的话,就很奇怪了,我这边把订阅者创建语句注释掉之后,就能正常了,但是你那边又没问题,是ubuntu环境吗?

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

                              @小鱼 我这边突然又可以了,我通过git看了一下源码差异,就只改了如下两个不重要的地方:
                              1.fde6d38d-1a51-42bb-a34d-0b1ae68f6b2b-image.png
                              2.e409e0b0-c8d3-440f-926f-520b6f19209e-image.png
                              就真的很玄学啊

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

                                @sen 结构体之类的最好做一下内存对齐,不然数据出问题可能性很大

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

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

                                  @小鱼 好的,这个会检查一下,所以小鱼这个问题可能出在哪里呢😂 现在偶尔还是会出现std::bad_function_call,就很奇怪

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

                                    @sen 问题应该还是在你发送的数据上,仔细检查一下这一块吧,数据转换出来可能存在空之类的情况造成的估计。

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

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

                                      @小鱼 5ae5be56-a95c-4420-852c-2cdfe4853bcd-image.png
                                      从上面的订阅者回调来看,应该是不会出现数据包为空的情况,在打包成帧之前,buf中的数据来自于订阅到的信息,打包的函数如下:
                                      5e77e38d-698b-441c-8a4a-6519f8090ff3-image.png
                                      返回帧的cnt永远不会为0,所以发送出去的数据也不会为空😂 ,到现在为止真的不知道分析什么了,并且现在没出现std::bad_function_call了,等再出现的时候看看能不能找到,后续再更新在这个贴子里面,谢谢小鱼这两天的解答了!

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

                                        @小鱼 小鱼请问,我想实现类似stm32串口那样子的中断接收,有什么办法吗?或者我想在ros给下位机发送了指令后,获取下位机的反馈,但是你的代码里面的接收是异步接收的,所有没办法在下发指令之后去循环查询标志位获取返回信息,类似如下
                                        7020e89a-7118-48bc-b7cf-27283870bce4-image.png
                                        因为是异步接收(本以为会跟stm32的串口中断一样),所有返回信息会在循环等待超时之后才会更新,也就是说每次都会超时,然后才更新数据。
                                        请问有什么解决办法吗?谢谢小鱼

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

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

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

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

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

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