1. 程式人生 > >C#上位機制作之串列埠接受資料(利用接受事件)

C#上位機制作之串列埠接受資料(利用接受事件)

前面設計好了介面,現在就開始寫程式碼了,首先定義一個串列埠物件..

SerialPort serialport = new SerialPort();//定義串列埠物件

新增串列埠掃描函式,掃描出來所有可用串列埠顯示在下拉框中,同時設定接受函式

複製程式碼
string[] ArryPort = SerialPort.GetPortNames();
            comboBox1.Items.Clear();
            for (int i = 0; i < ArryPort.Length; i++)
            {
                comboBox1.Items.Add(ArryPort[i]);
            }
            comboBox1.SelectedIndex 
= 0; serialport.DataReceived += serialport_DataReceived;
複製程式碼

PS:,因為串列埠的接受事件中開闢了新的執行緒,所以我們訪問ui資源時需要做特殊的處理,如果是winform中需要設定

Control.CheckForIllegalCrossThreadCalls = false;//防止挎執行緒訪問

但是在wpf中沒有這個屬性就需要用委託來處理程式碼如下

複製程式碼
void serialport_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            
byte[] buffer = new byte[2]; int adc_dat = 0; serialport.Read(buffer, 0, buffer.Length); adc_dat += buffer[i + 1]; adc_dat = (adc_dat << 8) + buffer[i + 2];; this.Dispatcher.Invoke(new Action(() => { progressBar1.Value
= adc_dat; })); }
複製程式碼

上面的程式碼中我們從讀取到的資料處理 完成,之後修改進度條的值,這個裡面就是一段簡單的接受資料,處理,要想資料無措,還要加入相應的校驗函式和自己的演算法處理,

我們在接受之前還需要設定串列埠號,波特率等等,看下面的程式碼

複製程式碼
private void set_PortName()//將下拉框中的內容設定串列埠
        {
            serialport.PortName = comboBox1.SelectedItem.ToString();
        }
        private void set_BaudRate()//設定波特率
        {
            serialport.BaudRate = 115200;
        }
        private void Open_serial()//啟動串列埠開始接收
        {
            set_PortName();//選擇串列埠號
            set_BaudRate();//選擇波特率
            try
            {
                serialport.Open();//開啟當前串列埠
            }
            catch (Exception)
            {
                MessageBox.Show("串列埠被佔用", "error");

            }
        }
複製程式碼