通过蓝牙在python和Java之间正确发送数据

我实际上是在智能手机上开发应用程序(频谱分析仪)。 这个应用程序可以通过蓝牙与覆盆子pi 3和扫描频率从我的RTLSDR-2832(插入RPI3)进行通信。

我写了一个脚本来从我的RTLSDR-2832获取样本,然后我通过蓝牙将它发送到我的应用程序:

from pylab import* from rtlsdr import* from bluetooth import* import sys #configure device sdr= RtlSdr() sdr.sample_rate=double(sys.argv[3]) sdr.gain=double(sys.argv[2]) sdr.center_freq=double(sys.argv[1]) NFFT=50 #Bluetooth connection server_sock=BluetoothSocket(RFCOMM) server_sock.bind(("",PORT_ANY)) server_sock.listen(1) port=server_sock.getsockname()[1] uuid="94f39d29-7d6d-437d-973b-fba39e49d4ee" client_sock,client_info=server_sock.accept() while(1): samples=sdr.read_samples(256*1024) result=psd(samples,NFFT, Fs=sdr.sample_rate/1e6, Fc=sdr.center_freq*1e6/1e6) tab_freq=(result[1]/1e6) value_freq=str(tab_freq)[1:-1] value_list=[format(float(v), ".10f") for v in value_freq.split()] value_freq2= "\n".join(value_list) tab_pxx=result[0] value_pxx=str(tab_pxx)[1:-1] client_sock.send(value_freq2+'\n'+'\n'.join(value_pxx.split())) 

因此,使用此脚本,我可以从RTLSDR2838获取数据并发送数据。 我先通过蓝牙发送所有数据freq,然后是pxx值(以db / Hz为单位)。

我得到了我的应用程序的所有数据:

 private class ThreadConnected extends Thread { private final BluetoothSocket connectedBluetoothSocket; private final InputStream connectedInputStream; private final OutputStream connectedOutputStream; boolean running; public ThreadConnected(BluetoothSocket socket) { connectedBluetoothSocket = socket; InputStream in = null; OutputStream out = null; running = true; try { in = socket.getInputStream(); out = socket.getOutputStream(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } connectedInputStream = in; connectedOutputStream = out; } @Override public void run() { byte[] buffer = new byte[1048576]; // 20 bits int bytes; String strRx = ""; while (running) { try { bytes = connectedInputStream.read(buffer); final String strReceived_freq = new String(buffer,0, 15*nb_points); final String strReceived_pxx = new String(buffer,15*nb_points, bytes); //final int samples_sdr=new Integer(buffer,0,bytes); final String strByteCnt = String.valueOf(bytes) + " bytes received.\n"; runOnUiThread(new Runnable(){ @Override public void run() { Pxx_value.setText(strReceived_pxx+"\n"); // get data PXX freq_value.setText(strReceived_freq+"\n"); // get data freq // plot value /* for (int i=0; i<nb_points; i++) { freq[i]=Double.parseDouble(strReceived_freq); pxx[i]=Double.parseDouble(strReceived_pxx); series.appendData(new DataPoint(freq[i],pxx[i]), true,500); }*/ }}); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); cancel(); final String msgConnectionLost = "Connection lost:\n" + e.getMessage(); runOnUiThread(new Runnable(){ @Override public void run() { }}); } } } public void write(byte[] buffer) { try { connectedOutputStream.write(buffer); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void cancel() { running = false; try { connectedBluetoothSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 

变量nb_points在我的脚本上像NFFT一样固定为50。 但是当我这样做时,我没有得到我的50个值。 如果我尝试将nb_points和NFFT修复为30或更低,它可以工作但不是……

我想早点可能问题来自缓冲区但显然没有……

有人有任何想法解决这个问题吗?

谢谢你的帮助 !

编辑:它确切地工作到33,在我不知道它是否与我的缓冲区有关之后,但是对于我的选项卡的每个情况,我得到2个值相同的时间(我的频率和pxx值),因为选项卡正在写再次