【问题标题】:SPP Android BT Connection quits after seconds (EEG readings)SPP Android BT 连接在几秒钟后退出(EEG 读数)
【发布时间】:2016-07-22 22:29:07
【问题描述】:

我创建了一个从 bt 发射器 (Bluegiga) 接收数据的应用程序。读数来自 EEG 信号。数据速率为 1Khz(我不得不承认它很高)。无论如何,我在几秒钟内获取了一些数据,然后蓝牙就像没有传入数据一样(这是不正确的)。如果我尝试使用该应用程序断开蓝牙,则很明显与 EEG 板上的 bt 模块不再通信,因为它不响应断开连接(它有一个指示何时连接的 LED,但它没有t打开/打开或任何东西)。

如果我将数据速率降低到(比如说 500hz),应用程序可以正常工作,偶尔会出现“退出”,但可以忍受。如果我将其降低得更多,则应用程序可以正常运行。

当然,根据设计,我的应用程序必须以 1Khz 数据速率运行,所以问题就在这里。

我检查了其他一些帖子,试图找到某种 sns,但没有一个完全符合我的问题(无论如何我试图使用它们的信息,但显然没有成功)。

有时我收到此消息,“dm_pm_timer expires”,有时没有(在 bt 停止工作后)。

遗憾的是,没有任何指示、异常或消息可以告诉我发生了什么。

这是我的 BT 接收线程代码

    class BluetoothReadThread extends Thread {


    private final InputStream iStream;
    private final OutputStream mmOutputStream;

    private boolean continueReading = true;

    public BluetoothReadThread() {
        InputStream tmp = null;
        OutputStream tmp2 = null;

        try {
            tmp = btSocket.getInputStream();
            tmp2 = btSocket.getOutputStream();

        } catch (IOException e) {
        }
        iStream = tmp;
        mmOutputStream = tmp2;


    }

    @Override
    public void run() {

        int c;
        int waitCount = 0;
        while (continueReading) {
            try {


                if (iStream.available() > 0) {
                    waitCount = 0;
                    c = iStream.read();
                    readBuffer[readBufferPosition++] = c;


                    if (readBufferPosition == bitsExpected) {


                        if (bitsExpected == 22) {
                            ch1 = MultiplicationCombine(readBuffer[4], readBuffer[3]);
                            ch2 = MultiplicationCombine(readBuffer[6], readBuffer[5]);
                            ch3 = MultiplicationCombine(readBuffer[8], readBuffer[7]);
                            ch4 = MultiplicationCombine(readBuffer[10], readBuffer[9]);
                            ch5 = MultiplicationCombine(readBuffer[12], readBuffer[11]);
                            ch6 = MultiplicationCombine(readBuffer[14], readBuffer[13]);
                            ch7 = MultiplicationCombine(readBuffer[16], readBuffer[15]);
                            ch8 = MultiplicationCombine(readBuffer[18], readBuffer[17]);


                        } else {




                            ch1 = (int) filter_3((double)MultiplicationCombine(readBuffer[5], readBuffer[4], readBuffer[3]));
                            ch2 = (int) filter_4((double)MultiplicationCombine(readBuffer[8], readBuffer[7], readBuffer[6]));
                            ch3 = (int) filter_2((double)MultiplicationCombine(readBuffer[11], readBuffer[10], readBuffer[9]));
                            ch4 = (int) filter_2((double)MultiplicationCombine(readBuffer[14], readBuffer[13], readBuffer[12]));
                            ch5 = (int) filter_2((double)MultiplicationCombine(readBuffer[17], readBuffer[16], readBuffer[15]));
                            ch6 = (int) filter_2((double)MultiplicationCombine(readBuffer[20], readBuffer[19], readBuffer[18]));
                            ch7 = (int) filter_2((double)MultiplicationCombine(readBuffer[23], readBuffer[22], readBuffer[21]));
                            ch8 = (int) filter_2((double)MultiplicationCombine(readBuffer[26], readBuffer[25], readBuffer[24]));


                        }

                        Header_int = readBuffer[0];
                        PK_ID_int = readBuffer[1];
                        PK_Counter_int = readBuffer[2];


                        if (downsample++ == downsample_value) {
                            addEntry(ch1 / scaCh1, ch2 / scaCh2, ch3 / scaCh3, ch4 / scaCh4, ch5 / scaCh5, ch6 / scaCh6, ch7 / scaCh7, ch8 / scaCh8);
                            downsample = 0;
                        }
                        //ProgrNum,PacketType,Ch1,Ch2,Ch3,Ch4,Ch5,Ch6,Ch7,Ch8,MRK

                        if (write_open) {
                            osw.write(PK_Counter_int + "," + PK_ID_int + "," + ch1 + "," + ch2 + "," + ch3 + "," + ch4 + "," + ch5 + "," + ch6 + "," + ch7 + "," + ch8 + "," + bolOpenClose + "\n");
                            //osw.write(PK_Counter_int + "," + PK_ID_int + "," + ch1 + "," + ch2 + "," + ch3 + "," + ch4 + "," + ch5 + "," + ch6 + "," + ch7 + "," + ch8 + ","  + "\n");
                        }

                        System.out.println(PK_Counter_int + "," + PK_ID_int + "," + ch1 + "," + ch2 + "," + ch3 + "," + ch4 + "," + ch5 + "," + ch6 + "," + ch7 + "," + ch8 + ", AV=" + iStream.available() );


                        mmOutputStream.write(valueSTR.getBytes());

                        // if(downsample++==14) { safe_copy(readBuffer);  plot=true; downsample=0;}


                        readBufferPosition = 0;
                        try {
                            Thread.sleep(3);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }


                    }


                } 

            } catch (IOException e) {
                System.out.println(e + "\nError sending data + :" + e);
                // Bluetooth error! Stop reading.
                //this.stopAndSendIntent();
            }
        }
    }

    /*
            public void stopAndSendIntent() {

                this.cancel();

                Intent intent = new Intent();
                intent.setAction(BLUETOOTH_ACTION_DONE_READING);
                sendBroadcast(intent);
            }
    */
    public void cancel() {
        System.out.println("-----Cancelling readThread!!");
        try {
            iStream.close();
        } catch (IOException e) {
        } catch (NullPointerException e) {
        }
        ;

        continueReading = false;
    }

}

它的工作原理是这样的: 我读取了一个接收到的字符(c=iStream.read())。 然后我将此字符复制到一个 int 数组,直到达到数据包的长度(可以是 22 或 28(bitsExpected))。

以下部分只是对信号进行滤波和绘图。

我尝试了许多其他实现,但得到了相同的结果。

即使我消除了过滤和绘图的部分(仅读取数据),问题仍然存在。

如果我不使用数组,而是使用字符串,即使用 append()(应该相同?)我设法获得一个工作连接(不退出)但是,一旦我使用数组一切都一样。

我已经坚持了 1 个月,所以我非常感谢任何 cmets、过去的经验或建议。

提前致谢。

【问题讨论】:

    标签: android bluetooth real-time


    【解决方案1】:

    我刚刚添加了这段代码

     if (PK_Counter_int % 100 == 0) mmOutputStream.write(startTring.getBytes());
    

    到目前为止它工作得很好。

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-22
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多