C#中串口的DataReceived事件是怎麼打開的

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能夠關閉串口了。
    }
}

 

相關閱讀:SerialPort控件的詳細用法工具

相關文章
相關標籤/搜索