1

こんにちは、まず私の質問を読んでくれてありがとう!

基本的に RS232 シリアル信号 (1200 ボー、8 データビット、パリティ ビットなし、1 ストップ ビット) だけを出力するデバイスがあります。この出力は、3.5mm オーディオ ジャックを介して Android フォンに送られます。

すべてのデータビットを変数に格納し、何かを表示または計算したいのですが、次のビットが入ったときに変数をオーバーライドする必要があります。

変数にデータビットを取得した後、それをどうするかは正確にわかっていますが、基本的な入力/ストリーム/オーディオジャックからの読み取りを行う方法がわかりません...

これを見つけましたが、あまり役に立ちません:オーディオ ジャック経由の Android シリアル ポート おそらく次のようなものです: Android: マイク入力を録音する必要があります

助けてください、ありがとう!

編集: 私の信号に関する詳細情報 ペイロードは 9 バイトのパケットで送信されます。

1: command byte as ASCII character ('I','A','S','L','R','C' or ' ')
2-6: time in ASCII chars (2:34:56)
7: checksum (64 + sum of time digits)
8: CR (carriage return, ASCII code 0x0D)
9: LF (line feed, ASCII code 0x0A)

Edit2: また、入力をバッファに保存してから、バッファから信号を読み取る必要があると思います...しかし、オーディオジャックからのシリアル入力をバッファに書き込むにはどうすればよいですか?

Edit3:多分このようなものがうまくいくでしょう:

try
        {
            int N = AudioRecord.getMinBufferSize(8000,AudioFormat.CHANNEL_IN_MONO,AudioFormat.ENCODING_PCM_16BIT);
            recorder = new AudioRecord(AudioSource.MIC, 1200, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10);
            track = new AudioTrack(AudioManager.STREAM_MUSIC, 1200, 
                    AudioFormat.CHANNEL_OUT_MONO, AudioFormat.ENCODING_PCM_16BIT, N*10, AudioTrack.MODE_STREAM);
            recorder.startRecording();
            track.play();
            /*
             * Loops until something outside of this thread stops it.
             * Reads the data from the recorder and writes it to the audio track for playback.
             */
            while(!stopped)
            { 
                Log.i("Map", "Writing new data to buffer");
                short[] buffer = buffers[ix++ % buffers.length];
                N = recorder.read(buffer,0,buffer.length);
                track.write(buffer, 0, buffer.length);
            }
        }
        catch(Throwable x)
        { 
            Log.w("Audio", "Error reading voice audio", x);
        }
        /*
         * Frees the thread's resources after the loop completes so that it can be run again
         */
        finally
        { 
            recorder.stop();
            recorder.release();
            track.stop();
            track.release();
        }
    }
4

1 に答える 1

1

あなたの問題に対する詳細な答えではありませんが、現在のアプローチには多くの問題があります

  1. 入力信号をライン レートでサンプリングすることにより、ナイキスト サンプリング理論に違反しています。システムの帯域幅は、ビットレートの少なくとも 2 倍である必要があります。

  2. 現在、メッセージをフレーミングして、バイト ストリームの中でメッセージの開始または終了を示す方法がないようです。特に、 と の両方0x0a0x0d、メッセージ本文の他の場所で合理的に期待される可能性があります。各バイトの MSB を使用してフレーミングを通知し、各バイトの残りの 7 ビットでペイロードのみをエンコードすることを検討してください)。

  3. クロック回復なしで信号をサンプリングしようとしています。送信側の送信クロックと受信側のサンプル クロックは同期していません。つまり、クロック エッジが一致していません。それらは時間の経過とともにドリフトする可能性があります。

さらに、信号レベルに注意する必要があります - RS232 は潜在的に 12v で信号を送られます。

これはすでに十分に解決された問題です。いくつかのモデム規格を調べることをお勧めします。ある種の変調 -位相シフト キーイングなどは、通常、上記の問題 1 と 3 に対処するために、ある種のクロック リカバリと共に使用されます。

于 2013-10-15T17:17:36.930 に答える