1.從工具攔拖動一個SerialPort控件,在窗體下面會多出一個serialPort1的圖標
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可以關閉串口了。 } }