画像認識の結果に応じてRCモータを制御する課題では、PC側で認識した結果をマイコンへ正しく送信するシリアル通信が重要になります。しかし、Visual Studio側では送信しているつもりでも、HEW側で受信できていないケースは少なくありません。この記事では、Visual StudioとHEWによるシリアル通信で発生しやすい問題点と確認方法を解説します。
まず確認したいVisual Studio側の問題点
掲載されたコードを見ると、WriteFile関数で送信している変数「tx」の宣言が確認できません。
例えば以下のようなコードになっていない場合、期待したデータが送信されていない可能性があります。
char tx = '2';
WriteFile(PortHandle, &tx, 1, &BytesWritten, NULL);
また、送信している値が数値の2なのか、文字の’2’なのかも重要です。シリアル通信では数値2とASCIIコードの’2’は別物になります。
ASCII文字と数値の違いに注意
HEW側では次のような比較を行っています。
if(cd == '2')
ここで比較しているのは文字の’2’です。ASCIIコードでは16進数0x32になります。
一方、Visual Studio側で以下のように送ると値は異なります。
char tx = 2;
この場合は0x02が送信されるため、HEW側の「’2’」とは一致しません。
| 送信内容 | 値 | HEW側の比較 |
|---|---|---|
| ‘2’ | 0x32 | 一致する |
| 2 | 0x02 | 一致しない |
HEW側の受信処理で気になる点
受信割り込み内では以下の処理が行われています。
if(cd == '2'){
rc = 2;
}
しかしメインループ側では次のようになっています。
if(rc == 1)
else if(rc == '2')
else if(rc == 3)
ここでは「rc == ‘2’」と比較していますが、割り込み側では「rc = 2」を代入しています。
つまり、片方は文字の’2’、もう片方は数値2になっているため条件が一致しません。
送受信ともに『文字で扱うのか』『数値で扱うのか』を統一することが重要です。
受信確認のためにLED制御を単純化する
シリアル通信のデバッグでは、まず受信できているかを確認することが大切です。
例えば受信した値をそのままLEDポートへ出力してみる方法があります。
rc = cd;
P5.DR.BYTE = rc;
これにより送信値と受信値が一致しているか確認しやすくなります。
通信設定も必ず確認する
シリアル通信では通信条件が一致していなければ正常に受信できません。
- ボーレート(9600bps)
- データ長(8bit)
- パリティ(なし)
- ストップビット(1bit)
- COMポート番号
Visual Studio側とHEW側でこれらが一致しているか確認しましょう。
シリアル通信のデバッグに便利なツール
Visual StudioとHEWの間にシリアルモニタを挟むと通信内容を確認できます。
TeratermやRealTermなどのツールを使えば、実際にどの文字が送られているかを確認できます。
画像認識結果を送る前に、まず固定文字列「1」「2」「3」を送受信して動作確認を行うのがおすすめです。
まとめ
Visual StudioとHEWのシリアル通信で失敗する原因として最も多いのが、ASCII文字と数値の混同です。今回のコードでは「’2’」と「2」が混在しているため、条件判定が正常に動作していない可能性があります。
まずは送信データを固定値にし、Teratermなどで通信内容を確認しながら、送信値・受信値・比較条件を統一していくことで問題の切り分けがしやすくなります。画像認識との連携は、その後に実装する方が効率的です。


コメント