如何在Processing中设置串口通信到/dev/rfcomm



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

我已经在/etc/bluetooth/rfcom .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的"让事物说话"的所有指示,但这就是不像他说的那样工作…

任何帮助都太好了!

谢谢,鲍勃

经过多方努力,我终于做出了这个作品。

关键问题是处理使用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上的红色led变为固态,处理可以检测到:

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/rfcom .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. 创建sym链接:

    $ 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. 运行处理脚本后,请确保在命令行断开JY-MCU。

应该可以了!小贝,鲍勃

我突然想起了一件事。我也遇到过类似的问题,因为通道1已经被使用了。如果你绑定到一个已经在使用的通道,可能会发生不好的事情。

sdptool browse local

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

相关内容

  • 没有找到相关文章

最新更新