/// <summary> /// 非同期受信を開始して、結果を返却します。 /// </summary> public async Task <string> ReadAsync() { Program.Info("1"); await Semaphore.WaitAsync().ConfigureAwait(false); try { Program.Info("2"); await ConnectAsync(); using (var buffer = new MemoryStream()) { var bytes = new byte[2048]; var size = 0; var endstring = EndString.Left(EndString.Length - 1); Program.Info("3"); // 読取データがある間繰り返す。 while ((size = COM.Read(bytes, 0, bytes.Length)) != 0) { await buffer.WriteAsync(bytes, 0, size); if (buffer.Length < endstring.Length) { // 終端文字の数だけ読み取っていない場合は次ループへ continue; } // 終端文字の数だけシーク位置を戻す。 buffer.Seek(endstring.Length * -1, SeekOrigin.End); if (endstring.All(c => c == buffer.ReadByte())) { // 読み取った最後の文字がEndStringと同値なら終了 break; } else { // シーク位置を戻す。 buffer.Seek(0, SeekOrigin.End); } } Program.Info("4"); // メッセージ取得 var message = buffer.ToArray().ToString(Encoding).ToUpper(); // 終端文字を除外して返却 return(message.Left(message.Length - endstring.Length)); } } finally { Semaphore.Release(); } }
/** **************************************************************************************************** ** 公開メソッド ** ****************************************************************************************************/ /// <summary> /// 通信を確立します。 /// </summary> public async Task ConnectAsync() { Program.Info("1"); if (IsConnected) { // 既に通信している場合は中断 return; } else if (COM != null) { // ゴミ掃除 await DisConnectAsync(); } Program.Info("2"); // インスタンス生成 COM = new SerialPort(); COM.NewLine = EndString.Last().ToString(); COM.BaudRate = 9600; COM.DataBits = 8; COM.StopBits = StopBits.One; COM.ReadTimeout = Timeout; COM.PortName = "COM1"; COM.WriteTimeout = Timeout; // 通信開始 await Task.Run(() => COM.Open()); }
/** **************************************************************************************************** ** 公開メソッド ** ****************************************************************************************************/ /// <summary> /// 通信を確立します。 /// </summary> public bool Connect() { if (Status == ConnectionStatuses.Connect || COM != null) { // 既に通信している場合は再接続 return(true); } else if (COM != null) { // ゴミ掃除 DisConnect(); } // インスタンス生成 COM = new SerialPort(); COM.PortName = PortName; COM.NewLine = EndString.Last().ToString(); COM.BaudRate = BaudRate; COM.DataBits = DataBits; COM.StopBits = StopBits; COM.Parity = Parity; COM.ReadTimeout = Timeout; COM.WriteTimeout = Timeout; // 通信開始 COM.Open(); // 通信開始イベント //Connected(this, new EventArgs()); return(true); }
/// <summary> /// 非同期受信を開始して、結果を返却します。 /// </summary> public string ReadAsync() { try { if (Status != ConnectionStatuses.Connect) { return(string.Empty); } using (var buffer = new MemoryStream()) { var bytes = new byte[2048]; var size = 0; var endstring = EndString.Left(EndString.Length - 1); // 読取データがある間繰り返す。 while ((size = COM.Read(bytes, 0, bytes.Length)) != 0) { buffer.Write(bytes, 0, size); if (buffer.Length < endstring.Length) { // 終端文字の数だけ読み取っていない場合は次ループへ continue; } // 終端文字の数だけシーク位置を戻す。 buffer.Seek(endstring.Length * -1, SeekOrigin.End); if (buffer.ToArray().ToString(Encoding).Contains(EndString)) { // 読み取った最後の文字がEndStringと同値なら終了 break; } else { // シーク位置を戻す。 buffer.Seek(0, SeekOrigin.End); } } // メッセージ取得 var message = buffer.ToArray().ToString(Encoding).ToUpper(); Console.WriteLine("Read終了"); // 終端文字を除外して返却 return(message.Left(message.Length - endstring.Length)); } } catch (Exception ex) { Console.WriteLine(ex.ToString()); // 例外発生時は切断 DisConnect(); // 空文字を返却 return(string.Empty); } }