2017-08-04 11 views
0

私はarduinoのシリアルポートに接続され、デバイスが送信するデータを受信するプログラムを書いていますが、このセクションのVisual StudioでSerialPort Cでデータを読む#

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.IO.Ports; 
using System.Windows.Forms; 
using System.Windows.Forms.DataVisualization.Charting; 
using port.dbDataSetTableAdapters; 

namespace Factory_Performance 
{ 
    public partial class FrmMain : Form 
    { 
     string s; 
     Series series = new Series(); 
     SerialPort ComPort = new SerialPort(); 

     internal delegate void SerialDataReceivedEventHandlerDelegate(object sender, SerialDataReceivedEventArgs e); 
     internal delegate void SerialPinChangedEventHandlerDelegate(object sender, SerialPinChangedEventArgs e); 
     private SerialPinChangedEventHandler SerialPinChangedEventHandler1; 
     delegate void SetTextCallback(int ReadByte); 
     int InputData = 0; 


     private int CountData; 
     private string StrData; 
     double[] Values; 
     public FrmMain() 
     { 
      InitializeComponent(); 
      SerialPinChangedEventHandler1 = new SerialPinChangedEventHandler(PinChanged); 
      ComPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(port_DataReceived_1); 
     } 

     private double calculate_input(int s2, int s3) 
     { 
      return double.Parse(s2.ToString() + "/" + s3.ToString()); 
     } 

     private void GetAllIDInDB() 
     { 
      tblIDTableAdapter.Fill(dbDataSet.TblID); 
      CmbID.Items.Clear(); 

      for (int i = 0; i < dbDataSet.TblID.Rows.Count; i++) 
       CmbID.Items.Add(dbDataSet.TblID.Rows[i]["ID"].ToString()); 
     } 
     private void GetAllID_DetailsInDB(int ID) 
     { 
      tblID_DetailsTableAdapter.FillByID(dbDataSet.TblID_Details, ID); 
      LstItems.Items.Clear(); 
      for (int i = 0; i < dbDataSet.TblID_Details.Rows.Count; i++) 
       LstItems.Items.Add(dbDataSet.TblID_Details.Rows[i]["Value"].ToString()); 

     } 

     private void GetInfoPorts() 
     { 
      try 
      { 
       string[] ArrayComPortsNames = null; 
       int index = -1; 
       string ComPortName = null; 
       cboPorts.Items.Clear(); 
       cboBaudRate.Items.Clear(); 
       cboStopBits.Items.Clear(); 
       cboParity.Items.Clear(); 
       cboHandShaking.Items.Clear(); 
       //Com Ports 
       ArrayComPortsNames = SerialPort.GetPortNames(); 
       do 
       { 
        index += 1; 
        cboPorts.Items.Add(ArrayComPortsNames[index]); 


       } while (!((ArrayComPortsNames[index] == ComPortName) || (index == ArrayComPortsNames.GetUpperBound(0)))); 
       Array.Sort(ArrayComPortsNames); 

       if (index == ArrayComPortsNames.GetUpperBound(0)) 
       { 
        ComPortName = ArrayComPortsNames[0]; 
       } 
       //get first item print in text 
       cboPorts.Text = ArrayComPortsNames[0]; 
       //Baud Rate 
       cboBaudRate.Items.Add(115200); 
       cboBaudRate.Items.Add(300); 
       cboBaudRate.Items.Add(600); 
       cboBaudRate.Items.Add(1200); 
       cboBaudRate.Items.Add(2400); 
       cboBaudRate.Items.Add(9600); 
       cboBaudRate.Items.Add(14400); 
       cboBaudRate.Items.Add(19200); 
       cboBaudRate.Items.Add(38400); 
       cboBaudRate.Items.Add(57600); 
       cboBaudRate.Items.ToString(); 
       //get first item print in text 
       cboBaudRate.Text = cboBaudRate.Items[0].ToString(); 
       //Data Bits 
       cboDataBits.Items.Add(8); 
       cboDataBits.Items.Add(7); 
       //get the first item print it in the text 
       cboDataBits.Text = cboDataBits.Items[0].ToString(); 

       //Stop Bits 
       cboStopBits.Items.Add("One"); 
       cboStopBits.Items.Add("OnePointFive"); 
       cboStopBits.Items.Add("Two"); 
       //get the first item print in the text 
       cboStopBits.Text = cboStopBits.Items[0].ToString(); 
       //Parity 
       cboParity.Items.Add("None"); 
       cboParity.Items.Add("Even"); 
       cboParity.Items.Add("Mark"); 
       cboParity.Items.Add("Odd"); 
       cboParity.Items.Add("Space"); 
       //get the first item print in the text 
       cboParity.Text = cboParity.Items[0].ToString(); 
       //Handshake 
       cboHandShaking.Items.Add("XOnXOff"); 
       cboHandShaking.Items.Add("None"); 
       cboHandShaking.Items.Add("RequestToSend"); 
       cboHandShaking.Items.Add("RequestToSendXOnXOff"); 
       //get the first item print it in the text 
       cboHandShaking.Text = cboHandShaking.Items[0].ToString(); 
      } 
      catch 
      { 
       MessageBox.Show("خطا در گرفتن اطلاعات پورت"); 
      } 
     } 

