本文提供基於 System.IO.Ports.SerialPort 的串口通信 WinForms 完整測試程序,含參數配置、收發十六進制數據、異常處理。
程式碼中直接使用 mycom 類 (應封裝 SerialPort),屬性對應標準串口參數:
PortNum (1~4 對應 COM1~COM4)BaudRate (9600 等)ByteSize (8)Parity (0=None, 1=Odd, 2=Even, 3=Mark, 4=Space)StopBits (1=1位, 2=1.5位, 3=2位)ReadTimeout (毫秒)private void Form1_Load(object sender, EventArgs e) {
mycom1.PortNum = iPort;
mycom1.BaudRate = iRate;
mycom1.ByteSize = bSize;
mycom1.Parity = bParity;
mycom1.StopBits = bStopBits;
mycom1.ReadTimeout = iTimeout;
if (OpenCom()) msg.AppendText("串口初始化成功...\r\n");
else msg.AppendText("串口初始化失敗!\r\n");
}
public bool OpenCom() {
try {
if (mycom1.Opened) { mycom1.Close(); mycom1.Open(); }
else { mycom1.Open(); }
return true;
} catch (Exception ex) { MessageBox.Show("錯誤:" + ex.Message); return false; }
}
private void button1_Click(object sender, EventArgs e) {
if (string.IsNullOrEmpty(t_send.Text)) { MessageBox.Show("發送數據為空!"); return; }
byte[] sendBytes = ParseHexString(t_send.Text); // 解析 "02 45 66 FA" 格式
int sent = mycom1.Write(sendBytes);
msg.AppendText($"\r\n發送數據({sent}):{FormatHex(sendBytes)}");
byte[] recv = mycom1.Read(50); // 讀取回應
if (recv.Length > 0) msg.AppendText($"\r\n接收數據:{FormatHex(recv)}");
}
// 輔助:移除空格、兩兩轉 Byte
public byte[] ParseHexString(string input) {
string s = input.Replace(" ", "");
byte[] buf = new byte[s.Length / 2];
for (int i = 0, j = 0; i < s.Length; i += 2, j++)
buf[j] = Convert.ToByte(s.Substring(i, 2), 16);
return buf;
}
// 輔助:Byte[] 轉 "XX XX" 顯示
public string FormatHex(byte[] data) {
return string.Join(" ", data.Select(b => b.ToString("X2")));
}
private void button2_Click(object sender, EventArgs e) {
mycom1.PortNum = Convert.ToInt16(t_port.Text);
mycom1.BaudRate = Convert.ToInt16(t_rate.Text);
mycom1.ByteSize = Convert.ToByte(t_bytesize.Text);
mycom1.Parity = Convert.ToByte(t_parity.Text);
mycom1.StopBits = Convert.ToByte(t_stopbyte.Text);
OpenCom();
}
private void Form1_Closing(object sender, CancelEventArgs e) { mycom1.Close(); }
private void button5_Click(object sender, EventArgs e) {
if (mycom1.Opened) { mycom1.Close(); btn.Text = "開啟串口"; }
else { mycom1.Open(); btn.Text = "關閉串口"; }
}
msg (綠色字體) 顯示收發日誌。t_send 輸入十六進制 (如 02 45 66 FA),按鈕發送/清空/初始化/關閉串口。注意:發送格式必須為偶數長度十六進制字符,空格可選。完整代碼含設計器生成部分,可直接作為串口調試工具基礎擴展。