下面是详细的C#基于WinForm实现串口通讯的攻略,包括必要的示例代码和步骤。
1. 前置知识
在进行串口通讯之前,需要掌握以下基本知识:
- 串口的通信原理和相关协议
- C#的基本语法和WinForm编程基础
- .NET Framework中用于串口通讯的命名空间SerialPort的相关使用方法
2. 创建WinForm应用程序
首先,我们需要在Visual Studio中创建一个WinForm应用程序,可以按照以下步骤操作:
-
打开Visual Studio,点击“文件”->“新建”->“项目”,在弹出窗口中选择“Visual C#”->“Windows桌面”->“Windows窗体应用程序”。
-
给项目命名,点击“确定”按钮。
-
在设计器中拖拽一个按钮控件和一个文本框控件,分别用于发送数据和显示数据。设置它们的Name属性分别为“btnSend”和“txtReceived”,并设置文本框为只读模式。
3. 添加串口控件
在设计视图中,双击表单,在双击事件中添加如下代码:
using System.IO.Ports;
private void Form1_Load(object sender, EventArgs e)
{
//获取所有可用串口
string[] ports = SerialPort.GetPortNames();
//将可用串口添加到下拉框控件中
comboBox1.Items.AddRange(ports);
}
这段代码将获取可用的串口名,并将其添加到下拉框控件中,方便用户选择要使用的串口。
4. 实现串口通讯
在发送数据之前,必须先打开所选的串口。在“btnSend”按钮的Click事件中,添加以下代码:
private void btnSend_Click(object sender, EventArgs e)
{
//检查串口是否已经打开
if (serialPort1.IsOpen)
{
//获取用户输入的文本
string message = txtSend.Text;
//在文本框中显示发送的数据
txtReceived.AppendText("Send: " + message + Environment.NewLine);
//将数据发送
serialPort1.Write(message);
}
else
{
MessageBox.Show("串口未打开!");
}
}
在接收数据之前,必须先绑定串口对象的DataReceived事件,用于接收串口返回的数据。在WinForm的Load事件中添加以下代码:
private void Form1_Load(object sender, EventArgs e)
{
//获取所有可用串口
string[] ports = SerialPort.GetPortNames();
//将可用串口添加到下拉框控件中
comboBox1.Items.AddRange(ports);
//绑定串口数据接收事件
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
然后实现DataReceived事件处理方法:
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
this.Invoke(new Action(() =>
{
//在文本框中显示接收到的数据
txtReceived.AppendText("Receive: " + indata + Environment.NewLine);
}));
}
在用户选择要使用的串口之后,需要实例化SerialPort类,并设置正确的串口参数。在下拉框控件选中值改变的事件中,添加以下代码:
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//关闭已打开的串口
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
//设置串口参数
serialPort1.PortName = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
//打开串口
try
{
serialPort1.Open();
MessageBox.Show("串口已打开!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
示例1:基于Winform实现发送数据至串口
下面是一段简单的示例代码,演示基于WinForm实现将用户输入的文本发送至串口:
using System.IO.Ports;
public partial class Form1 : Form
{
private SerialPort serialPort1;
public Form1()
{
InitializeComponent();
//实例化串口对象
serialPort1 = new SerialPort();
//设置串口的读写超时时间
serialPort1.ReadTimeout = 1000;
serialPort1.WriteTimeout = 1000;
//绑定串口的数据接收事件
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
this.Invoke(new Action(() =>
{
//在文本框中显示接收到的数据
txtReceived.AppendText("Receive: " + indata + Environment.NewLine);
}));
}
private void Form1_Load(object sender, EventArgs e)
{
//获取所有可用串口
string[] ports = SerialPort.GetPortNames();
//将可用串口添加到下拉框控件中
comboBox1.Items.AddRange(ports);
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//关闭已打开的串口
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
//设置串口参数
serialPort1.PortName = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
//打开串口
try
{
serialPort1.Open();
MessageBox.Show("串口已打开!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnSend_Click(object sender, EventArgs e)
{
//检查串口是否已经打开
if (serialPort1.IsOpen)
{
//获取用户输入的文本
string message = txtSend.Text;
//在文本框中显示发送的数据
txtReceived.AppendText("Send: " + message + Environment.NewLine);
//将数据发送
serialPort1.Write(message);
}
else
{
MessageBox.Show("串口未打开!");
}
}
}
示例2:基于Winform实现读取串口返回的数据
下面是一段简单的示例代码,演示基于WinForm实现读取串口返回的数据:
using System.IO.Ports;
public partial class Form1 : Form
{
private SerialPort serialPort1;
public Form1()
{
InitializeComponent();
//实例化串口对象
serialPort1 = new SerialPort();
//设置串口的读写超时时间
serialPort1.ReadTimeout = 1000;
serialPort1.WriteTimeout = 1000;
//绑定串口的数据接收事件
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
this.Invoke(new Action(() =>
{
//在文本框中显示接收到的数据
txtReceived.AppendText("Receive: " + indata + Environment.NewLine);
}));
}
private void Form1_Load(object sender, EventArgs e)
{
//获取所有可用串口
string[] ports = SerialPort.GetPortNames();
//将可用串口添加到下拉框控件中
comboBox1.Items.AddRange(ports);
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//关闭已打开的串口
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
//设置串口参数
serialPort1.PortName = comboBox1.SelectedItem.ToString();
serialPort1.BaudRate = 9600;
serialPort1.DataBits = 8;
serialPort1.Parity = Parity.None;
serialPort1.StopBits = StopBits.One;
//打开串口
try
{
serialPort1.Open();
MessageBox.Show("串口已打开!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#基于WinForm实现串口通讯 - Python技术站