1.從工具攔拖動一個SerialPort控件,在窗體下面會多出一個serialPort1的圖標html
2.在serialPort1屬性的事件(黃色閃電圖標)裏有個DataReceived事件數組
3.雙擊DataReceived事件,寫收到的數據的處理代碼,端口打開後若是有數據來,就觸發DataReceived事體 須要注意的是串用自已的這個事件自已開了一個線程,若是要修改原來窗體的控件屬性要用到委託緩存
//窗體初始化 private void SerialportSampleForm_Load(object sender, EventArgs e) { //初始化下拉串口名稱列表框 string[] ports = SerialPort.GetPortNames(); Array.Sort(ports); comboPortName.Items.AddRange(ports); comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1; comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf("9600"); //初始化SerialPort對象 comm.NewLine = "/r/n"; comm.RtsEnable = true;//根據實際狀況吧。 //添加事件註冊 comm.DataReceived += comm_DataReceived; } void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { if (isClosing) return;//若是正在關閉,忽略操做,直接返回,儘快的完成串口監聽線程的一次循環 try { Listening = true;//設置標記,說明我已經開始處理數據,一下子要使用系統UI的。 int n = comm.BytesToRead;//先記錄下來,避免某種緣由,人爲的緣由,操做幾回之間時間長,緩存不一致 byte[] buf = new byte[n];//聲明一個臨時數組存儲當前來的串口數據 received_count += n;//增長接收計數 comm.Read(buf, 0, n);//讀取緩衝數據 builder.Clear();//清除字符串構造器的內容 //由於要訪問ui資源,因此須要使用invoke方式同步ui。 this.Invoke((EventHandler)(delegate { //判斷是不是顯示爲16禁止 if (checkBoxHexView.Checked) { //依次的拼接出16進制字符串 foreach (byte b in buf) { builder.Append(b.ToString("X2") + " "); } } else { //直接按ASCII規則轉換成字符串 builder.Append(Encoding.ASCII.GetString(buf)); } //追加的形式添加到文本框末端,並滾動到最後。 this.txGet.AppendText(builder.ToString()); //修改接收計數 labelGetCount.Text = "Get:" + received_count.ToString(); })); } finally { Listening = false;//我用完了,ui能夠關閉串口了。 } }