我正在尝试在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设备进行通信
一次性设置:
上电JY-MCU,
使用以下命令获取硬件地址,我的是00:12:11:19:08:54
$ hcitool scan
创建/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"; }
使用BlueMan配对JY-MCU
每次想要使用JY-MCU
创建sym链接:
$ sudo ln -s /dev/rfcomm0 /dev/ttyS99
连接JY-MCU:
$ sudo rfcomm connect 0 Connected /dev/rfcomm0 to 00:12:11:19:08:54 on channel 1 Press CTRL-C for hangup
你现在可以运行一个处理脚本并连接到JY-MCU代码:
String portName = "/dev/ttyS99"; myPort = new Serial(this, portName, 9600);
运行处理脚本后,请确保在命令行断开JY-MCU。
应该可以了!小贝,鲍勃
我突然想起了一件事。我也遇到过类似的问题,因为通道1已经被使用了。如果你绑定到一个已经在使用的通道,可能会发生不好的事情。
sdptool browse local
使用该命令查看Ubuntu设备上可用的频道