13,032
回編集
 (→受信)  | 
				|||
| 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}%";  | |||
     }  |      }  | ||
  }  |   }  | ||