     private void port_DataReceived_1(object sender, SerialDataReceivedEventArgs e) 
     { 

      InputData = ComPort.ReadByte(); 
      if (InputData != 0) 
      { 
      s= Convert.ToString(Convert.ToChar(InputData)); 

       this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData }); 
      label12.Text =Convert.ToString(s); 
      } 
     } 
     private void SetText(int ReadByte) 
     { 
      this.LstGetInfo.Items.Add(ReadByte); 
     } 
     internal void PinChanged(object sender, SerialPinChangedEventArgs e) 
     { 

     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      Values = new double[CountData]; 
      for (int i = 0; i < CountData; i++) 
       Values[i] = (int)StrData[i]; 
      Array.Reverse(Values); 
      chart1.Titles.Clear(); 
      chart1.Titles.Add(TxtTitle.Text); 
      chart1.Series.Clear(); 
      series.Points.Clear(); 
      for (int i = 0; i < CountData; i++) 
       series.Points.AddXY(TxtTitleSeries.Text + " " + i.ToString(), Values[i]); 
      chart1.Series.Add(series); 

     } 

     private void groupBox1_Enter(object sender, EventArgs e) 
     { 

     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      Application.Exit(); 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 


     } 

     private void CmbPalette_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      chart1.Palette = (ChartColorPalette)CmbPalette.SelectedIndex; 
     } 

     private void CmbChartType_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      series.ChartType = (SeriesChartType)CmbChartType.SelectedIndex; 
     } 

     private void FrmMain_Load(object sender, EventArgs e) 
     { 
      // TODO: This line of code loads data into the 'dbDataSet.TblID_Details' table. You can move, or remove it, as needed. 
      this.tblID_DetailsTableAdapter.Fill(this.dbDataSet.TblID_Details); 
      // TODO: This line of code loads data into the 'dbDataSet.TblID' table. You can move, or remove it, as needed. 
      this.tblIDTableAdapter.Fill(this.dbDataSet.TblID); 
      GetInfoPorts(); 
      CmbPalette.SelectedIndex = 1; 
      CmbChartType.SelectedIndex = 4; 
      CountData = 0; 
     } 

     private void button3_Click_1(object sender, EventArgs e) 
     { 

     } 

     private void button4_Click(object sender, EventArgs e) 
     { 

     } 

     private void button3_Click_2(object sender, EventArgs e) 
     { 

     } 

     private void button4_Click_1(object sender, EventArgs e) 
     { 
      /* if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
      { 
       FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open, FileAccess.Read); 
       StreamReader sr = new StreamReader(fs); 
       TxtPath.Text = openFileDialog1.FileName; 
       string[] StrInfo = sr.ReadToEnd().Split(','); 
       int[] Values2 = new int[StrInfo.Length - 4]; 
       for (int i = 0; i < StrInfo.Length-4; i++) 
        Values2[i] = int.Parse(StrInfo[i+4]); 
       string StrTemp = ""; 


       foreach (int n in Values2) 
        StrTemp += (char)n; 
       CountData = StrTemp.Length; 
       StrData = StrTemp; 
       Values = new int[CountData]; 
       for (int i = 0; i < CountData; i++) 
        Values[i] = (int)StrData[i]; 
       //Array.Reverse(Values); 
       chart2.Palette = (ChartColorPalette)int.Parse(StrInfo[2]); 
       series.ChartType = (SeriesChartType)int.Parse(StrInfo[3]); 
       chart2.Titles.Clear(); 
       chart2.Titles.Add(StrInfo[0]); 
       chart2.Series.Clear(); 
       series.Points.Clear(); 
       for (int i = 0; i < CountData; i++) 
        series.Points.AddXY(StrInfo[1] + " " + i.ToString(), Values[i]); 
       chart2.Series.Add(series); 

       StrTemp = ""; 
       Array.Reverse(Values2); 
       foreach (int n in Values2) 
        StrTemp += (char)n; 
       TxtDateRecovery.Text = DecryptStringAES(StrTemp, TxtKeyDecrypt.Text); 
      }*/ 
     } 

     private void btnGetSerialPorts_Click(object sender, EventArgs e) 
     { 
      GetInfoPorts(); 
     } 

     private void btnPortState_Click(object sender, EventArgs e) 
     { 
      try 
      { 
       if (btnPortState.Text == "ارتباط با دستگاه") 
       { 
        btnPortState.Text = "قطع ارتباط با دستگاه"; 
        ComPort.PortName = Convert.ToString(cboPorts.Text); 
        ComPort.BaudRate = Convert.ToInt32(cboBaudRate.Text); 
        ComPort.DataBits = Convert.ToInt16(cboDataBits.Text); 
        ComPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), cboStopBits.Text); 
        ComPort.Handshake = (Handshake)Enum.Parse(typeof(Handshake), cboHandShaking.Text); 
        ComPort.Parity = (Parity)Enum.Parse(typeof(Parity), cboParity.Text); 
        ComPort.Open(); 
        ComPort.Write("A");// کاراکتر شروع انجام عملیات ارسال داده 
        LstGetInfo.Items.Clear(); 
       } 
       else if (btnPortState.Text == "قطع ارتباط با دستگاه") 
       { 
        btnPortState.Text = "ارتباط با دستگاه"; 
        ComPort.Close(); 
       } 
      } 
      catch 
      { 
       btnPortState.Text = "ارتباط با دستگاه"; 
       ComPort.Close(); 
       MessageBox.Show("خطا در انجام عملیات"); 
      } 
     } 

     private void button1_Click_1(object sender, EventArgs e) 
     { 
      if(LstGetInfo.Items.Count <= 0) return; 
      int ItemCount = int.Parse(LstGetInfo.Items[0].ToString()); 
      int ItemIDCount = 0; 
      int ItemID = 0; 
      int ItemValue1 = 0, ItemValue2 = 0; 
      TblIDTableAdapter tblid = new TblIDTableAdapter(); 
      TblID_DetailsTableAdapter tblid_details = new TblID_DetailsTableAdapter(); 
      tblid.DeleteAllID(); 
      LstGetInfo.Items.RemoveAt(0); 
      for (int i = 0; i < ItemCount; i++) 
      { 
       ItemID = int.Parse(LstGetInfo.Items[0].ToString()); 
       LstGetInfo.Items.RemoveAt(0); 
       tblid.Insert(ItemID); 
       if (LstGetInfo.Items.Count > 0) 
       { 
        ItemIDCount = int.Parse(LstGetInfo.Items[0].ToString()); 
        LstGetInfo.Items.RemoveAt(0); 
        for (int j = 0; j < ItemIDCount; j += 2) 
        { 
         ItemValue1 = int.Parse(LstGetInfo.Items[0].ToString()); 
         LstGetInfo.Items.RemoveAt(0); 
         ItemValue2 = int.Parse(LstGetInfo.Items[0].ToString()); 
         LstGetInfo.Items.RemoveAt(0); 
         tblid_details.Insert(ItemID, calculate_input(ItemValue1, ItemValue2)); 
        } 
       } 
      } 
      GetAllIDInDB(); 
     } 

     private void CmbID_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      GetAllID_DetailsInDB(int.Parse(CmbID.Text)); 
      if (LstItems.Items.Count > 0) 
       ShowChart(); 
     } 

     private void CmbPalette_SelectedIndexChanged_1(object sender, EventArgs e) 
     { 
      chart1.Palette = (ChartColorPalette)CmbPalette.SelectedIndex; 
     } 

     private void CmbChartType_SelectedIndexChanged_1(object sender, EventArgs e) 
     { 
      series.ChartType = (SeriesChartType)CmbChartType.SelectedIndex; 
     } 
     private void ShowChart() 
     { 
      CountData = LstItems.Items.Count; 
      Values = new double[CountData]; 
      for (int i = 0; i < CountData; i++) 
       Values[i] = double.Parse(LstItems.Items[i].ToString()); 
      chart1.Titles.Clear(); 
      chart1.Titles.Add(TxtTitle.Text); 
      chart1.Series.Clear(); 
      series.Points.Clear(); 
      int Step = 0; 
      for (int i = 0; i < CountData; i++, Step +=10) 
       series.Points.AddXY(TxtTitleSeries.Text + " " + Step.ToString(), Values[i]); 
      chart1.Series.Add(series); 
     } 

     private void button3_Click_3(object sender, EventArgs e) 
     { 
      GetAllIDInDB(); 
     } 
    } 
} 

