C#獲取本機串列埠引數(適合初學者參考)
阿新 • • 發佈:2018-12-05
在C#中實現串列埠相比VC下容易很多,只要在工具欄中拖一個串列埠控制元件,設定好串列埠號即可開始工作。
如果是在後臺執行串列埠通訊,那麼簡單的設定已經足夠了。
當然,我們如果想讓這個串列埠有比較友好的介面設定那麼,我們在實現的時候,往往需要把介面上增加一些串列埠屬性引數的設定框。
一、串列埠號選擇框的實現(最簡單的辦法列舉有所串列埠號)
我在網上見到過很多利用登錄檔或者System.Management來獲取本機所有可用串列埠號的程式碼,給我的感覺都有捨近求遠的嫌疑。這裡我們用樸實的方法,一句話搞定:
string[] sps = SerialPort.GetPortNames();
comboBox1.Items.AddRange(sps);
這個方法必須保證引入System.IO.Ports;
我們平時不怎麼用串列埠的人可能對這個方法不太熟悉,這裡提供官方的連結,一看就懂;
SerialPort官方連結
二、波特率及停止位的選擇框的實現
我仔細的找了官方的文件,沒有發現可以直接枚舉出來的屬性和方法,那麼這裡只能自己建立列舉,這裡寫出來,大家拷貝後即可使用,程式碼如下:
/// <summary> /// 串列埠資料位列表(5,6,7,8) /// </summary> public enum SerialPortDatabits : int { FiveBits = 5, SixBits = 6, SeventBits = 7, EightBits = 8 } /// <summary> /// 串列埠波特率列表。 /// 75,110,150,300,600,1200,2400,4800,9600,14400,19200,28800,38400,56000,57600, /// 115200,128000,230400,256000 /// </summary> public enum SerialPortBaudRates : int { BaudRate_75 = 75, BaudRate_110 = 110, BaudRate_150 = 150, BaudRate_300 = 300, BaudRate_600 = 600, BaudRate_1200 = 1200, BaudRate_2400 = 2400, BaudRate_4800 = 4800, BaudRate_9600 = 9600, BaudRate_14400 = 14400, BaudRate_19200 = 19200, BaudRate_28800 = 28800, BaudRate_38400 = 38400, BaudRate_56000 = 56000, BaudRate_57600 = 57600, BaudRate_115200 = 115200, BaudRate_128000 = 128000, BaudRate_230400 = 230400, BaudRate_256000 = 256000 }
其餘的屬性,相對簡單也不常用,這裡不再贅述。
public Form1() { InitializeComponent(); //獲取串列埠號 string[] sps = SerialPort.GetPortNames(); comboBox1.Items.AddRange(sps); comboBox1.SelectedIndex=comboBox1.Items.Count-1; serialPort1.PortName = comboBox1.Text; //獲取波特率 SerialAttributeInfo.SetBauRateValues(comboBox2); //注意,在用indexof時要將數字轉為字串,否則找不到 comboBox2.SelectedIndex = comboBox2.Items.IndexOf(serialPort1.BaudRate.ToString()); } private void button1_Click(object sender, EventArgs e) { if (button1.Text.Contains("O") && !serialPort1.IsOpen) { serialPort1.Open(); textBox1.Text = serialPort1.ReadChar().ToString(); button1.Text = "關閉串列埠[&C]"; } else { serialPort1.Close(); button1.Text = "開啟串列埠[&O]"; } }
簡單設定好後,我們就可以進行串列埠通訊了
執行效果如下圖:
開啟串列埠後可以收到串列埠的資料
這裡的程式很簡單,如果要比較好的實現時事通訊,那麼最好用ReadBufferSize結合線程來控制讀寫。如果只需要簡單的通訊,也可以結合計時器來實現。這裡不再深入討論。