嗨,先谢谢你阅读我的问题!
我有一个设备,它给我一个基本上只有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();
}
}
答案 0 :(得分:1)
虽然不是您问题的详细解答,但您当前的方法存在许多问题
您通过以线路速率对输入信号进行采样来违反Nyquist sampling theory。您的系统带宽必须至少是比特率的两倍。
您目前似乎无法构建消息,以指示消息在字节流中开始或结束。特别是,{+ 1}}和0x0a
可能在消息正文的其他地方合理地预期。您可以考虑使用每个字节的MSB来发信号通知帧,并且只在每个字节的剩余7位中编码有效载荷)
您正在尝试在没有时钟恢复的情况下对信号进行采样。发送器发送时钟和接收器的采样时钟不同步 - 也就是说时钟边沿未对齐。随着时间的推移它们可能会漂移。
此外,您需要处理信号电平 - RS232可能在12v发出信号。
这是一个已经很好解决的问题 - 我建议看看一些调制解调器标准。某种调制 - 例如Phase Shift Keying通常用于某种时钟恢复以处理上述问题1和3。