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

标签 java bluetooth raspberry-pi processing

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

带有 HC-06 的设备是 arduino nano。该设备发出握手信号,以便 Pi 端的 arduino 知道它已连接并发送响应。

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

我想编写一个具有超时功能的更高级的握手协议(protocol)。因此两个设备都会知道连接已断开。

我通过 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 绑定(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不是很熟悉。我怎样才能销毁串行对象?我可以从一个函数中第二次“新建”吗?

亲切的问候,

基础

最佳答案

您可以使用序列号的 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 需要窗口环境,所以它不是完全 headless 的。

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

关于java - 在处理草图中将树莓派的蓝牙重新连接到 HC-06,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61190474/

相关文章:

Java CountDownLatch 示例主线程不等待闩锁.await

抛出 java.util.ArrayList$Itr.checkForComodification 异常

Java:获取枚举的 ExceptionInInitializerError

java - 在虚拟设备管理器中运行但在手机上强制关闭的代码

java - 按下按钮后应用程序崩溃 - 蓝牙 arduino

ios - 如何在不使用 coreBluetooth 的情况下接近 BT 设备列表?

ffmpeg - 如何使用 gstreamer (RTMP) 流式传输连接到树莓派的 USB 网络摄像头

windows - 远程放置 Windows 10 电脑以从树莓派休眠

raspberry-pi - MQTT 双向通信

java - Selenium Java 无法选择 AngularJS 元素