// UDP受信時 private void onReceive(object sender, UdpEventArgs e) { byte[] data = e.data; // 先頭文字チェック if (data[0] != (byte)'#') { return; } // コマンド別処理 switch (data[1]) { // A/D値・サーボ指令値コマンド case (byte)'D': if (data[14] == (byte)'$') { for (int i = 0; i < 4; i++) { adval[i] = ((int)data[2 + 2 * i] << 8) | (int)data[3 + 2 * i]; servo[i] = (int)data[10 + i]; } this.BeginInvoke((Action)(() => { for (int i = 0; i < 4; i++) { tb_adval[i].Text = adval[i].ToString(); tb_servo[i].Text = servo[i].ToString(); } })); } break; // 生存確認コマンド case (byte)'A': if (data[2] == (byte)'$') { Console.WriteLine("Received A"); isConnected = true; this.BeginInvoke((Action)(() => { labelConnectState.Text = "接続済み"; })); } break; // 不明なコマンド default: break; } }
// 受信スレッドの関数 private void funcReceive() { while (!isClosing) { try { //データを受信する IPEndPoint remoteEP = null; byte[] rcvBytes = receiver.Receive(ref remoteEP); //イベント発行 UdpEventArgs args = new UdpEventArgs(); args.data = rcvBytes; onReceive(this, args); } catch { //Console.WriteLine("receiving timeout"); ; // タイムアウト 特に何もしない } } }