「C Sharpの基礎 - シリアル通信」の版間の差分

ナビゲーションに移動 検索に移動
345行目: 345行目:
           }
           }
       }
       }
    }
}
</syntaxhighlight>
<br><br>
== タイマベースの送信 ==
定期的にデータを送信する必要がある場合、タイマイベントを使用してデータを送信する。<br>
<br>
定期的なデータ送信が必要なアプリケーション、例えば、環境モニタリングシステムやIoTデバイス等に適している。<br>
タイマベースの送信により、DAQ等の一定間隔でのデータ収集と送信を自動化することができる。<br>
<br>
<syntaxhighlight lang="c#">
using System;
using System.IO.Ports;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
class TimerBasedAsyncSender
{
    private static SerialPort _serialPort;
    private static System.Timers.Timer _timer;
    private static Random _random = new Random();
    static async Task 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
      {
          _serialPort = new SerialPort(portName, baudRate, parity, dataBits, stopBits)
          {
            Handshake    = Handshake.None,  // フロー制御の設定
            ReadTimeout  = 500,            // 読み取りタイムアウトの設定 (ミリ秒)
            WriteTimeout = 500              // 書き込みタイムアウトの設定 (ミリ秒)
          };
          _serialPort.Open();
          Console.WriteLine("シリアルポートをオープン");
          Console.WriteLine("10秒ごとにセンサーデータを送信");
          Console.WriteLine("終了するには 'exit' を押下");
          _timer = new System.Timers.Timer(10000);  // 10秒ごとに実行
          _timer.Elapsed += TimerElapsed;          // タイマイベントハンドラの設定
          _timer.Start();                          // タイマの開始
          while (true)
          {
            string input = Console.ReadLine();
            if (input?.ToLower() == "exit") break;
          }
      }
      catch (Exception ex)
      {
          Console.WriteLine($"エラーが発生: {ex.Message}");
      }
      finally
      {
          _timer?.Stop();
          _timer?.Dispose();
          _serialPort?.Close();
          Console.WriteLine("プログラムの終了");
      }
    }
    private static async void TimerElapsed(object sender, ElapsedEventArgs e)
    {
      try
      {
          string sensorData = GenerateSensorData();
          byte[] buffer = System.Text.Encoding.UTF8.GetBytes(sensorData + Environment.NewLine);
          await _serialPort.BaseStream.WriteAsync(buffer, 0, buffer.Length);
          Console.WriteLine($"送信したデータ: {sensorData}");
      }
      catch (Exception ex)
      {
          Console.WriteLine($"データ送信中にエラーが発生: {ex.Message}");
      }
    }
    private static string GenerateSensorData()
    {
      // センサデータのシミュレーション
      double temperature = Math.Round(_random.NextDouble() * 30 + 10, 2);  // 10℃から40℃
      double humidity = Math.Round(_random.NextDouble() * 60 + 20, 2);    // 20%から80%
      return $"温度: {temperature}℃, 湿度: {humidity}%";
     }
     }
  }
  }

案内メニュー