在处理草图中将树莓派的蓝牙重新连接到 HC-06



我有一个工作设置,其中树莓pi在启动时运行无头处理草图。这个草图将Pi的板载蓝牙连接到HC-06。Pi还通过USB电缆与arduino nano建立了串行连接。加工草图起到中继的作用。它将字节从arduino中继到Hc-06,反之亦然。

HC-06的设备是一个arduino nano。这个设备会发出握手信号,这样Pi端的arduino就会知道它已经连接并发送响应。

这一切都像一种魅力,但有一个条件。Hc-06需要在处理草图引导之前"打开"。如果我打开HC-06太晚,或者如果我打开/关闭它,我无法重新连接,处理草图将重新启动。

我想编程一个更先进的握手协议与超时功能。因此,两个设备都会意识到连接已断开。

我通过外壳脚本开始处理草图

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-bind命令只能在启动时运行一次。

蓝牙脚本:

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"吗?

问候,

Bas

您可以使用Serial的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();
}

请记住,这需要进行测试/调整:我不是100%,传递的引用会很容易更新(否则,新的Serial对象可能需要由该方法返回并重新分配给原始引用(。

也不是说Processing需要一个窗口环境,所以它不是完全无头的。

作为纯命令行选项的快速替代方案,您可以查看Python和pyserial模块

最新更新