今日尝试使用C#进行 自己编写一款上位机串口助手:
文章提供源码、解释、测试效果、整体工程下载......
以下为串口助手的界面效果:
目录
C#System.InvalidOperationException:“线程间操作无效: 从不是创建控件“textBox3”的线程访问它。
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.