上篇文章主要是關於串口通訊中單片機部分的程式編寫。在實際應用中,常常還要有上位機的配合才能完成工作。寫串口通訊的上位機程式,常常應用的程式設計語言有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開發環境下的完整代碼,猛擊此處