4

FT232 USB チップに接続された USB Host API を使用して Android アプリケーションを開発しています。FT232 デバイスは大量のサンプル (20KBps) を Android SBC に送信します。しかし、時折、いくつかのサンプルが失われていることに気付きました。2 つのエンドポイント間の通信を確認するために、USB アナライザーを接続しています。一部の USB パケットに遅延が見られます。

FT232 USB パケットは 64KB で、スレッドはバルク転送 API を繰り返し呼び出して、次のパケットを取得し、循環バッファーを埋めます。循環バッファーからデータを読み取る別のスレッドがあります。両方のスレッドは、循環バッファーの読み取りおよび書き込み時に同期されます。読み取りスレッドのブロックが長すぎて、書き込みスレッドが一部のパケットを見逃しているかどうかはわかりません。これを改善するためのアイデアや提案はありますか?

ボーレート 460800、8、N、1

以下は私のコードスニペットです。

public class UsbClass {

private static final int MAX_BUFFER_SIZE = 512000;
private byte[] circularBuffer = new byte[MAX_BUFFER_SIZE];
private int writeIndex=0;
private int readIndex=0;

ReadUsbThread usbReadThread;
ParseDataThread parseThread;

public UsbClass() {
    super();
      usbReadThread = new ReadUsbThread();
      usbReadThread.start();

      parseThread = new ParseDataThread();
      parseThread.start();
}

// Read data from USB endpoint
public class ReadUsbThread extends Thread {
    public ReadUsbThread() {

    }
    int length;
    byte[] buffer = new byte[64];
    public void run() {
        while(true)
        {
            length = conn.bulkTransfer(epIN, buffer, buffer.length, 100);
            if(length>2)
            {
                writeCircularBuffer(buffer, length);
            }
            else
                Thread.sleep(1);
        }
    }
}

// Parse the data from circular buffer
public class ParseDataThread extends Thread {
    public ParseDataThread() {

    }
    byte[] data;
    public void run() {
        while(true)
        {
            data = readCircularBuffer(1);
            // do something with data
        }
    }
}

// Write to circular buffer
public synchronized void writeCircularBuffer(byte[] buffer, int length)
{
        for(int i = 2; i<length; i++)
        {
            circularBuffer[writeIndex++] = buffer[i];
            if(writeIndex == MAX_BUFFER_SIZE)
                writeIndex=0;
        }
}

// Read from circular buffer
public synchronized byte[] readCircularBuffer(int length)
{
    byte[] buffer = new byte[length];
    for(int i = 0; i<length; i++)
    {

        buffer[i] = circularBuffer[readIndex++];

        if(readIndex == MAX_BUFFER_SIZE)
            readIndex=0;
    }
    return buffer;
}

}

4

0 に答える 0