ページ

2004年5月13日木曜日

.NET でシリアル通信を使う(覚え書き)

Whidbey では標準でサポートされますが、現状の .NET Framework 1.0、1.1 にはシリアル通信(シリアルポート(Serial Port)の RS-232C とかでモデムを繋いだりするやつのことね)のサポートがないんですよね。
といっても、Win32 ではシリアルポートってあまり特別な存在じゃなく、CreateFile して SetCommState でごにょごにょして、あとは WriteFile とか ReadFile とかして...って感じなので DllImport すれば .NET でだって使えるわけです。


と言っても、すでにそれらをラップして便利に使えるようにしてくれたソースがいろいろと公開されています。なので、それの覚え書き。
なお、以下はちょこっとソースを見ただけで、詳しく調べたわけじゃないのでコメントは間違ってるかもしれません。


MSDN Magazine 「Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications」
http://msdn.microsoft.com/msdnmag/issues/02/10/netserialcomm/

まぁ、標準的な実装なのかな?Win32 API をラップして使いやすくしたクラスが用意されてる。


The Code Project 「Serial Communications : The .NET Way」
http://www.codeproject.com/dotnet/DotNetComPorts.asp

こちらも上のと同じような感じかな?


GotDotNet User Sample 「SerialPort component and CSTerm terminal application」
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=b06e30f9-1301-4cc6-ac14-dfe325097c69

これは Form に貼り付けて使うという使い方ができるようになってるみたい。お手軽かも。


GotDotNet User Sample 「SerialStream - use the serial port as a Stream」
http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=FCBA7FC5-666E-4EB0-863F-0045B0C79EC7

おっ、これはおもしろいかも。Stream を継承して SerialStream を作ってある。ちゃんと BeginRead/Write などの非同期メソッドもある。

4 件のコメント:

  1. きゅっぽん2004年12月18日 8:13

    はじめまして!きゅっぽんです。

    最近C#はじめたばかりなのですが、RS232C使うことになってこちらを見つけました。

    いまごろなんですが、一番下(4番目)試してみています。

    パラメータ等を変えてサンプルそのままでとりあえず通信はできるのですが、なぜか1回目のREADLINEが

    変です。2回伝文を受信しないと初回READLINEを抜けません。あとは関係なくREADLINEしてくれるの

    ですが、そこで、1回目の受信伝文をREADで読み出してみると、ちゃんと読み出しているのですよ。


    質問になってしまうのですが、READLINEは初回時は何か抜ける条件があるのでしょうか?



    返信削除
  2. きゅっぽん2005年1月9日 1:03

    解決しました。終わりがLFまたはCRLFでないとReadLineを抜けられないのですね。

    相手はCRのみ送っていました。なので、Readにて読み込むことにしました。

    ご迷惑をおかけしました。

    返信削除
  3. はじめまして.畳返しです.

    シリアル通信のプログラムについて調べてみたらここにたどり着きました.

    研究の関係からC++を使ってプログラムを作るのですがシリアル通信のことがよくわらないため上手く組むことが出来ません.

    だから

    [引用]CreateFile して SetCommState でごにょごにょして、あとは WriteFile とか ReadFile とかして...って感じなので DllImport すれば [引用]

    の意味がわかりません.宜しければ教えて下さい.

    返信削除
  4. .NET 2.0 で正式に System.IO.Ports.SerialPort として 実装されたみたいです。

    返信削除