C#から.NET FrameworkのSerialPortコントロールを使用してシリアルポートからデータの送受信を行うサンプルコードです。 文字列の送受信を行います。 SerialPortクラスの使い方はVB.NETでシリアル通信を行うときと同じです。
シリアル通信の制御方法がわかりましたのでプログラムの作成を行います。いつもの手順でsci.cとsci.hをプロジェクトに登録してください。sciとはシリアル通信:Serial Communication Interfaceの略です。
USB(ユニバーサル シリアル バス)、シリアルATAなど、様々な規格はシリアル通信を行っています。 RS-232C. こんにちは、ナナです。前章のA/D変換において光センサの値によりLEDを制御しました。ここで問題なのが光センサは0~1023の値が取れているはずですが、具体的にどれくらいの数値が取れているのかがわからないことです。そこで本章ではマイコン側の情報をパソコンに送ることで情報を可視化する手段を手に入れましょう。コンピュータ間でデータ通信を行うための本記事では次の疑問点を解消する内容となっています。では、シリアル通信の仕組みを学んでいきましょう。通信ってそもそも何のために必要なのでしょうか?まずはそこから知っていきましょう。世の中にはたくさんのコンピュータが存在します。そうすると通信の方法はEthernet、I2C、CAN、Bluetooth・・・などたくさんの規格がありますが、 その中でも比較的メジャーな通信規格がパソコンにはプログラム結果を表示するためのディスプレイがあるため、プログラムの挙動をprintf関数を使って表示することが可能です。しかし、多くの組み込み機器にはディスプレイというハードウェアがなく、プログラムの動きを捉えることが難しい場面が出てきます。例えば前章で行った光センサのA/D変換ですが、白や黒を検知したときに具体的に0~1023のどのあたりの数値が取得できているのかわからないですよね。このような時に使えるのがビュートローバーもシリアル通信ができるように設計されています。シリアル通信機能を実装しプログラムの動きを目で見て追えるようにしてみましょう。シリアル通信は、データシート「15章 シリアルコミュニケーションインタフェース3(SCI3)」に記載されています。30ページ程あるため、読み応えのある機能になっています。「15.1章 特徴」にはシリアル通信の特徴が記載してあります。特殊な用語が出てきますので解説しておきましょう。シリアル通信の方法として調歩同期式モードとクロック同期式モードというものがあります。どちらを選ぶかによってプログラムの仕方は変わるのですが、私の経験では調歩同期式モードを使う方が一般的です。通信とは送信側と受信側の双方が電気的な信号にて情報をやり取りします。シリアル通信は送信と受信を分けて通信しますので、送信中に受信するといった同時並行の送受信が可能です。ビットレートとは情報を転送する際の転送速度を表します。bps(Bit Per Second)という単位で表現され、1秒間に何ビットを転送できるかを示します。もちろん数字が大きいほど転送量を多くすることが可能です。送信終了/送信データエンプティ/受信データフル/オーバランエラー/フレーミングエラー/パリティエラーの6種類の割り込みイベントが用意されています。これまでの他の機能と比べると非常に多くの種類があります。今回は割り込みは利用しませんが、本格的なシリアル通信機能を利用するとなるとこれらのイベントを上手に制御する必要がでてきます。調歩同期式モードでは通信する際のルールとして、いくつかの情報を送信側・受信側であらかじめ決めておく必要があります。通信とはコンピュータ同士の会話ですから会話するためのルールを双方で決めておくということです。1度に転送するデータの長さです。選択肢として7ビットと8ビットがあります。転送速度です。非常に多くの種類があります。代表的なビットレートは、9600bps/19200bps/38400bps/115200bpsなどがあります。転送時のエラー検出用の情報です。選択肢として、使用しない/偶数パリティ/奇数パリティがあります。データ長分のデータを送った後に付与するデータ転送の終わりを示すデータの長さです。選択肢として1ビットと2ビットがあります。今回のシリアル通信を扱う際のこれらの情報は下記として対応します。後程これらの情報はレジスタを利用して適切に選択する必要があります。データ長:8bitビットレート:19200bpsパリティ:使用しないストップビット長:1bitデータシート「15.3章 レジスタの説明」にシリアル通信のレジスタ一覧があります。非常に多くのレジスタがあります。今回の課題ではビュートローバーから送信する機能のみを作成します。そのため太字のレジスタを解説します。この2つのレジスタはシリアル通信の通信設定を管理するレジスタです。ほとんどのビットがシリアル通信の設定と1対1で対応しているのがわかります。通信クロックの設定はBRRレジスタとも連動しています。ビットレートの設定方法はデータシートの読み方を知る必要がありますので解説しましょう。データシート「15.3.8章 ビットレートレジスタ(BRR)」を見てください。次の表があります。まずは縦軸と横軸で着目する欄を決定します。ビュートローバーはシステムクロック12MHzであるのと今回目標のビットレートは19200bpsです。そこからnとNの値を見つけ、対象のレジスタ設定値とします。これがビットレートのレジスタ値の決定方法です。SCR3レジスタはシリアル通信の送受信や割り込み制御用のレジスタです。このレジスタを利用して通信の開始/停止を主に制御します。シリアル通信で送信するデータを書き込む1Byteのレジスタです。ビュートローバーとパソコンの間でシリアル通信を可能にするためには、あらかじめシリアル通信ができる状態に設定を変更しておく必要があります。その方法を解説します。パソコンとビュートローバーをUSBケーブルで接続してください。第02章 次の画面が表示されればUSBケーブルを抜いて大丈夫です。切り替え完了です。この作業は一度だけ行えばよく、以降はビュートローバーの電源を落としてもシリアル通信の状態が継続されます。ビュートローバーをシリアル通信に切り替えると、これまで行ってきたプログラムの書き込み手順に少し変更が必要となります。まずは、いつも通りH8 Writer Vstoneを起動します。これまでは「USB HID」が選択されていたはずですが、「シリアルポート」を選択するようにしてください。下記図ではCOM 3とされていますが、皆さんのパソコンでは番号が異なる可能性があります。選択後に「書き込み」を行うことでいつも通りプログラムをビュートローバーに書き込むことができます。以前のようにUSB HIDで書き込みしたい場合は、VS-WRC003LV シリアルコンバータを再度起動し「HID(標準)へ変更」を実施すれば元に戻すこともできる!シリアル通信機能を実装する前に、第02章 ビュートローバーをパソコンがUSBケーブルで接続された状態でTeraTermを起動し次の設定を行います。TeraTermをシリアル接続として動作させます。ポートにはビュートローバーに接続するCOMが選択されているはずです。ビュートローバーから受信した文字の改行コードの扱いを設定します。この設定をしておくと改行文字(\n)を受信した際に綺麗に改行されるようになります。調歩同期式モードの通信パラメータの設定を行います。ビュートローバーの設定と同一にする必要があります。変更した設定を保存します。これをしておかないとTeraTermを閉じた際に再度設定を行わないといけなくなります。毎回設定するのは手間なので保存しておきましょう。TERATERM.INIの保存ダイアログが表示されますので上書き保存してください。シリアル通信の制御方法がわかりましたのでプログラムの作成を行います。いつもの手順でsci.cとsci.hをプロジェクトに登録してください。sciとはシリアル通信:Serial Communication Interfaceの略です。シリアル通信モジュールでは次の機能を実装したいと思います。では、これらを満たすインターフェース仕様を検討します。#include “sci.h”なしインターフェース仕様に従いシリアル通信モジュールを作成せよ。sci.cとsci.hは次のプログラムをベースにして修正を加えよ。MAINモジュールでシリアル通信モジュールを使えるようにせよ。文字列の作成はsprintf関数を利用して実施する。stdio.hをインクルードすることで利用することができる。sprintfはprintf関数のメモリ出力版の関数である。第1引数に書き込み先の文字配列を指定することで、出力書式に応じた内容を書き込むことができる。次のように使う。光センサの値は次のフォーマットで出力する。日本語部分は適宜変数に変更すること。課題が完成したらビルドを行いビュートローバー上で動作させ、期待動作通りに動くことを確認せよ。光センサ1と光センサ2が1秒間隔で次のようにTeraTerm上で表示されることを確認する。H8 Writer Vstoneでプログラムを転送しようとしたら次のエラーが表示され書き込みができなくなってしまいました。このエラーはTeraTermが起動している状態でプログラムの書き込みを行おうとした時に表示されるエラーです。手間ではありますがライターでプログラムを書き込む際にはTeraTermの画面は閉じておきましょう。ライターがシリアル通信で書き込む際にCOMというシリアル通信ポートを開く必要があるのですが、TeraTermがCOMを開いているためライターがCOMを開くことができないことが原因です。シリアル通信のクロック同期式モードというのは使わないものなのでしょうか?使わないというわけではありません。クロック同期式の場合はハードウェア上で通信するための信号線を1つ増やす必要があります。そういった点からも少し選択されづらい経緯はあると思います。まずは、シリアル通信の基本は調歩同期式なのでこちらをマスターするとよいでしょう。マイコンを基礎から体系的に学びたい方はこちらからどうぞ~サイトへのご訪問ありがとうございます。年間200人以上のプログラミング初心者・未経験者を直接指導で教育している現役エンジニアです。本サイトでは開発経験20年のノウハウ・学習ポイント・カリキュラムを全力でわかりやすく解説します!ぜひ、モノづくりの世界をプログラミングで楽しんでください。サイトへのご訪問ありがとうございます。年間200人以上のプログラミング初心者・未経験者を直接指導で教育している現役エンジニアです。本サイトでは開発経験20年のノウハウ・学習ポイント・カリキュラムを全力でわかりやすく解説します!ぜひ、モノづくりの世界をプログラミングで楽しんでください。
Arduinoで利用するシリアル通信は、「RS-232C」と呼ばれる規格です。 正式名称はEIA-232Dですが、誰もこの呼び名は使っていません。