前提・実現したいこと
PCのUSBに接続してシリアル通信するプログラム(C#、Form)を実装しています。
特定の機器(1台)からの通信ではなく、多数の機器からのデータ受信を処理しなくてはいけません。
ただ、現状のソースコードではうまくデータ処理ができないような気がしているのですが、
どのように修正すればいいのかわからないのでお力を貸していただきたいです。
※現時点で、検証するにも機器が1台しかないので、複数台稼働時の検証ができないのですが、
その時に備えたいと考えております。
※※現時点で、1台のみの処理は問題なく動作しています。
追記:
下記のソースコードの☆☆部分に送信元へデータを返す処理があるのですが、
その部分が多数の機器の場合に違う機器へ返してしまう可能性を恐れています。
該当のソースコード
c#
1private void SerialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) 2{ 3 if (serialPort != null && serialPort.IsOpen) 4 { 5 try 6 { 7 // 受信データを読み込む 8 SerialPort sp = (SerialPort)sender; 9 string sChildData = sp.ReadExisting(); 10 // 改行を削除 11 sChildData = sChildData.Replace("\r\n", ""); 12 13 if (17 < sData.Length) { 14 sData = sData.Substring(sData.Length - 18, 18); 15 if (string.IsNullOrEmpty(sBefData) || sBefData != sData) 16 { 17 // サーバーへ受信データを流す 18 for (int i = 0; i < 4; i++) 19 { 20 // 渡すデータ部分(後ろ18桁)を取得 21 iSeq++; 22 var parameters = new Dictionary<string, string>() 23 { 24 { "data", sData }, 25 { "sqno", iSeq.ToString() }, 26 }; 27 var content = new FormUrlEncodedContent(parameters); 28 29 try { 30 sTargetName = sData.Substring(0, 4); 31 sReturnVal = GetResponseAPI(API_PATH + API_SEND_DATA, content); 32 // 画面へ受信データを出力 33 this.Invoke(new Action<string>(this.appendText), DateTime.Now + " " + sData + Environment.NewLine); 34 sBefData = sData; 35 break; 36 } catch { 37 this.Invoke(new Action<string>(this.appendText), DateTime.Now + " " + "失敗しました" + Environment.NewLine); 38 } 39 try { 40 // ☆☆送信元の機器へsReturnValのデータを送信する 41 } catch { 42 } 43 44 } 45 46 sData = string.Empty; 47 sReturnVal = string.Empty; 48 } 49 } 50 } 51 catch (Exception ex) 52 { 53 logger.Error(ex.Message); 54 } 55 } 56} 57 58private string GetResponseAPI(string sApiUrl, FormUrlEncodedContent sContent) 59{ 60 string sVal = string.Empty; 61 var task = Task.Run(() => { 62 return HttpPost(sApiUrl, sContent); 63 }); 64 string response = task.Result; 65 JArray data = (JArray)JsonConvert.DeserializeObject(response); 66 foreach (JObject obj in data) 67 { 68 JValue val = (JValue)obj["return_data"]; 69 sVal = (string)val.Value; 70 this.Invoke(new Action<string>(this.appendText), DateTime.Now + " ReturnData:" + sVal + Environment.NewLine); 71 } 72 73 return sVal; 74}
補足情報(FW/ツールのバージョンなど)
Windows 10
Visual Studio 2017
c#/Windows Form/.Net Framewrok 4.7.1
回答2件
あなたの回答
tips
プレビュー