在窗體上新增三個「groupbox」控制項,分別將窗體分為「串列埠設定」、「資料接收」以及「資料傳送」三部分。
新增若干「label」和「combobox」分別用於串口號、波特率、停止位、奇偶校驗、資料位等的設定;
新增兩個「rodiobutton」用於字元顯示和hex顯示(hex=16進製制)的選擇;
新增若干「button」用於串列埠檢測、開啟串列埠、清空資料以及傳送資料等功能按鈕;
最後分別在資料接收欄和資料傳送欄中各新增乙個「textbox」控制項,用於資料的收發。
對各個布置好的控制項進行命名,方便程式設計。(按下圖紅色字型進行命名)
此外,還需更改以下屬性:更改「字元顯示」的rodiobutton控制項屬性中的checked為true,使在開啟程式後預設選擇「字元顯示」。
更改資料接收欄中的textbox控制項屬性中的readonly為true,使這個空間只能顯示接收到的資料,不能被編輯。
更改窗體form屬性中的acceptbutton為btnsend(傳送資料按鈕的名稱),使在窗體下按下回車鍵關聯「傳送資料」按鈕。
按照「夏夜星語」 的模板進行修改
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading.tasks;
using system.windows.forms;
using system.io.ports;
namespace 夏夜星語
/*private void label4_click(object sender, eventargs e)
*/private void form1_load(object sender, eventargs e)
cbxcomport.selectedindex = 0;
//列出常用的波特率
cbxbaudrate.items.add("1200");
cbxbaudrate.items.add("2400");
cbxbaudrate.items.add("4800");
cbxbaudrate.items.add("9600");
cbxbaudrate.items.add("19200");
cbxbaudrate.items.add("38400");
cbxbaudrate.items.add("43000");
cbxbaudrate.items.add("56000");
cbxbaudrate.items.add("57600");
cbxbaudrate.items.add("115200");
cbxbaudrate.selectedindex = 5;
//列出停止位
cbxstopbits.items.add("0");
cbxstopbits.items.add("1");
cbxstopbits.items.add("1.5");
cbxstopbits.items.add("2");
cbxstopbits.selectedindex = 1;
//列出資料位
cbxdatabits.items.add("8");
cbxdatabits.items.add("7");
cbxdatabits.items.add("6");
cbxdatabits.items.add("5");
cbxdatabits.selectedindex = 0;
//列出奇偶校驗位
cbxparity.items.add("無");
cbxparity.items.add("奇校驗");
cbxparity.items.add("偶校驗");
cbxparity.selectedindex = 0;
//預設為hex顯示
rbnhex.checked = true;
}///
/// 檢測哪些串列埠可用
///
///
///
private void btncheckcom_click(object sender, eventargs e)
catch (exception)
}if (comexistence)
else
}///
/// 串列埠檢查按鈕:檢查串列埠是否設定
///
private bool checkportsetting()
///
/// 檢查是否傳送資料
///
///
private bool checksenddata()
///
/// 設定串列埠的屬性:停止位、資料位、奇偶校驗位
///
private void setportproperty()
else if (f == 1.5)
else if (f == 1)
else if (f == 2)
else
sp.databits = convert.toint16(cbxdatabits.text.trim());//設定資料位
string s = cbxparity.text.trim();//設定奇偶校驗位
if (s.compareto("無") == 0)
else if (s.compareto("奇校驗") == 0)
else if (s.compareto("偶校驗") == 0)
else
sp.readtimeout = -1;//設定超時讀取時間
sp.rtsenable = true;
//定義datareceived事件,當串列埠收到資料後觸發事件
sp.datareceived += new serialdatareceivedeventhandler(sp_datareceived);
sp.receivedbytesthreshold = 1;
//必須一定要加上這句話,意思是接收緩衝區當中如果有乙個位元組的話就觸發接收函式,
//如果不加上這句話,那就有時候觸發接收,有時候都觸發了好多次了也沒有觸發接收,
//有時候延時現象等等,
if (rbnhex.checked)
else
}///
/// 傳送串列埠資料
///
///
///
private void btnsend_click(object sender, eventargs e)
catch (exception)
}else
if (!checksenddata())//檢測要傳送的資料
}///
/// 串列埠狀態檢測:是否設定、是否占用
///
///
///
private void btnopencom_click(object sender, eventargs e)
if (!issetproperty)//串列埠未設定則設定串列埠
try//開啟串列埠
catch (exception)
}else
catch (exception)}}
private void sp_datareceived(object sender, serialdatareceivedeventargs e)
else
tbxrecvdata.text += recvdatatext;
}// sp.discardinbuffer();//丟棄接收緩衝區資料
}));
}private void btncleandata_click(object sender, eventargs e)}}