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