前言
由于公司需要开发一个 ISP 串口调试工具,而我也具有一点 C# 的基础,所以给我安排了这个任务。这里将开发过程中的心得记录一下。
开发环境
项目简介:
这个串口调试工具需要支持常用的 300-115200bqs 波特率,能设置校验位、数据位、停止位,在接入下位机后能完成对图像参数的读取与设置,方便工程师通过上位机程序对下位机进行 ISP 参数调试。
项目开发环境:
- VS2017
- .NET Framework 4
Winform
首先创建一个 C# 的 Winform 程序。打开 VS2017 选择创建新项目,选择 Visual C# 下的 Windows 桌面,再点击 Windows 窗体应用。
界面布局
先布置一个简单的串口调试工具的 UI 布局,Winform 的 UI 可能不怎么美观,皮肤更换可以使用第三方控件 IrisSkin 快速对 Winform 的样式进行更改,但是会有诸多缺陷,所以想要更加美观的界面还是需要个人花精力来自己设计。
SerialPort 控件
微软 WInform 提供了串口控件 SerialPort,只要两条语句就能够使用:
using System.IO.Ports;
//实例化串口对象
SerialPort serialPort = new SerialPort();
初始化串口参数
先调用 SerialPort.GetPortNames() 方法获取本机所有窗口,然后将获取到的串口添加到 ComboBox 控件 cbSerials 作为候选列表:
/// <summary>
/// 初始化串口界面参数设置
/// </summary>
private void Init_Port_Confs()
{
/*------串口界面参数设置------*/
//检查是否含有串口
string[] ports = SerialPort.GetPortNames();
if (ports == null)
{
//cbSerials.SelectedIndex = -1;// 可以设置默认为 -1
MessageBox.Show("本机没有串口!", "Error");
return;
}
//添加串口选项
cbSerials.Items.AddRange(ports);
//设置默认串口选项
cbSerials.SelectedIndex = 0;
/*------波特率设置-------*/
string[] baudRate = {
"9600", "19200", "38400", "57600", "115200" };
cbBaudRate.Items.AddRange(baudRate);
cbBaudRate.SelectedIndex = 0;
/*------数据位设置-------*/
string[] dataBit = {
"5", "6", "7", "8" };
cbDataBits.Items.AddRange(dataBit);
cbDataBits.SelectedIndex = 3;
/*------校验位设置-------*/
string[] checkBit = {
"None", "Even", "Odd", "Mask", "Space" };
cbParity.Items.AddRange(checkBit);
cbParity.SelectedIndex = 0;
/*------停止位设置-------*/
string[] stopBit = {
"None", "One", "Two", "OnePointFive" };
cbStopBits.Items.AddRange(stopBit);
cbStopBits.SelectedIndex = 1;
}
另外设置了一个扫描端口的按钮,能够刷新本机的串口列表:
/// <summary>
/// 扫描端口
/// </summary>
private void BtnGetPort_Click(object sender, EventArgs e)
{
cbSerials.Text = "";
cbSerials.Items.Clear();
string[] str = SerialPort.GetPortNames();
if (str == null)
{
MessageBox.Show("本机没有串口!", "Error");
return;
}
//添加串口
foreach (string s in str)
{
cbSerials.Items.Add(s);
}
//设置默认串口
cbSerials.SelectedIndex = 0;
}
窗体初始化
在窗体初始化时,会对串口参数设置初始化:
/// <summary>
/// 加载主窗体
/// </summary>
private void Demo_Load(object sender, EventArgs e)
{
// 初始化串口
Init_Port_Confs();
}
连接串口
SerialPort 自带了串口的打开操作 SerialPort.Open()和串口关闭操作 SerialPort.Close(),在连接串口时,要将选择的串口参数设置串口的属性,并且检测串口异常抛出,然后再打开串口。如果出现打开串口异常时,可以打开警告提示框,也可以重新实例化一个窗口继续操作:
/// <summary>
/// 串口的开关操作
/// </summary>
private void BtnConnectSwitch_Click(object sender, EventArgs e)
{
if (!serialPort.IsOpen)// 串口处于关闭状态
{
try
{
// 判断所选端口是否有效
if (cbSerials.SelectedIndex == -1)
{
MessageBox.Show("错误:无效的端口,请重新选择", "Error");
return;
}
// 获取串口参数
string strSerialName = cbSerials.SelectedItem.ToString();
string strBaudRate = cbBaudRate.SelectedItem.ToString();
string strDataBit = cbDataBits.SelectedItem.ToString();
string strCheckBit = cbParity.SelectedItem.ToString();
string strStopBit = cbStopBits.SelectedItem.ToString();
serialPort.PortName = strSerialName;//串口号
serialPort.BaudRate = Convert.ToInt32(strBaudRate);//波特率
serialPort.DataBits = Convert.ToInt32(strDataBit);//数据位
switch (strStopBit) //停止位
{
case "None":
serialPort.StopBits = StopBits.None;
break;
case "One":
serialPort.StopBits = StopBits.One;
break;
case "OnePointFive":
serialPort.StopBits = StopBits.OnePointFive;
break;
case "Two":
serialPort.StopBits = StopBits.Two;
break;
default:
MessageBox.Show("错误:停止位参数不正确!", "Error");
break;
}
switch (strCheckBit) //校验位
{
case "None":
serialPort.Parity = Parity.None;
break;