通过Android智能手机的3.5mm音频端口输入RS232串口信号(android开发)

时间:2013-10-15 14:32:41

标签: android audio serial-port stack

嗨,先谢谢你阅读我的问题!

我有一个设备,它给我一个基本上只有RS232串行信号的输出(1200波特,8个数据位,无奇偶校验位,一个停止位)。这个输出通过3.5毫米音频插孔进入我的Android手机。

我想将每个数据位存储到变量中,显示或计算某些内容,当下一位进入时,它应该覆盖变量。

在我对变量中的数据位进行了解后,我确切知道如何处理它,但我不知道如何从音频插孔中进行基本输入/流/读取...

我发现了这一点,但它对我没什么帮助:Android serial port via audio jack 也许是这样的:Android: Need to record mic input

请帮帮我,谢谢!

编辑:有关我的信号的更多信息 有效载荷以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();
        }
    }

1 个答案:

答案 0 :(得分:1)

虽然不是您问题的详细解答,但您当前的方法存在许多问题

  1. 您通过以线路速率对输入信号进行采样来违反Nyquist sampling theory。您的系统带宽必须至少是比特率的两倍。

  2. 您目前似乎无法构建消息,以指示消息在字节流中开始或结束。特别是,{+ 1}}和0x0a可能在消息正文的其他地方合理地预期。您可以考虑使用每个字节的MSB来发信号通知帧,并且只在每个字节的剩余7位中编码有效载荷)

  3. 您正在尝试在没有时钟恢复的情况下对信号进行采样。发送器发送时钟和接收器的采样时钟不同步 - 也就是说时钟边沿未对齐。随着时间的推移它们可能会漂移。

  4. 此外,您需要处理信号电平 - RS232可能在12v发出信号。

    这是一个已经很好解决的问题 - 我建议看看一些调制解调器标准。某种调制 - 例如Phase Shift Keying通常用于某种时钟恢复以处理上述问题1和3。