6

我正在尝试在 Ubuntu 12.04 和连接到 Arduino 的 JY-MCU 蓝牙串行模块之间执行串行通信。

我在 /etc/bluetooth/rfcomm.conf 中创建了这个配置

rfcomm0 {
#   # Automatically bind the device at startup
    bind yes;
#
#   # Bluetooth address of the device    
    device 00:12:11:19:08:54
#   # RFCOMM channel for the connection
    channel 1;
#   # Description of the connection
    comment "Linvor Bluetooth Module";
}

我可以使用 putty 与 /dev/rfcomm0 串行端口进行通信,并且效果很好。

但是,尽管进行了多次尝试,但我根本看不到如何在 Processing 中创建一个以任何方式工作的串行端口。

例如 :

println(Serial.list());

什么都不打印。

如果我执行:

String portName = "/dev/rfcomm0";
myPort = new Serial(this, portName, 9600);
println(myPort);

我在显示器上看到了这个:

processing.serial.Serial@1712651

但如果我再打电话:

 myPort.write('9');

我得到一个例外:

java.lang.NullPointerException
    at processing.serial.Serial.write(Serial.java:572)
    ...

我不明白为什么这会失败。我一直在遵循 Tom Igoe 的“让事情说话”中的所有指示,但这并不像他所说的那样工作......

任何帮助都会很棒!

谢谢,

鲍勃

4

2 回答 2

9

在高低搜索之后,我完成了这项工作。

关键问题是处理使用 rxtx java 库 (RXTX-2.1-7) 进行串行通信。

RXTX wiki说:

“rxtx 尝试通过扫描 /dev 以查找与一组已知良好前缀中的任何一个匹配的文件来检测端口,例如 'ttyS'、'ttym' 以及自 2.2 以来的 'ttyUSB' 等等。”

并且由于蓝牙设备被命名 rfcomm*,因此无法检测到。

诀窍是创建一个符号链接来欺骗 rxtx(使用尚未分配的 ttyS 设备):

$ sudo ln -s  /dev/rfcomm0 /dev/ttyS99

然后,连接:

$ sudo rfcomm connect 0
 Connected /dev/rfcomm0 to 00:12:11:19:08:54 on channel 1
 Press CTRL-C for hangup

此时JY-MCU上的红灯长亮,处理可以检测到:

println(Serial.list());

输出是:

[0] "/dev/ttyACM0" 
[1] "/dev/ttyS99"

因此,串行通信可以工作。

总而言之,以下过程将允许处理脚本通过串行端口与 BlueZ linux 框架中的 JY-MCU 设备进行通信

一次性设置:

  1. 给 JY-MCU 上电,

  2. 使用以下命令获取其硬件地址,我的是 00:12:11:19:08:54

    $ hcitool scan  
    
  3. 使用它来创建 /etc/bluetooth/rfcomm.conf 文件;你会注意到我为 rfcomm 设备选择了 0,我们稍后需要它来连接:

    $ cat /etc/bluetooth/rfcomm.conf
    rfcomm0 {
        bind yes;
        device 00:12:11:19:08:54;
        channel    1;
        comment "Linvor Bluetooth Module";
    }
    
  4. 使用 BlueMan 配对 JY-MCU。

每次想用JY-MCU

  1. 创建符号链接:

    $ sudo ln -s  /dev/rfcomm0 /dev/ttyS99
    
  2. 连接 JY-MCU:

    $ sudo rfcomm connect 0
      Connected /dev/rfcomm0 to 00:12:11:19:08:54 on channel 1
      Press CTRL-C for hangup
    
  3. 您现在可以运行处理脚本并使用代码连接到 JY-MCU:

    String portName = "/dev/ttyS99";
    myPort = new Serial(this, portName, 9600);
    
  4. 运行处理脚本后,一定要在命令行按CTRL-C断开JY-MCU。

应该这样做!乔,鲍勃

于 2013-03-23T11:38:32.700 回答
0

我脑子里突然冒出一件事。由于已经使用了通道 1,我遇到了类似的问题。如果您绑定到已经在使用的通道,则可能会发生不好的事情。

sdptool browse local

使用该命令查看 Ubuntu 设备上可用的频道。

于 2013-03-18T09:52:35.357 回答