MIRS06sp-num0003a

MIRS06sp-num0003a　音声出力のためのソフトウェア開発
MIRS06sp-num0003a

改訂記録
版数 作成日 作成者 承認 改訂内容
A01 2006.7.28 尾崎/吉田/柏木 初版

## 目次

1．開発概要
2．プログラム概要
3. 発生した問題とその解決法
4. 今後の課題

## 1．開発概要

今回開発したのはシリアル通信用の送受信プログラムである。
音声再生モジュールをシリアル通信により制御することが目的であるが、今回のプログラムはWindows・Linux・音声再生モジュールの3種類と通信することができる。
入力モードは非カノニカル処理を用い、またシグナルハンドラを組み込むことにより非同期モードでの動作としている。
これはシグナルハンドラを用いることにより、安定して信号を受信するのが目的である。
※カノニカル処理と非カノニカル処理
カノニカル処理は行単位（すなわち、改行コードあるいは行終端文字、ファイル終端文字まで）で入力処理を行うのに対し、非カノニカル処理は文字数単位で入力処理を行うため、受信する文字列に制限がない。
音声再生モジュールの発信する文字列には改行コードなどは含まれていないため、カノニカル処理では安定した動作をしなかったため、非カノニカル処理を用いることにした。

## 2．プログラム概要

キーボードから入力したデータをシリアルポートに書き込み、相手からデータが返ってくるまで待機する。
データを受信したらディスプレイに表示し、もしエラーコードだった場合はそのコードに対応したエラーメッセージを表示する（音声再生モジュールのみ）。
入力待ちの状態で「end」と入力するとプログラムを終了する。
プログラム：term.c

## 3. 発生した問題とその解決法

プログラム上で制御命令を発信しているはずなのに音声再生モジュールが動作しない
SDカードのフォーマット方式が限定されている
→今回用いている音声再生モジュールではSDカードのフォーマット方式が限定されており（FAT16あるいはFAT32）、違うフォーマット方式では内部ファイルにアクセスできない。
WindowsとLinuxでは改行コードが違う
→音声再生モジュールに送信する命令は最後に改行が必要であるが、音声再生モジュールはWindows用に作られたものであるため、改行コードがLinux標準のものと違う。
そのためプログラム上でただ改行コードを送信しても音声再生モジュールは動作しないため、Linux標準の改行コード\nではなく、それにCRを加えたWindows標準の改行コード\r\nを送信するようにした。
通信速度の設定
→プログラムでの設定とモジュールの設定が一致していないと上手く通信ができない。（モジュールではデフォルトの通信速度は9600bps）

信号がうまく受信できない、通信が安定しない
通信はできるが、かなりの確率で通信不能状態になる
→Linuxのシリアル通信はデフォルトが同期通信になっているが、音声再生モジュールは非同期通信しか行えないため、データのやり取りが正しく行われなかった。
→初期のプログラムではカノニカル入力処理を行っていたため、音声再生モジュールからのデータをうまく受信することができなかった。
※ちなみに、Windowsではカノニカル処理と非カノニカル処理、同期通信と非同期通信を自動で切り替えているようである。

## 4. 今後の課題

プログラムにまだ余計な部分があると思うので、その部分を削る。
実際にMIRSにこのままのプログラムで搭載するわけではなく、関数の一種とすることを考えているので、その辺の調整を行う。
プログラム中のエラーコード表示部がMIRSだと表示されない。

関連文書
参考資料：http://www.linux.or.jp/JF/JFdocs/Serial-HOWTO.html