下面是详细的讲解:
一、准备工作
在使用C#实现简易的串口监视上位机功能前,需要做一些准备工作:
- 确定需要监视的串口号和波特率
- 判断串口是否已打开,打开串口并设置参数
- 创建事件处理函数,用于接收和解析串口数据
二、实现步骤
第一步、创建一个新的C#项目
打开Visual Studio,创建一个新的Windows Forms应用程序。
第二步、添加控件
1. 添加串口控件
在Visual Studio的工具箱中找到“串口控件”,将其拖拽到窗体上。
2. 添加文本框控件
用于显示接收到的串口数据,在Visual Studio的工具箱中找到“文本框控件”,将其拖拽到窗体上。
第三步、实现程序逻辑
1. 打开和关闭串口
通常,打开和关闭串口应该有对应的按钮控件,用户点击打开按钮时,可以执行以下代码来打开串口:
serialPort1.Open();
同样,对于关闭串口的按钮,可以执行以下代码:
serialPort1.Close();
需要注意的是,在打开和关闭串口之前需要先设置好串口号和波特率。
2. 串口数据接收和解析
当串口打开后,程序应该开始监听串口数据,并将接收到的数据显示在文本框控件上。
在C#中,可以通过以下事件处理函数来实现串口数据的接收和解析:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
// 代码实现
}
在事件处理函数中,需要调用 BytesToRead
属性获取数据字节数,并调用 ReadExisting()
方法来读取数据。接着,可以将读取到的数据存储在一个字符串类型的变量中,并将该变量的值显示在文本框控件上。
实现代码如下:
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int bytesToRead = serialPort1.BytesToRead;
byte[] tempByte = new byte[bytesToRead];
serialPort1.Read(tempByte, 0, bytesToRead);
string receivedData = Encoding.Default.GetString(tempByte);
this.Invoke((EventHandler)(delegate
{
textBox1.AppendText(receivedData);
}));
}
三、示例演示
示例1:打开和关闭串口
private void button_OpenSerialPort_Click(object sender, EventArgs e)
{
try
{
//设置串口号、波特率
serialPort1.PortName = comboBox_PortName.Text;
serialPort1.BaudRate = Convert.ToInt32(comboBox_BaudRate.Text);
//设置数据位,停止位和校验位
serialPort1.DataBits = 8;
serialPort1.StopBits = StopBits.One;
serialPort1.Parity = Parity.None;
//打开串口
serialPort1.Open();
button_OpenSerialPort.Enabled = false;//打开后,打开按钮不可用
button_CloseSerialPort.Enabled = true;//打开后,关闭按钮可用
}
catch
{
MessageBox.Show("串口打开失败!", "错误提示");
}
}
private void button_CloseSerialPort_Click(object sender, EventArgs e)
{
try
{
serialPort1.Close();
button_OpenSerialPort.Enabled = true;//关闭后,打开按钮可用
button_CloseSerialPort.Enabled = false;//关闭后,关闭按钮不可用
}
catch
{
MessageBox.Show("串口关闭失败!", "错误提示");
}
}
示例2:数据接收和解析
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int bytesToRead = serialPort1.BytesToRead;
byte[] tempByte = new byte[bytesToRead];
serialPort1.Read(tempByte, 0, bytesToRead);
string receivedData = Encoding.Default.GetString(tempByte);
this.Invoke((EventHandler)(delegate
{
textBox1.AppendText(receivedData);
}));
}
附C#实现串口监视上位机功能完整代码示例:
using System;
using System.IO.Ports;
using System.Text;
using System.Windows.Forms;
namespace SerialPortMonitor
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += Form1_Load;
}
private void Form1_Load(object sender, EventArgs e)
{
//加载COM口
string[] str = SerialPort.GetPortNames(); //获取所有串口
Array.Sort(str); //进行排序
comboBox_PortName.Items.AddRange(str); //将串口号添加到组合框
comboBox_PortName.SelectedIndex = comboBox_PortName.Items.Count > 0 ? 0 : -1; //自动选择第一个
//默认配置
comboBox_BaudRate.SelectedIndex = 3;
comboBox_DataBits.SelectedIndex = 0;
}
private void button_OpenSerialPort_Click(object sender, EventArgs e)
{
try
{
//设置串口号、波特率
serialPort1.PortName = comboBox_PortName.Text;
serialPort1.BaudRate = Convert.ToInt32(comboBox_BaudRate.Text);
//设置数据位,停止位和校验位
serialPort1.DataBits = Convert.ToInt32(comboBox_DataBits.Text);
serialPort1.StopBits = (StopBits)Enum.Parse(typeof(StopBits), comboBox_StopBits.Text);
serialPort1.Parity = (Parity)Enum.Parse(typeof(Parity), comboBox_Parity.Text);
//打开串口
serialPort1.Open();
button_OpenSerialPort.Enabled = false;//打开后,打开按钮不可用
button_CloseSerialPort.Enabled = true;//打开后,关闭按钮可用
}
catch
{
MessageBox.Show("串口打开失败!", "错误提示");
}
}
private void button_CloseSerialPort_Click(object sender, EventArgs e)
{
try
{
serialPort1.Close();
button_OpenSerialPort.Enabled = true;//关闭后,打开按钮可用
button_CloseSerialPort.Enabled = false;//关闭后,关闭按钮不可用
}
catch
{
MessageBox.Show("串口关闭失败!", "错误提示");
}
}
private void button_SendData_Click(object sender, EventArgs e)
{
serialPort1.Write(textBox_SendData.Text);
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int bytesToRead = serialPort1.BytesToRead;
byte[] tempByte = new byte[bytesToRead];
serialPort1.Read(tempByte, 0, bytesToRead);
string receivedData = Encoding.Default.GetString(tempByte);
this.Invoke((EventHandler)(delegate
{
textBox_ReceiveData.AppendText(receivedData);
}));
}
}
}
注:代码示例以Windows Forms应用程序为基础,在实际使用中,也可以将这些代码嵌入到其他应用程序中。同时,需要注意安装好.Net Framework后再运行本应用程序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C# 实现简易的串口监视上位机功能附源码下载 - Python技术站