參考:SerialPort
窗體設計:
數據詞典:
串口設置:
串口:cbx_PortName
波特率:cbx_BaudRate
奇偶校驗:cbx_Parity
停止位:cbx_StopBits
數據位:cbx_DataBits
功能操作:
串口檢測:btn_PortTest
發送數據:btn_SendData
接收數據:btn_ReceiveData
關閉串口:btn_Close
發送數據:tbx_SendData
接收數據:tbx_ReceivedData
添加屬性:
SerialPort sp = null;//新建一個串口對象,作為全局對象
bool isOpen = false;//記錄串口的狀態
bool isSetProperty = false;//記錄參數的設置狀態
方法 |
||
private |
btn_port_test_Click(object sender, EventArgs e) |
檢測可用串口,將可用串口添加至列表cbx_PortName |
private |
CheckPortSetting() |
檢測串口的相關參數是否已設置,即判斷波特率,串口,終止位,數據位,奇偶校驗是否存在 |
private |
CheckSendData() |
檢測tbx_SendData中的內容是否為空 |
private |
SetPortProperty() |
判斷端口的屬性是否已設置,即從窗口中取值,並已傳遞給sp |
private |
btn_send_data_Click(object sender, EventArgs e) |
發送數據命令,初始條件:tbx_SendData非空,參數已設置,串口已打開 |
private |
btn_close_Click(object sender, EventArgs e) |
串口關閉命令 |
protected |
OnClosed(EventArgs e) |
重載窗口關閉事件,確保串口已關閉 |
private |
btn_receive_datat_Click(object sender, EventArgs e) |
接收數據命令,初始條件:串口已打開 |
private |
btn_LinkPort_Click(object sender, EventArgs e) |
連接與斷開串口 |
Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace WF_Port
{
public partial class Form1 : Form
{
SerialPort sp = null;
bool isOpen = false;
bool isSetProperty = false;
public Form1()
{
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.Fixed3D;//固定窗口大小
this.MinimizeBox = false;//去掉最小化窗口
this.MaximizeBox = false;//去掉最大化窗口
//添加串口選項
for (int i = 0; i < 8; i++)
{
cbx_PortName.Items.Add("COM" + (i + 1).ToString());
}
cbx_PortName.SelectedIndex = 2;//默認為COM3
//添加波特率選擇項
cbx_BaudRate.Items.Add("300");
cbx_BaudRate.Items.Add("600");
cbx_BaudRate.Items.Add("1200");
cbx_BaudRate.Items.Add("2400");
cbx_BaudRate.Items.Add("4800");
cbx_BaudRate.Items.Add("9600");
cbx_BaudRate.Items.Add("19200");
cbx_BaudRate.Items.Add("38400");
cbx_BaudRate.Items.Add("43000");
cbx_BaudRate.Items.Add("56000");
cbx_BaudRate.Items.Add("115200");
cbx_BaudRate.SelectedIndex = 5;//默認9600
//奇偶校驗位選擇項
cbx_Parity.Items.Add("None");
cbx_Parity.Items.Add("Odd");
cbx_Parity.Items.Add("Even");
cbx_Parity.SelectedIndex = 0;//默認不使用奇偶校驗
//停止位選擇項
cbx_StopBits.Items.Add("0");
cbx_StopBits.Items.Add("1");
cbx_StopBits.Items.Add("1.5");
cbx_StopBits.Items.Add("2");
cbx_StopBits.SelectedIndex = 1;//默認為1
///數據位選擇項
cbx_DataBits.Items.Add("8");
cbx_DataBits.Items.Add("7");
cbx_DataBits.Items.Add("6");
cbx_DataBits.Items.Add("5");
cbx_DataBits.SelectedIndex = 0;//默認為8位
btn_LinkPort.Text = "打開串口";
}
//端口檢測
private void btn_port_test_Click(object sender, EventArgs e)
{
cbx_PortName.Items.Clear();
for (int i = 0; i < 8; i++)
{
try
{
SerialPort sp = new SerialPort("COM" + (i + 1).ToString());
sp.Open();
if (sp.IsOpen) tbx_status.Text = "COM" + (i + 1).ToString() + "已打開";
sp.Close();
cbx_PortName.Items.Add("COM" + (i + 1).ToString());
}
catch (Exception)
{
//tbx_status.Text = "COM" + (i + 1).ToString() + "不可用";
continue;
}
}
}
//設置檢測
private bool CheckPortSetting()
{
if (cbx_PortName.Text.Trim() == "") return false;
if (cbx_StopBits.Text.Trim() == "") return false;
if (cbx_DataBits.Text.Trim() == "") return false;
if (cbx_Parity.Text.Trim() == "") return false;
if (cbx_BaudRate.Text.Trim() == "") return false;
return true;
}
//發送狀態檢測
//檢測發送數據是否為空
private bool CheckSendData()
{
if (tbx_SendData.Text.Trim() == "") return false;
return true;
}
//------------------------------------------------------------------------
//設置屬性
private void SetPortProperty()
{
sp = new SerialPort();
sp.PortName = cbx_PortName.Text.Trim();
sp.BaudRate = Convert.ToInt32(cbx_BaudRate.Text.Trim());
float f = Convert.ToSingle(cbx_StopBits.Text.Trim());
if (f == 0)
{
sp.StopBits = StopBits.None;
}
else if (f == 1.5)
{
sp.StopBits = StopBits.OnePointFive;
}
else if (f == 1)
{
sp.StopBits = StopBits.One;
}
else if (f == 2)
{
sp.StopBits = StopBits.Two;
}
else
{
sp.StopBits = StopBits.One;
}
sp.DataBits = Convert.ToInt16(cbx_DataBits.Text.Trim());
string s = cbx_Parity.Text.Trim();
if (s.CompareTo("None") == 0)
{
sp.Parity = Parity.None;
}
else if (s.CompareTo("Odd") == 0)
{
sp.Parity = Parity.Odd;
}
else if (s.CompareTo("Even") == 0)
{
sp.Parity = Parity.Even;
}
else
{
sp.Parity = Parity.None;
}
sp.ReadTimeout = -1;
}
private void btn_send_data_Click(object sender, EventArgs e)
{
if (!CheckPortSetting())
{
MessageBox.Show("串口未設置!", "錯誤提示");
return;
}
if (!CheckSendData())
{
MessageBox.Show("請輸入要發送的數據!", "錯誤提示");
return;
}
if (!isSetProperty)
{
SetPortProperty();
isSetProperty = true;
}
if (isOpen)
{
try
{
sp.WriteLine(tbx_SendData.Text);
}
catch (Exception)
{
tbx_status.Text = "發送數據時發生錯誤!";
return;
}
}
else
{
MessageBox.Show("串口未打開!", "錯誤提示");
return;
}
tbx_SendData.Text = "";
}
//--------------------------------------------------------------------
//關閉串口
private void btn_close_Click(object sender, EventArgs e)
{
try
{
sp.Close();
isOpen = false;
}
catch
{
;
}
}
//重載窗口關閉事件
protected override void OnClosed(EventArgs e)
{
try
{
sp.Close();
isOpen = false;
}
catch
{
;
}
base.OnClosed(e);
}
private void btn_receive_datat_Click(object sender, EventArgs e)
{
if (isOpen)
{
try
{
tbx_ReceivedData.Text += sp.ReadLine();
}
catch (Exception)
{
tbx_status.Text = "讀取串口時發生錯誤!";
return;
}
}
else
{
MessageBox.Show("串口未打開!", "錯誤提示");
return;
}
}
private void btn_LinkPort_Click(object sender, EventArgs e)
{
if (isOpen)
{
btn_LinkPort.Text = "打開串口";
sp.Close();
isOpen = false;
}
else
{
btn_LinkPort.Text = "關閉串口";
try
{
SetPortProperty();
sp.Open();
isOpen = true;
}
catch
{
MessageBox.Show("串口未打開!", "錯誤提示", MessageBoxButtons.OK);
}
}
}
}
}