一步一步用C#实现winform串口通信 【实测成功】

仅作为学习记录,大佬请跳过。

致谢大佬文章
https://www.cnblogs.com/Zed-H/p/8651882.html

背景:
博主基于如下条件制作(of course其他版本的也都可以;如果想直接copy博主的代码运行的话,需要相同版本)

visual studio 2019
.net 4.7.2

实现:
在这里插入图片描述
过程:
1、【创建工程】
参考博主博文,从零开始创建基于C#的winform项目;

2、【布局】
①在"Form1.cs[设计]"这个文档拖拉控件:
在这里插入图片描述
这个界面用到5种控件:
在这里插入图片描述
②控件属性的部分修改:
在这里插入图片描述
在这里插入图片描述
解释:
btnOpen是这个按钮在程序中的名字:
在这里插入图片描述
打开串口是给用户看的,想些啥写啥,跟编程代码没有任何关系;

控件的程序中的名字,博主设置如下图:
cbCom、cbBaudRate、cbStop、cbDataBits、cbCheck、btnOpen、txtSendStr、btnSend、txtReceived
在这里插入图片描述
黑框里的控件不用设置程序名;

③分别对下述两控件的item属性设置:
在这里插入图片描述
在这里插入图片描述
这是博主运行出现bug后搜索半天找到的原因
在这里插入图片描述
在这里插入图片描述

博主对控件和控件属性就操作这么多 (其中③这是博主运行出现bug后搜索半天找到的原因)

3、【写代码】
博主把winform理解为3个文件:
如下图,
1文件不用管,是程序入口,在该项目中不用添加和删减任何代码;
2文件是写代码的地方;
3文件就是刚才所说的拖拉控件的布局界面(双击布局界面可进入2文件)
在这里插入图片描述
关于代码,博主完采用大佬文章,经过上述一些bug的调试,最终在博主的电脑上实测成功
在这里插入图片描述


运行后的一些bug的解决:
1、
在这里插入图片描述
解决:过程2的第③小步,即下拉框里没有东西,检测不到;
加入即解决;

if还是出现该错误的话
说明电脑没有插入串口;then插入一个U盘试试(博主插入的是两个ttl转串口,用于串口通信的检测):
在这里插入图片描述
这样运行后,运行两次——打开两个串口界面——一个设置为COM某、一个设置为另一个COM——点击发送数据进行通信

以下是WinForm实现串口通信的步骤: 1.在窗体上添加控件:Label、ComboBox、Button、TextBox等。 2.在代码中定义串口对象SerialPort,以及串口参数:串口号、波特率、数据位、停止位、校验位等。 3.在代码中编写串口打开、关闭、发送数据、接收数据等相关操作。 4.在代码中编写串口接收数据的回调函数,将接收到的数据显示在文本框中。 5.在代码中编写保存串口参数设置的函数,以便下次打开程序时能够自动加载上次的设置。 以下是一个WinForm实现串口通信的示例代码: ```csharp using System; using System.IO.Ports; using System.Windows.Forms; namespace SerialPortDemo { public partial class Form1 : Form { private SerialPort _serialPort = new SerialPort(); private Tuple<Label, ComboBox>[] _portSetting = new Tuple<Label, ComboBox>[5]; private Button _btnSwitch = new Button(); private Button _btnSaveSetting = new Button(); private TextBox _txtTrans = new TextBox(); public Form1() { InitializeComponent(); // 初始化串口参数设置控件 _portSetting[0] = new Tuple<Label, ComboBox>(label1, comboBox1); _portSetting[1] = new Tuple<Label, ComboBox>(label2, comboBox2); _portSetting[2] = new Tuple<Label, ComboBox>(label3, comboBox3); _portSetting[3] = new Tuple<Label, ComboBox>(label4, comboBox4); _portSetting[4] = new Tuple<Label, ComboBox>(label5, comboBox5); // 初始化串口开关按钮 _btnSwitch.Text = "打开串口"; _btnSwitch.Click += new EventHandler(btnSwitch_Click); // 初始化保存设置按钮 _btnSaveSetting.Text = "保存设置"; _btnSaveSetting.Click += new EventHandler(btnSaveSetting_Click); // 初始化文本框 _txtTrans.Multiline = true; _txtTrans.ScrollBars = ScrollBars.Vertical; _txtTrans.ReadOnly = true; // 将控件添加到窗体上 this.Controls.Add(_btnSwitch); this.Controls.Add(_btnSaveSetting); this.Controls.Add(_txtTrans); foreach (var item in _portSetting) { this.Controls.Add(item.Item1); this.Controls.Add(item.Item2); } // 加载串口参数设置 LoadSerialPortSetting(); } private void btnSwitch_Click(object sender, EventArgs e) { if (_serialPort.IsOpen) { // 关闭串口 _serialPort.Close(); _btnSwitch.Text = "打开串口"; } else { // 打开串口 try { _serialPort.PortName = _portSetting[0].Item2.Text; _serialPort.BaudRate = int.Parse(_portSetting[1].Item2.Text); _serialPort.DataBits = int.Parse(_portSetting[2].Item2.Text); _serialPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _portSetting[3].Item2.Text); _serialPort.Parity = (Parity)Enum.Parse(typeof(Parity), _portSetting[4].Item2.Text); _serialPort.Open(); _serialPort.DataReceived += new SerialDataReceivedEventHandler(_serialPort_DataReceived); _btnSwitch.Text = "关闭串口"; } catch (Exception ex) { MessageBox.Show(ex.Message); } } } private void btnSaveSetting_Click(object sender, EventArgs e) { // 保存串口参数设置 Properties.Settings.Default.PortName = _portSetting[0].Item2.Text; Properties.Settings.Default.BaudRate = _portSetting[1].Item2.Text; Properties.Settings.Default.DataBits = _portSetting[2].Item2.Text; Properties.Settings.Default.StopBits = _portSetting[3].Item2.Text; Properties.Settings.Default.Parity = _portSetting[4].Item2.Text; Properties.Settings.Default.Save(); } private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { // 接收数据回调函数 string recv = _serialPort.ReadExisting(); _txtTrans.Invoke(new Action(() => _txtTrans.Text += recv)); } private void LoadSerialPortSetting() { // 加载串口参数设置 _portSetting[0].Item2.Text = Properties.Settings.Default.PortName; _portSetting[1].Item2.Text = Properties.Settings.Default.BaudRate; _portSetting[2].Item2.Text = Properties.Settings.Default.DataBits; _portSetting[3].Item2.Text = Properties.Settings.Default.StopBits; _portSetting[4].Item2.Text = Properties.Settings.Default.Parity; } } } ```
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值