串列埠通訊中,解決serialport.DataReceived接收到的資料不完整
阿新 • • 發佈:2018-12-02
private SerialPort serialport = new SerialPort(); private StringBuilder builder = new StringBuilder(); // private StringBuilder bs = new StringBuilder();//用於儲存一條完整資訊; Boolean ope = false; public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false; } private void Form1_Load(object sender, EventArgs e) { string[] names = SerialPort.GetPortNames(); if (names == null) { MessageBox.Show("沒有可用的串列埠", "提示"); } else { foreach (string str in names) { toolStripComboBox2_Potrs.Items.Add(str); } } toolStripComboBox1_Rate.Text = "9600"; toolStripComboBox1_Rate.Items.Add("4800"); toolStripComboBox1_Rate.Items.Add("9600"); //新增事件註冊 serialport.DataReceived += new SerialDataReceivedEventHandler(serialPort_DataRecived); } void serialPort_DataRecived(object sender, SerialDataReceivedEventArgs e) { Thread.Sleep(500); builder.Clear();//清除字串構造器的內容 string str = ""; int n = serialport.BytesToRead;//先記錄下來,避免丟失 label3.Text = n.ToString(); byte[] buf = new byte[n]; serialport.Read(buf, 0, n);//讀取緩衝區資料 this.Invoke((EventHandler)(delegate { if (checkBox1_Hex.Checked) { foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接以ASCII規則輸出 builder.Append(Encoding.ASCII.GetString(buf)); // bs.Append(Encoding.ASCII.GetString(buf)); } //追加文字 this.textBox1_ReciMes.AppendText(builder.ToString()); //create a new thread //; Thread t = new Thread(new ParameterizedThreadStart(Options)); Console.WriteLine(builder.ToString()); t.Start(builder.ToString()); })); }