参考: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);
}
}
}
}
}