簡介:微軟的VS提供了SerialPort控件,也就是串行端口資源。
當然也可以添加引用 using System.IO.Ports; 通過實例化SerialPort對象就可以使用其屬性和方法了。 SerialPort serialPort1 = new SerialPort();
最重要的幾個屬性: serialPort1.Open();打開串行端口連接 serialPort1.Close();關閉串行端口連接 serialPort1.PortName 獲取或設置通信端口(COM)
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;
}
}