我正在尝试将树莓派连接到我的 Galaxy Note,以使用它进行串行通信。我在这方面已经取得了一定的成功。
首先我将其配对并通过信任bluetoothctl
。然后我运行sudo rfcomm watch hci0
并打开cat /dev/rfcomm
。我能够使用连接到树莓派蓝牙终端(只有这个应用程序,其他所有应用程序都失败)并且从 Galaxy 发送的字符串将显示在cat
窗口中。
后来我不知何故搞砸了,现在跑步sudo rfcomm watch hci0
给了我Can't bind RFCOMM socket: Address already in use
。我无法使用sudo rfcomm release hci0
or释放它sudo rfcomm release 0
,因为它随后给了我Can't release device: No such device
。现在也同样cat /dev/rfcomm0
给我No such file or directory
。
我杀死了列出的进程sudo lsof | grep /dev/rfcomm0
,这对我使用 RFCOMM 的能力没有影响。重新加载systemctl daemon-reload
并重新启动service bluetooth restart
也没有效果。
我仍然可以扫描其他蓝牙设备,并且可以使用蓝牙终端连接到树莓派,但似乎 rfcomm 消失了。我知道重新启动可以解决这个问题,但如果可能的话,我希望以编程方式执行此操作,而不必求助于电源循环。
感谢您的帮助。
答案1
dmesg
在树莓派上检查命令的输出。
我得到类似的东西:
[ 296.768548] ------------[ cut here ]------------
[ 296.768576] WARNING: CPU: 3 PID: 40 at drivers/tty/tty_port.c:257 tty_port_put+0x94/0x98
[ 296.768586] Modules linked in: rfcomm cmac bnep hci_uart btbcm serdev bluetooth ecdh_generic 8021q garp stp llc brcmfmac brcmutil bcm2835_codec(C) bcm2835_v4l2(C) v4l2_mem2mem sha256_generic bcm2835_mmal_vchiq(C) v4l2_common videobuf2_vmalloc videobuf2_dma_contig videobuf2_memops cfg80211 videobuf2_v4l2 videobuf2_common videodev media rfkill vc_sm_cma(C) v3d vc4 gpu_sched drm_kms_helper rpivid_mem raspberrypi_hwmon hwmon drm drm_panel_orientation_quirks snd_soc_core snd_bcm2835(C) snd_compress snd_pcm_dmaengine snd_pcm snd_timer syscopyarea sysfillrect sysimgblt fb_sys_fops snd rpi_backlight rpi_ft5406 uio_pdrv_genirq uio evdev joydev ip_tables x_tables ipv6
[ 296.768773] CPU: 3 PID: 40 Comm: kworker/3:1 Tainted: G C 4.19.97-v7l+ #1294
[ 296.768781] Hardware name: BCM2835
[ 296.768798] Workqueue: events release_one_tty
[ 296.768825] [<c0212e04>] (unwind_backtrace) from [<c020d5e0>] (show_stack+0x20/0x24)
[ 296.768844] [<c020d5e0>] (show_stack) from [<c09b15c8>] (dump_stack+0xe0/0x124)
[ 296.768865] [<c09b15c8>] (dump_stack) from [<c0222544>] (__warn+0x104/0x11c)
[ 296.768883] [<c0222544>] (__warn) from [<c0222694>] (warn_slowpath_null+0x50/0x58)
[ 296.768899] [<c0222694>] (warn_slowpath_null) from [<c06cab28>] (tty_port_put+0x94/0x98)
[ 296.768941] [<c06cab28>] (tty_port_put) from [<bf9dd2a0>] (rfcomm_tty_cleanup+0x5c/0x60 [rfcomm])
[ 296.768999] [<bf9dd2a0>] (rfcomm_tty_cleanup [rfcomm]) from [<c06c2a38>] (release_one_tty+0x3c/0xac)
[ 296.769019] [<c06c2a38>] (release_one_tty) from [<c023e028>] (process_one_work+0x170/0x458)
[ 296.769036] [<c023e028>] (process_one_work) from [<c023e36c>] (worker_thread+0x5c/0x5a4)
[ 296.769051] [<c023e36c>] (worker_thread) from [<c02446a0>] (kthread+0x138/0x168)
[ 296.769066] [<c02446a0>] (kthread) from [<c02010ac>] (ret_from_fork+0x14/0x28)
[ 296.769075] Exception stack(0xefab3fb0 to 0xefab3ff8)
[ 296.769086] 3fa0: 00000000 00000000 00000000 00000000
[ 296.769098] 3fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[ 296.769108] 3fe0: 00000000 00000000 00000000 00000000 00000013 00000000
[ 296.769119] ---[ end trace 545b669f95e0d2b5 ]---
这让我相信内核模块(rfcomm)及其处理线程(krfcomm)在释放 tty 时挂起/崩溃,并使其处于损坏状态。
因此,尝试创建新的设备会与尚未删除的设备发生冲突,而尝试删除/释放现有的设备会导致一条消息称该设备不存在。
我认为除了重新启动之外,目前没有其他解决方案。
我在某处读到,如果确保连接保持打开状态超过 10 秒,则不会发生崩溃并且可以成功重用端口。
编辑:以下对同一问题的回答建议删除该modemmanager
软件包,这可能会造成干扰。