将 raspberry pi 的蓝牙重新连接到处理草图中的 HC-06
Reconnect raspberry pi's bluetooth to an HC-06 in a processing sketch
我有一个工作设置,其中 raspberry pi 运行 在启动时是一个无头处理草图。此草图将 Pi 的板载蓝牙连接到 HC-06。 Pi 还通过 USB 电缆建立了与 arduino nano 的串行连接。加工草图起到接力作用。它将字节从 arduino 中继到 Hc-06,反之亦然。
带有 HC-06 的设备是 arduino nano。该设备发出握手信号,以便 Pi 端的 arduino 知道它已连接并发送响应。
这一切都像一个魅力,但在一个条件下。 Hc-06 在加工草图启动前需要 'on'。如果我太晚打开 HC-06 或者如果我打开它 on/off 我无法重新连接并且要重新启动处理草图。
我想编写一个具有超时功能的更高级的握手协议。所以两个设备都会知道连接被切断了。
我通过 shell 脚本开始处理草图
sudo rfcomm bind hci0 20:14:04:15:23:75
sudo killall java
xvfb-run processing-java --sketch=/home/pi/Documents/bluetooth --run # runs headless
rfcomm 绑定命令只在启动时 运行 一次。
以及蓝牙脚本:
import processing.serial.*;
Serial handController;
Serial central;
byte mode;
void setup()
{
printArray(Serial.list());
size(200,200);
background(0); // black
central = new Serial( this, Serial.list()[3], 115200);
handController = new Serial( this , Serial.list()[0] , 115200 );
}
long prev;
byte tgl = 0;
void draw()
{
if(handController.available() > 0) {
int c = handController.read();
println(" handcontroller:\t" + (char) c + "\t" + c); // as well char as dec value
central.write(c);
}
....
我是否可以在此草图中终止与 rfcomm0 的串行连接,然后重新启动它?
看来是这条线建立了蓝牙连接。
handController = new Serial( this , Serial.list()[0] , 115200 ); // rfcomm0
我对java不是很熟悉。我怎样才能销毁串行对象?我可以从函数中第二次执行 'new' 吗?
亲切的问候,
基础
可以使用串口的stop()
方法关闭串口连接。
然后您可以根据需要重新初始化端口。
这是一个粗略的(未经测试的例子):
void restartSerialPort(Serial reference,String portName, int baudRate){
// pause rendering (draw loop)
noLoop();
// stop previous connection
if(reference != null){
reference.stop();
reference = null;
}
// start connection anew
try{
reference = new Serial( this, portName, baudRate);
}catch(Exception e){
println("error opening serial port: " + portName);
e.printStackTrace();
}
// resume rendering
loop();
}
请记住,这需要 tested/tweaked:我不是 100% 传递的引用会很容易更新(否则新的 Serial
对象可能需要由方法返回,并且重新分配给原始参考)。
也不是说 Processing 需要窗口环境,所以它不是完全无头的。
作为纯命令行选项的快速替代品,您可以查看 Python 和 pyserial module
我有一个工作设置,其中 raspberry pi 运行 在启动时是一个无头处理草图。此草图将 Pi 的板载蓝牙连接到 HC-06。 Pi 还通过 USB 电缆建立了与 arduino nano 的串行连接。加工草图起到接力作用。它将字节从 arduino 中继到 Hc-06,反之亦然。
带有 HC-06 的设备是 arduino nano。该设备发出握手信号,以便 Pi 端的 arduino 知道它已连接并发送响应。
这一切都像一个魅力,但在一个条件下。 Hc-06 在加工草图启动前需要 'on'。如果我太晚打开 HC-06 或者如果我打开它 on/off 我无法重新连接并且要重新启动处理草图。
我想编写一个具有超时功能的更高级的握手协议。所以两个设备都会知道连接被切断了。
我通过 shell 脚本开始处理草图
sudo rfcomm bind hci0 20:14:04:15:23:75
sudo killall java
xvfb-run processing-java --sketch=/home/pi/Documents/bluetooth --run # runs headless
rfcomm 绑定命令只在启动时 运行 一次。
以及蓝牙脚本:
import processing.serial.*;
Serial handController;
Serial central;
byte mode;
void setup()
{
printArray(Serial.list());
size(200,200);
background(0); // black
central = new Serial( this, Serial.list()[3], 115200);
handController = new Serial( this , Serial.list()[0] , 115200 );
}
long prev;
byte tgl = 0;
void draw()
{
if(handController.available() > 0) {
int c = handController.read();
println(" handcontroller:\t" + (char) c + "\t" + c); // as well char as dec value
central.write(c);
}
....
我是否可以在此草图中终止与 rfcomm0 的串行连接,然后重新启动它?
看来是这条线建立了蓝牙连接。
handController = new Serial( this , Serial.list()[0] , 115200 ); // rfcomm0
我对java不是很熟悉。我怎样才能销毁串行对象?我可以从函数中第二次执行 'new' 吗?
亲切的问候,
基础
可以使用串口的stop()
方法关闭串口连接。
然后您可以根据需要重新初始化端口。
这是一个粗略的(未经测试的例子):
void restartSerialPort(Serial reference,String portName, int baudRate){
// pause rendering (draw loop)
noLoop();
// stop previous connection
if(reference != null){
reference.stop();
reference = null;
}
// start connection anew
try{
reference = new Serial( this, portName, baudRate);
}catch(Exception e){
println("error opening serial port: " + portName);
e.printStackTrace();
}
// resume rendering
loop();
}
请记住,这需要 tested/tweaked:我不是 100% 传递的引用会很容易更新(否则新的 Serial
对象可能需要由方法返回,并且重新分配给原始参考)。
也不是说 Processing 需要窗口环境,所以它不是完全无头的。
作为纯命令行选项的快速替代品,您可以查看 Python 和 pyserial module