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