C#学习笔记5:Winform简单上位机串口助手的实现

本文详细介绍了如何使用C#编写一个串口助手,包括功能设计、控件布局、遇到的线程安全问题解决、串口属性设置、数据发送与接收以及在没有下位机时的调试方法。提供了整体工程代码和下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今日尝试使用C#进行 自己编写一款上位机串口助手:

文章提供源码、解释、测试效果、整体工程下载......

以下为串口助手的界面效果:

目录

1、功能设计与摆放控件:

2.遇到的报错解决与基本提示:

C#System.InvalidOperationException:“线程间操作无效: 从不是创建控件“textBox3”的线程访问它。

设置串口端口停止位波特率等时的数据强制类型转换规范:

串口接收触发异常:

 串口对象的一些常用属性赋值实例:

串口发送信息:

串口接收信息:

3、实际功能展示截图:

4、在没有下位机情况下调试上位机串口的方法:

5、整体工程代码:

6、整体测试工程下载:


1、功能设计与摆放控件:

与之前的串口发送不同,我们此次做的是兼顾接收与发送的串口助手,预设功能如下:

1、串口选择

2、波特率

3、接收显示窗口

4、切换十六进制发送接收功能

5、清除接收区

6、必要的交互按钮

最大的接收区我使用的组件是:richTextBox

清除接收区、打开关闭串口、发送等按键使用的组件是:button

16进制显示、发送我使用了可以框选和不选的组件:checkBox

单条发送后的文本输入区我使用的组件是:textBox(相比richTextBox只有一行)

2.遇到的报错解决与基本提示:

C#System.InvalidOperationException:“线程间操作无效: 从不是创建控件“textBox3”的线程访问它。

这项报错是我  试图   将串口接收到的信息打印在richTextBox1组件时遇到的

解决方案 是在创建窗体时增加代码 禁止编译器对跨线程访问做检查:

          Control.CheckForIllegalCrossThreadCalls = false;

查阅资料网址:

C#System.InvalidOperationException:“线程间操作无效: 从不是创建控件“textBox3”的线程访问它。” - 知乎

设置串口端口停止位波特率等时的数据强制类型转换规范:

串口接收触发异常:

 在串口部分,每个属性的数据类型不太相同,所以赋值时需要注意一下

我们一般将combox下拉框中的text属性作为设置的相应值赋值给seriesport的某些属性,但数据类型不一定对应,所以赋值的时候需要作对应的强制类型转换:

 对于停止位设置进入串口服务事件函数的相关问题,在以下代码注释中有所说明:

              serialPort1.PortName = comboBox1.Text;//设置端口号
              serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text);//设置端口波特率
              serialPort1.StopBits = (StopBits)Convert.ToInt32(comboBox3.Text);//设置停止位
              serialPort1.DataBits = Convert.ToInt32(comboBox4.Text);//设置数据位
              /*  一定要加上下面这句话。
               *  意思是接收缓冲区其中假设有一个字节的话就出发接收函数。
                  假设不加上这句话,
                  那就有时候触发接收都发了好多次了也设有触发接收,有时候延时现象等等
              */
              serialPort1.ReceivedBytesThreshold = 1;
              serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

              serialPort1.Open();                   //打开串口

 串口对象的一些常用属性赋值实例:

这也是我查阅网上资料获取的笔记摘录,为的是

SerialPort mySerialPort = new SerialPort("COM2");//端口
mySerialPort.BaudRate = 9600;//波特率
mySerialPort.Parity = Parity.None;//校验位
mySerialPort.StopBits = StopBits.One;//停止位
mySerialPort.DataBits = 8;//数据位
mySerialPort.Handshake = Handshake.Non;
mySerialPort.ReadTimeout = 1500;
mySerialPort.DtrEnable = true;//启用数据终端就绪信息
mySerialPort.Encoding = Encoding.UTF8;
mySerialPort.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NULL指向我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值