缓冲区java阻塞到1024?

问题描述:

我想在我的缓冲区中存储超过1024个字节。其实我试图从python脚本中获得价值。从我python脚本缓冲区java阻塞到1024?

33值的工作原理:

33*15(digits)*2(2 types of values)=990 bytes

如果我尝试发送超过33个值,则不起作用。我的程序说收到了29个字节。

我觉得问题是从缓冲区。我试图修复在65536缓冲区,但它没有改变。它是否存在任何解决方案像我的缓冲区一样储存更多数据?

Python代码:

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=34 

#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())) 

java代码:

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, bytes); 
        final String strReceived_pxx = new String(buffer,(bytes/2)+1, 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); 
          }*/ 

         }}); 

感谢您的帮助。

+0

connectedInputStream连接到了什么? 'new String(buffer,(bytes/2)+1,bytes)'中计算的意义究竟是什么? – EJP

+0

使用connectedInputStream,我可以通过蓝牙从Raspberry PI 3获取数据。我只需编辑我的问题即可添加我的Python脚本。 'new String(buffer,0,bytes/2)'得到所有freq值和'new String(buffer,(bytes/2)+ 1,bytes)得到pxx值(dB/Hz)' – azzerty2017

+0

你不能得到来自输入流的内容比可读取的内容更多。你可以尝试添加一个'BufferedInputStream'。但是如果你确实需要一次2048字节的话,你需要'DataInputStream.readFully()'。 – EJP

很可能你丢失了flush缓冲区(发件人)。

如果不刷新缓冲区,输出可能不会写入。从javadoc

刷新此输出流,并势力任何缓冲的输出字节被写出。 flush的一般契约是,调用它表明,如果先前写入的任何字节已被输出流的实现缓冲,则应立即将这些字节写入其预定目标。

尽管答案与java代码有关,但任何缓冲区的工作原理都是一样的。

尝试线后,你的Python代码中加入:

client_sock.send(value_freq2+'\n'+'\n'.join(value_pxx.split())) 

的显式调用flush(我不知道确切的Python语法)。

+0

调用'flush()'会使问题变得更糟,而不是更好。 – EJP

+0

@EJP你错了。如果不是所有接收到的字节都可能位于发送方的内存缓冲区中,但尚未发送。是不是可以说,因为代码是不完整的(至少这是我回答) –

+0

法拉盛产生更小的传输是不正确的。不冲洗导致更大的传输。 – EJP