C#串列埠通訊程式SerialPort類
上篇文章主要是關於串列埠通訊中微控制器部分的程式編寫。在實際應用中,常常還要有上位機的配合才能完成工作。寫串列埠通訊的上位機程式,常常應用的程式語言有C++,VB,C#等。VB沒有學過,C++編寫視窗應用程式接觸也不多,暑假自己看了一些C#的書,也有了一些瞭解,所以就用C#寫視窗應用程式,用來作上位PC機的串列埠通訊程式。在寫的過程中,主要參見了這篇部落格http://blog.csdn.net/wuyazhe/article/details/5598945,感謝這位博主。
C#中的串列埠通訊程式設計主要用到了SerialPort類,它位於名稱空間System.IO.Ports下,所以在程式開始要包含這個名稱空間。
先上執行時的視窗介面,很簡陋,也只實現了收發的基本的功能,但是可以在這個上面擴充。
由於註釋寫的比較詳細,所以下面的程式一般只貼出了程式碼。
成員變數有兩個,一個是C#提供的SerialPort類,是物理上的串列埠在程式中的對映。
另一個為可變字串型別StringBuilder,用於字串的處理。
//串列埠類
private SerialPort comm = new SerialPort();
//可變字串類,用於儲存接收到的字元
private StringBuilder Builder = new StringBuilder();
Form視窗的Load事件響應方法
//註冊視窗初始化事件
private void Form1_Load_1(object sender, EventArgs e)
{
#region 初始化下拉串列埠名稱列表框
//獲取微控制器與計算機連線的埠號
string[] ports = SerialPort.GetPortNames();
Array.Sort(ports);
//將其顯示到comboPorName控制元件中去
comboPortName.Items.AddRange(ports);
comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1;
//波特率預設為9600bps,可以通過下拉選項進行調節
comboPortBaudrate.SelectedIndex = comboPortBaudrate.Items.IndexOf("9600");
#endregion
//下面這句還不太懂,先照著做
comm.NewLine = "\r\n";
//與設定RTS訊號有關,雖不明,但覺厲,照著做
comm.RtsEnable = true;
//註冊對串列埠接收資料的響應方法
comm.DataReceived += new SerialDataReceivedEventHandler(comm_DataReceived);
}
接收資料的響應方法
void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//獲取接收緩衝區中資料的位元組數
int n = comm.BytesToRead;
byte[] buf = new byte[n];
//將資料讀入buf陣列中
comm.Read(buf, 0, n);
//先清空
Builder.Clear();
//因為要訪問ui資源,所以需要使用invoke方式同步ui
this.Invoke((EventHandler)(delegate
{
//委託方法在txGet控制元件中顯示接收到的字元
Builder.Append(Encoding.ASCII.GetString(buf));
this.txGet.AppendText(Builder.ToString());
}));
}
“開啟串列埠”按鈕的滑鼠點選相應方法:
//開啟按鈕的事件響應
private void BtnOpen_Click(object sender, EventArgs e)
{
//如果串列埠已經是開啟狀態,則此按鈕關閉串列埠
if (this.serialPort.IsOpen)
{
this.serialPort.Close();
}
//串列埠關閉狀態,開啟之
else
{
//設定好埠名和波特率
comm.PortName = this.comboPortName.Text;
comm.BaudRate = int.Parse(this.comboPortBaudrate.Text);
try
{
comm.Open();
}
//開啟失敗,丟擲異常
catch(Exception ex)
{
comm = new SerialPort();
MessageBox.Show(ex.Message);
}
}
//按鈕顯示文字轉變
this.BtnOpen.Text = comm.IsOpen ? "關閉串列埠" : "開啟串列埠";
//傳送按鈕功能使能
this.BtnSend.Enabled = comm.IsOpen;
}
點選“傳送”按鈕將資料送入IO的資料緩衝區中,程式碼如下:
//點選傳送按鈕事件的響應方法
private void BtnSend_Click(object sender, EventArgs e)
{
//呼叫封裝的wirte方法,將txSend中的文字傳送到IO的緩衝區,傳給微控制器
comm.Write(this.txSend.Text);
}
如此這樣,加上UI介面上控制元件的新增,就可以實現一個簡單的串列埠通訊程式了。
最後附上VS2010開發環境下的完整程式碼下載地址,猛擊此處
相關文章
- C# 串列埠通訊C#串列埠
- C#串列埠通訊遇到的坑C#串列埠
- 串列埠通訊串列埠
- 串列埠通訊 (轉)串列埠
- linux 串列埠通訊Linux串列埠
- 串列埠通訊協議串列埠協議
- Android 串列埠通訊Android串列埠
- 11. 串列埠通訊串列埠
- 串列埠通訊型別串列埠型別
- 串列埠通訊利器:SerialPortStream庫詳解,輕鬆實現C#串列埠開發串列埠C#
- 通過串列埠進行通訊 :串列埠
- 串列埠資料抓取及串列埠通訊模擬串列埠
- C# 中串列埠通訊 serialport1.DataReceived 函式無法觸發或者出發延時等等問題解決方法C#串列埠函式
- 安卓串列埠通訊疑問安卓串列埠
- java串列埠通訊例項 -Java串列埠
- VC++ 串列埠通訊(轉)C++串列埠
- 串列埠無法正常通訊串列埠
- VC++串列埠通訊程式設計詳解C++串列埠程式設計
- 用C#一步步寫串列埠通訊C#串列埠
- Linux下串列埠通訊詳解(下)讀寫串列埠及關閉串列埠Linux串列埠
- AndroidSerialPort:安卓串列埠通訊庫Android安卓串列埠
- 串列埠通訊gui介面顯示串列埠GUI
- ROS環境下串列埠通訊ROS串列埠
- Android藍芽串列埠通訊Android藍芽串列埠
- VC++ 的串列埠通訊 (轉)C++串列埠
- 串列埠通訊應用程式的解決方案 (轉)串列埠
- STM32串列埠通訊串列埠
- android ndk 虛擬串列埠通訊Android串列埠
- 用VB除錯串列埠通訊 (轉)除錯串列埠
- VC控制元件MSComm編寫串列埠通訊程式控制元件串列埠
- .NET Compact Framework下的串列埠通訊Framework串列埠
- Qt編寫串列埠通訊程式全程圖文講解(一)QT串列埠
- Qt編寫串列埠通訊程式全程圖文講解(二)QT串列埠
- 串列埠通訊與其他通訊方式相比有什麼優勢?串列埠
- Arduino下的STM32的串列埠通訊UI串列埠
- ros中使用serial包實現串列埠通訊ROS串列埠
- 在VB中利用API進行串列埠通訊API串列埠
- 序列通訊的基本原理及用MFC實現串列埠通訊程式設計 (轉)串列埠程式設計