Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重新连接覆盆子皮&x27;将蓝牙连接到处理草图中的HC-06_Java_Bluetooth_Raspberry Pi_Processing - Fatal编程技术网

Java 重新连接覆盆子皮&x27;将蓝牙连接到处理草图中的HC-06

Java 重新连接覆盆子皮&x27;将蓝牙连接到处理草图中的HC-06,java,bluetooth,raspberry-pi,processing,Java,Bluetooth,Raspberry Pi,Processing,我有一个工作设置,其中raspberry pi在引导时运行一个无头处理草图。此草图将Pi的车载蓝牙连接到HC-06。Pi还通过USB电缆与arduino nano建立串行连接。处理草图充当中继。它将字节从arduino中继到Hc-06,反之亦然 带有HC-06的设备是arduino nano。该设备发送一个握手信号,以便Pi端的arduino知道它已连接,并发送响应 这一切都很有魅力,但有一个条件。加工草图引导前,Hc-06需要处于“开启”状态。如果我打开HC-06太晚,或者如果我打开/关闭HC

我有一个工作设置,其中raspberry pi在引导时运行一个无头处理草图。此草图将Pi的车载蓝牙连接到HC-06。Pi还通过USB电缆与arduino nano建立串行连接。处理草图充当中继。它将字节从arduino中继到Hc-06,反之亦然

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

这一切都很有魅力,但有一个条件。加工草图引导前,Hc-06需要处于“开启”状态。如果我打开HC-06太晚,或者如果我打开/关闭HC-06,我将无法重新连接,并且将重新启动处理草图

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

我通过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不是非常熟悉。如何销毁串行对象?我可以从一个函数中第二次“新建”吗

亲切问候,

Bas

您可以使用串行方法关闭串行连接。 然后,您可以根据需要重新初始化端口

下面是一个粗略的(未经测试的)示例:

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

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


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

谢谢,我将试用它。该行xvfb run允许它在虚拟显示器上运行。我没有连接到pi的监视器或显示器。我还需要将端口作为参数传递吗?我想在调用.begin函数的同一个文件中执行此操作。您可以将函数分为两部分:关闭/清除端口,然后单独初始化一个端口。最后是对您的设置最有效的方法通过端口的点是,您可以重新使用它来重置
central
handController
。我不知道您在调用
.begin()
的位置执行此操作是什么意思。AFAIK
.begin()
位于Arduino端,与处理代码完全不同。
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();
}