SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

C#で学ぶインターネット時代のシリアル通信

C#で学ぶインターネット時代のシリアル通信(後編)

C#によるシリアル通信を使ったより実践的なアプリケーション作成

  • X ポスト
  • このエントリーをはてなブックマークに追加

シリアル通信の応用

 RS232Cは使いやすさから、長く使われている仕様です。使いやすさを優先させていることと、登場したのがずいぶん古いということもあり、あくまで、一対一の通信となっています。シリアル通信規格で一対多の仕様もできています。前にも出したRS485の規格は32台まで芋づる式につなぐことができます。

 セキュリティもありません。特別なエラー制御もありません。プログラムでかってにやってくれという仕様です。これらは計測制御の場面で1つの問題でもあります(通信エラー処理を考えた通信仕様をプログラム側で考えなければいけません)。時期を同じくして、GPIBというしっかりした通信規格が出てきました。この規格は一対多をサポートしています。この規格も計測機器の世界ではまだ幅を利かせています。

 現在は、皆さんご存知のLAN通信が主流になりつつあります。インターネットが整備されていることで、LANを使うと遠くに離れた(人が行けない場所など)計測機器の制御やデータ収集ができます。ただ一般的に利用できるようにしているため、仕様がとても複雑です。LAN通信の仕様に合わせて、すべてのルーチンを自前で作成するのは、大変な作業になります。

 そんなこともあり、このRS232C規格はまだまだ現役で活躍しています。しかし「遠くにあるRS232C規格の制御機器を動かしたい」という要望は強く出て来ています。そこで、現在では「RS232C⇔LANプロトコル変換器」なるものが出て来ました。制御機器側は今までどうりRS232Cで作成し、LANプロトコル変換器でインターネットを通じてパソコンや他の制御機器とたやすくつなぐことができるようになりました。

 例えば、農家のビニールハウスは温度管理はとても大変です。ハウスの中の温度が上がると、ハウスの一部を開けて冷やしてやらねばいけません。ある温度でビニールハウスの開け閉めの制御を行うのはワンボードマイコンが使用されています。農家の人たちが家の中で、パソコンで設定をしたり、異常時に携帯に知らせてくれたりするシステムが在ると、対応がスムーズに出来て管理もしやすくなると思います。ここで、「RS232C⇔LANプロトコル変換器」の出番です。ワンボードマイコンはRS232Cで通信をし、変換器でインターネットにつなげれば、携帯にメールすることもできます(メールをするときはサーバーが必要になります)。

送り方のバリエーション

 今回は1行まとめて送りましたが、1文字ずつ送る場合や、区切り文字を特別に設定したいときなど、もう少し工夫が必要になります。

 今回のサンプルで、もし抽選データを送る側のパソコンが動かなくなったときは、表示用パソコンは永遠に待つことになります。このようなときのために受信のみをまとめて1つのサブルーチンにして、ある一定時間受信がないときでもメインルーチンへエラーで戻すようにします。このエラーをタイムアウトエラーと言います。

 以下、今回のサンプルソフトの受け取り側をタイムアウト付きの処理にしたものです

 画像表示は組み込んでいません。

[リスト7]Form1.cs(read_sampプロジェクト)
//Form1_Loadで0セット Form1_FormClosedで1セット
int endf;
//ボタンとサブルーチンで使用するため ここに宣言
SerialPort port;

private void button1_Click(object sender, EventArgs e)
{
  //RS232C OPEN
  port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
  port.DtrEnable = true;
  port.RtsEnable = true;
  port.Open();
  port.DiscardInBuffer();         //バッファクリア
  this.label1.Text = "待ち";
  while (true)
  {
      Application.DoEvents();
      if (endf == 1) break;
      //ここでサブルーチンを呼ぶ
      //一定時間受信がなくても戻る
      //戻り値は"Time Out"
      this.label1.Text = rs_inp();
  }
  port.Close();
}
//****************
//読み込みサブルーチン
//****************
private string rs_inp()
{
  string s;
  int c;              //タイムアウト用
  //取り込みエリア 今回1文字
  Byte[] data=new Byte[1];
  s = "";
  c = 0;
  data[0] = 0x00;     //dataエリアクリア
  while (true)
  {
      c++;
      if (c > 200000)    //テストしたパソコンで10秒くらい
      {
          s = "Time Out";
          break;
      }
      Application.DoEvents();
      if (endf == 1) break;
      if (port.BytesToRead != 0)
      {
          c = 0;              //タイムアウトカウントクリア
          port.Read(data, 0, 1);	//1文字ずつ読み込み
          if (data[0] == '\n') break;	//送るとき\nを最後につけているので、
                                      //\nで行の終了を確認する
          s = s +System.Convert.ToChar(data[0]);
      }
  }
  port.DiscardInBuffer();         //バッファクリア
  return s;
}

 読み込みサブルーチンrs_inpを作成しました。戻り値は10秒間隔で受信があれば受信データを、なければTime Outの文字を返すようにしています。

 通信処理内で止まってしまうとプログラム側で対処できなくなります(通称ハングアップ)。これを回避するため1文字ずつ読み込み、データが来ないときはタイムアウトエラーとして、メインに返すようにします。

まとめ

 この規格はワンボードマイコンで手軽に通信処理プログラムを作ることができるので、パソコンと他の制御機器との通信に多く使用されています。今回はパソコン同士で通信する例題を作成しました。手軽にパソコン同士の通信ができ、会社の展示会で顧客の目を引いたり、イベント会場でオセロゲームで対戦させたり、いろいろな人のアイデアで楽しいひと時が過ごせるのではないかと思います。

 パソコン単体でもゲームあり、動画ありで、面白いのですが、このようにパソコン同士をつなげて楽しむことが手軽にできるようになると、今まで硬いイメージしかなかったパソコンが、なんだか楽しい生き物に見えてくるのではないでしょうか。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
C#で学ぶインターネット時代のシリアル通信連載記事一覧
この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 横塚 利津子(ヨコツカ リツコ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3788 2009/04/20 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング