C# 串口控件使用


P26枚舉 P75枚舉運算 P129事件 P194窗體與控件類 P322 try-catch語句

 


簡介:微軟的VS提供了SerialPort控件,也就是串行端口資源。

當然也可以添加引用 using System.IO.Ports; 通過實例化SerialPort對象就可以使用其屬性和方法了。 SerialPort serialPort1 = new SerialPort();

最重要的幾個屬性: serialPort1.Open();打開串行端口連接 serialPort1.Close();關閉串行端口連接 serialPort1.PortName 獲取或設置通信端口(COM) serialPort1.BaudRate 獲取或設置串行波特率

serialPort1.DataBits 獲取或設置每個字節的標准數據位長度 serialPort1.StopBits 獲取或設置每個字節的標准停止位數 serialPort1.Parity 獲取或設置奇偶校驗檢查協議 serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 數據接收事件的方法

.close() 關閉端口連接,將isOpen屬性設置為false,並釋放stream對象 .open() 打開一個新的串行端口連接

.read() 從serialport輸入緩存區中讀取 .readbyte() 從serialport輸入緩存區中讀取一個字節 .readchar() 從serialport輸入緩存區中讀取一個字符 .readline() 一直讀到輸入緩存區中的newline值 .readto() 一直讀到輸入緩存區指定value的字符串

.write() 已重載,將數據寫入串行端口輸出緩沖區 .writeline() 將指定的字符串和newline值寫入輸出緩存區


 

關於串口接收事件

serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); 串口接收事件會自動創建線程(也就是說它已經不在主線程了)!!!

對於C#來說,默認是不能在其它線程中對非本線程創建的控件進行訪問的(一般情況下控件都是主線程中的),

如果你的這個事件代碼中不操作控件(比如文本框之類的),那可以不用invoke, 否則就要用委托了,不然在運行中就會報錯,具體內容可以再百度一下 C# 跨線程 控件

private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{   //這個是多線程,在執行主線程的同時,另開一個線程區執行DisplayText函數。
   data= serialPort1.ReadExisting();
   this.Invoke(new EventHandler(DisplayText));
}

 

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
   string Recievestr;

   Recievestr = serialPort1.ReadExisting();
   textBox1.AppendText(Recievestr);
   //this.Invoke(new EventHandler(DisplayText));  
   ///括號內為繪制窗口的方法的委托,采用的是標准事件的委托
}
private void DisplayText(object sender, EventArgs e)
{
}

 


 

byte[] data = Encoding.Default.GetBytes(str1);
serialPort1.Write(data, 0, data.Length);

String str1 = comboBox1.Text;
String str2 = comboBox2.Text;
String str3 = comboBox4.Text;
String str4 = comboBox5.Text;
Int32 int2 = Convert.ToInt32(str2);
Int32 int3 = Convert.ToInt32(str3);

serialPort1.PortName = str1;
serialPort1.BaudRate = int2;
serialPort1.DataBits = int3;
switch (comboBox5.Text)
{
   case "1":
   serialPort1.StopBits = StopBits.One;
   break;
   case "1.5":
   serialPort1.StopBits = StopBits.OnePointFive;
   break;
   case "2":
   serialPort1.StopBits = StopBits.Two;
   break;
   default:
   MessageBox.Show("Error:參數不正確", "Error");
   break;
}


//判斷文本框中是否為空,不為空則將其添加到組合框中
if (textBox1.Text != "")
{
   //判斷文本框中的值是否與組合框中的的值重復
   if ( comboBox1.Items.Contains(textBox1.Text) )
    {
    MessageBox.Show("該專業已存在!");
  }
    else
    {
    comboBox1.Items.Add(textBox1.Text);
  }
}
else
{      
 MessageBox.Show("請輸入專業!", "提示");
}
//判斷組合框中是否存在文本框中輸入的值
if (comboBox1.Items.Contains(textBox1.Text))
{
    comboBox1.Items.Remove(textBox1.Text);
}

 

//16進制顯示接收結果
string str;
for (int i = 0; i < 256; i++)
{
     str = i.ToString("x").ToUpper();
     if (str.Length == 1)
    {
            str = "0" + str;
            textBox1.Text = "0x" + str;
      }
     textBox1.Text = "0xff";
}

 

private void SetPortProperty () // 設置串口名
{
   sp = new SerialPort();
   sp.PortName = cbxComPort.Text.Trim();                //設置串口名
   sp.BaudRate = Convert.ToInt32(cbxBaudRate.Text.Trim());  //設置串口波特率
   float f = Convert.ToSingle(cbxStopBits.Text.Trim());     //設置停止位
   if(f==0)
  {
       sp.StopBits = StopBits.None;
  }
   else if(f==1)
  {
       sp.StopBits = StopBits.One;
  }
   else if(f==1.5)
  {
       sp.StopBits = StopBits.OnePointFive;
  }
   else if (f == 2)
  {
       sp.StopBits = StopBits.Two;
  }
   else
  {
       sp.StopBits = StopBits.One;
  }
   sp.DataBits = Convert.ToInt16(cbxDataBits.Text.Trim()); //設置數據位  
   string s = cbxParity.Text.Trim();                //設置奇偶校驗
   if (s.CompareTo("無") == 0)
  {
       sp.Parity = Parity.None;
  }
   else if (s.CompareTo("奇校驗") == 0)
  {
       sp.Parity = Parity.Odd;
  }
   else if (s.CompareTo("偶校驗") == 0)
  {
       sp.Parity = Parity.Even;
  }
   else
  {
       sp.Parity = Parity.None;
  }
   sp.ReadTimeout = -1;     // 設置超時讀取時間
   sp.RtsEnable = true;

   // 定義Data Received 事件 , 當串口收到數據后觸發事件
   sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
   if (rbnHex.Checked)
  {
       isHex = true;
  }
   else
  {
       isHex = false;
  }      
}

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM