MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C Sharpの基礎 - シリアル通信のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C Sharpの基礎 - シリアル通信
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == シリアル通信は、データを1ビットずつ順番に送受信する通信方式である。<br> C#では、<code>System.IO.Ports</code>名前空間の<code>SerialPort</code>クラスを使用してシリアル通信を実装することができる。<br> <br> まず、SerialPortクラスのインスタンスを生成して、ポート名、ボーレート、データビット、ストップビット、パリティ等の通信パラメータを設定する。<br> これらのパラメータは、通信相手のデバイスと一致させる必要がある。<br> <br> 通信を開始するには、<code>SerialPort.Open</code>メソッドを実行する。<br> <br> データを送信する場合は、<code>Write</code>メソッドや<code>WriteLine</code>メソッドを実行する。<br> <br> データを受信する場合は、同期的な方法と非同期的な方法がある。<br> * 同期的な方法 *: <code>ReadLine</code>メソッドや<code>Read</code>メソッドを使用してデータを受信する。 *: これらのメソッドは、データが到着するまでプログラムの実行をブロックすることに注意する。 *: <br> * 非同期的な方法 *: <code>DataReceived</code>イベントを使用する。 *: このイベントは、データが受信された時に発生し、イベントハンドラ内でデータを処理する。 *: これにより、UIの応答性を維持しながらデータを受信することができる。 <br> 通信が完了した後は、必ず<code>Close</code>メソッドを実行してポートを閉じる。<br> <br> エラーハンドリングでは、タイムアウトの設定、例外処理、リソースの適切な解放等を考慮する必要がある。<br> <br> シリアル通信は、組み込みシステム、産業用機器、DAQ等の様々な分野で利用されている。<br> C#の豊富なライブラリとイベント駆動型のプログラミングモデルにより、効率的なシリアル通信アプリケーションの開発が可能である。<br> <br> 実務では、デバッグツールやシリアルモニターを活用して、通信の動作を確認することも重要である。<br> <br><br> == 同期通信 == ==== 送信 ==== 以下に示すパラメータは、通信相手のデバイスの設定と一致している必要がある。<br> 使用時では、接続するデバイスの仕様に合わせてこれらの値を適切に調整すること。<br> <br> * パリティ *: データの整合性チェックのために使用する。 *: 以下の例では、<code>Parity.None</code>に設定している。 *: 必要に応じて、<code>Parity.Even</code>、<code>Parity.Odd</code>、<code>Parity.Mark</code>、<code>Parity.Space</code>を指定する。 * データビット *: 各バイトのビット数を指定する。 *: 一般的に8ビットが使用されるが、7ビットや5ビット等も可能である。 * ストップビット *: 各バイトの終わりを示すビットを指定する。 *: 必要に応じて、<code>StopBits.One</code>、<code>StopBits.OnePointFive</code>、<code>StopBits.Two</code>を指定する。 * ハンドシェイク *: フロー制御の方法を指定する。 *: ハードウェアフロー制御 (RTS / CTS) *: ソフトウェアフロー制御 (XON / XOFF) *: <br> *: 以下の例では、<code>Handshake.None</code>に設定している。 *: 必要に応じて、<code>Handshake.RequestToSend</code>、<code>Handshake.XOnXOff</code>等を指定する。 * タイムアウト *: 読み取りと書き込みのタイムアウトを設定している。 *: これにより、操作が無限に待機することを防ぐことができる。 <br> <syntaxhighlight lang="c#"> using System; using System.IO.Ports; class Sender { static void Main(string[] args) { string portName = "/dev/ttyS0"; // ポート名を適切に設定 int baudRate = 9600; // ボーレート 9600[bps] Parity parity = Parity.None; // パリティ無し int dataBits = 8; // データ長は8ビット StopBits stopBits = StopBits.One; // ストップビットは1ビット try { using (SerialPort serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits)) { serialPort.Handshake = Handshake.None; // フロー制御の設定 serialPort.ReadTimeout = 500; // 読み取りタイムアウトの設定 (ミリ秒) serialPort.WriteTimeout = 500; // 書き込みタイムアウトの設定 (ミリ秒) serialPort.Open(); Console.WriteLine("シリアルポートをオープン") Console.WriteLine("終了するには 'exit' と入力"); while (true) { Console.Write("送信するメッセージを入力: "); string message = Console.ReadLine(); if (message.ToLower() == "exit") break; serialPort.WriteLine(message); Console.WriteLine("メッセージが送信された"); } serialPort.Close(); } } catch (TimeoutException) { Console.WriteLine("送信操作がタイムアウト"); } catch (Exception ex) { Console.WriteLine($"エラーが発生: {ex.Message}"); } } } </syntaxhighlight> <br> ==== 受信 ==== <syntaxhighlight lang="c#"> using System; using System.IO.Ports; class Receiver { static void Main(string[] args) { string portName = "/dev/ttyS0"; // ポート名を適切に設定 int baudRate = 9600; // ボーレート 9600[bps] Parity parity = Parity.None; // パリティ無し int dataBits = 8; // データ長は8ビット StopBits stopBits = StopBits.One; // ストップビットは1ビット try { using (SerialPort serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits)) { serialPort.Handshake = Handshake.None; // フロー制御の設定 serialPort.ReadTimeout = 500; // 読み取りタイムアウトの設定 (ミリ秒) serialPort.WriteTimeout = 500; // 書き込みタイムアウトの設定 (ミリ秒) serialPort.Open(); Console.WriteLine("シリアルポートをオープン") Console.WriteLine("終了するには [Ctrl] + [C]キーを押下"); serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); // プログラムを実行し続けるためのループ while (true) { System.Threading.Thread.Sleep(100); } } } catch (TimeoutException) { Console.WriteLine("受信操作がタイムアウト"); } catch (Exception ex) { Console.WriteLine($"エラーが発生: {ex.Message}"); } } private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; try { string indata = sp.ReadExisting(); Console.WriteLine("受信したデータ: " + indata); } catch (TimeoutException) { Console.WriteLine("データの読み取り中にタイムアウトが発生"); } } } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:C_Sharp]]
C Sharpの基礎 - シリアル通信
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse