C#串列埠通訊程式SerialPort類
阿新 • • 發佈:2019-01-23
上篇文章主要是關於串列埠通訊中微控制器部分的程式編寫。在實際應用中,常常還要有上位機的配合才能完成工作。寫串列埠通訊的上位機程式,常常應用的程式語言有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開發環境下的完整程式碼下載地址,猛擊此處