2013-10-15 3 views
0

안녕하세요. 먼저 내 질문을 읽어 주셔서 감사합니다!안드로이드 스마트 폰의 3.5mm 오디오 포트를 통한 RS232 시리얼 신호 입력 (안드로이드 개발)

필자는 본질적으로 RS232 시리얼 신호 (1200 보, 8 데이터 비트, 패리티 비트 없음, 정지 비트)의 출력을 제공하는 장치를 가지고 있습니다. 이 출력은 3.5mm 오디오 잭을 통해 내 안드로이드 폰으로 전송됩니다.

모든 데이터 비트를 변수에 저장하고 표시하거나 계산할 때 다음 비트가 들어올 때 변수를 무시해야합니다.

내가

내가 발견 ... 내가 변수의 데이터 비트를 thave하지만 오디오 잭 일에서 읽은 기본 입/스트림/수행하는 방법에 대한 아무 생각이 후 함께 할 수 정확히 알고이 있지만, 그것은 나를 많이 도와주지 않습니다. Android serial port via audio jack 어쩌면 다음과 같이 될 수 있습니다 : Android: Need to record mic input

제발 도와주세요, 고마워요!

편집 :

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가 : 페이로드는 9 개 바이트 패킷 전송 내 신호 대한 더 많은 정보 I는 I가 버퍼에 입력을 저장하고, 버퍼로부터의 신호를 판독한다고 생각 ...하지만 어떻게 오디오 잭에서 직렬 입력을 버퍼에 기록합니까?

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

를하지 상세한 답변을하는 동안 문제로, 현재의 접근 방식에 문제가 있습니다

  1. 당신은을 위반하고 Nyquist sampling theory에서 수신 신호를 회선 속도로 샘플링합니다. 시스템 대역폭은 최소한 비트 전송률의 두 배가되어야합니다.

  2. 현재 메시지를 구성하여 바이트 스트림 사이에 메시지 시작 또는 끝을 표시하는 방법이없는 것처럼 보입니다. 특히 0x0a0x0d은 메시지 본문의 다른 곳에서 합리적으로 예상 될 수 있습니다. 각 바이트의 MSB를 사용하여 프레이밍 신호를 보내고 페이로드를 각 바이트의 나머지 7 비트로 만 인코딩하는 것을 고려할 수 있습니다.

  3. 클록 복구없이 신호를 샘플링하려고합니다. 송신기 전송 클럭과 수신기의 샘플 클록은 동기가 아닙니다. 즉 클록 에지가 정렬되지 않았습니다. 그들은 시간이 지남에 따라 표류 할 것입니다.

또한 신호 레벨을 처리해야 할 필요가 있습니다. RS232는 잠재적으로 12V에서 신호를받습니다.

이것은 이미 잘 해결 된 문제입니다. 모뎀 표준을 살펴 보는 것이 좋습니다. 어떤 종류의 변조 (예 : Phase Shift Keying)는 일종의 클록 복구와 함께 사용되어 위의 문제 1과 3을 처리합니다.

관련 문제