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

时间:2020-04-13 14:49:46

标签: java bluetooth raspberry-pi processing

我有一个有效的设置,其中树莓派在启动时运行无头处理草图。该草图将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不是很熟悉。如何销毁串行对象?我可以第二次从功能中“新建”吗?

亲切的问候,

Bas

1 个答案:

答案 0 :(得分:3)

您可以使用串行的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对象可能需要由方法返回并重新分配给原始参考)。

处理不是需要窗口环境,因此它并不是完全没有头绪的。

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