は、この問題を持っているか、いない、私はそれが

if (InputData != 0) 
    { 
    s= Convert.ToString(Convert.ToChar(InputData)); 

     this.BeginInvoke(new SetTextCallback(SetText), new object[] { InputData }); 
    label12.Text =Convert.ToString(s); 
    } 
} 

すべてのボディのために何が起こったのか理解できないエラーを取得しますか?

エラー:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll 
Additional information: Cross-thread operation not valid: Control 'label12' accessed from a thread other than the thread it was created on 
+0

「System.InvalidOperationException」種類のエラースタックトレースしてください – Sergii

+1

未処理の例外がのSystem.Windows.Forms.dll で発生しました追加情報を追加作成されたスレッド以外のスレッドからアクセスされる「label12」 –

答えて

1

存在のほとんどのグラフィカルユーザーインターフェイス(GUI)フレームワークはシングルスレッドです。つまり、イベントは独自のスレッドでのみ配信され、スレッド内からのみ呼び出すことができます。これは、あなたが使用していると思われるWinFormsについても当てはまります。

GUIスレッドではないスレッドからGUI(コントロール "label12"にアクセスしようとした)を呼び出そうとしたという例外が表示されます。あなたはの一つである使用Control.Invoke別のスレッドからのコントロールにアクセスしようとする、または

  • ないように、どちらか

    • 再構築あなたのコード、あなたの問題を解決するので

      、他のスレッドからコントロールを安全に呼び出すためのメソッドはほとんどありません。ここでの詳細情報:有効ではありませんクロススレッド操作:コントロール "MSDN - Control.Invoke

  • +0

    あなたの答えに感謝しますが、現時点では私はそれを解決するために何もしない別の問題があります。私はデバイスを接続し、情報を覚えていますが、私のプログラムは、3つの数字を送信し、それが情報の終わりである番組にショーを送信するようないくつかの間違った情報を取得し、次の行に行く必要があります4になって間違ったデータにしましたか? –