大家好,我是皮皮猫吖!

每文一言:愿新年,胜旧年!


本篇文章:

主要是关于C#制作简单的串口助手,实现串口之间收发数据。本篇文章制作的串口助手存在一个中文乱码问题,后期文章会解决这个问题。【后期文章:C#实现串口助手,解决中文乱码问题】

功能一:串口简单实现【C#制作的串口向主流的串口助手发送数据】

功能二:C#实现简易串口助手【发送、接收数据】

功能三:C#扫描串口助手

正文如下:

一、串口简单实现【C#制作的串口向主流的串口助手发送数据】

1)设置串口控件

2)通过串口发送数据

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace WindowsFormsApp5
{public partial class Form1 : Form{public Form1(){InitializeComponent();}//窗体创建初始化函数private void Form1_Load(object sender, EventArgs e){//存储下拉框中的内容string str;for(int i = 0; i < 256; i++){//把0-255个数字装换成十六进制,同时变为大写//toString(参数1),根据参数的不同,可转换为任意进制的数据str = i.ToString("x").ToUpper();//如果得到数字的长度是1位的话,就需要在最前面加上一个0,比如0的十六进制应该是00if(str.Length == 1){//str是一位数的时候,在前面添加一个“0”str = "0" + str;}//在数字的前面加上0x,变为真正的十六进制数据comboBox1.Items.Add("0x" + str);}//初始化多选框的值comboBox1.Text = "0x00";}//按键单击函数private void button1_Click(object sender, EventArgs e){//存储当前下拉框选中的内容string data = comboBox1.Text;//把字符分开,截取获得十六进制的数据,去掉0xstring convertdata = data.Substring(2, 2);//定义一个数组byte[] buffer = new byte[1];//一个字节//将字符串,转换为byte类型的变量,buffer[0]存储的是十六进制的数据buffer[0] = Convert.ToByte(convertdata, 16);//防止异常出错try{serialPort1.Open();//里面需要的是字节数组//0:从数组的第几位开始读取//1:读取几个数据serialPort1.Write(buffer, 0, 1);serialPort1.Close();}catch//出错就执行此代码{//串口打开了,写数据时出错,要关闭串口,等待下一次使用//串口都没有找到,串口未找到,串口出错if (serialPort1.IsOpen)//如果写数据出错,此时的窗口状态时打开的,关闭串口serialPort1.Close();MessageBox.Show("端口错误", "错误");}}}
}

3)由于手上没有单品机设备,我使用了虚拟串口进行模拟,很香,完全可以实现串口通信。

① 关于VSPD(虚拟串口)的安装在上一篇文章里面【vspd虚拟串口安装】,这里不做详细描述,直接使用vspd虚拟串口:

  • 【注意】:

    • VSPD是以串口的形式添加的,这里的COM1,COM2成对,COM1的数据只能发送给COM2,COM2会自动接收来自COM1的数据

② 串口助手效果


③ 使用完,删除虚拟串口

④ 本项目中,Visual Studio模拟的是COM1端口,需要使用vspd虚拟串口软件创建一个虚拟的COM2,设置为COM1向COM2发送数据,即可看到如下效果【C#串口助手向其他串口助手【下面有串口助手链接】发送数据】:

二、C#实现简易串口助手【发送、接收数据】

1)串口视图化

① 基本控件

  • groupBox1:带标题的框
  • label:文本
  • radioButton:单选
  • comboBox:多选框
  • panel【容器】:面板(内置单选框,面板内的单选框会相互影响,与面板外的单选框无相互影响)
  • button:按钮
  • textbox:
    • scrollbars:vertical、both、horizontal设置滚动条属性
    • Multiline:true / false 文本可以跨越多行
  • serialPort:串口

2)通过串口发送、接收数据

  • 代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace SerialPort_2
{public partial class Form1 : Form{public Form1(){InitializeComponent();System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;}private void label1_Click(object sender, EventArgs e){}//窗体初始化private void Form1_Load(object sender, EventArgs e){//窗体加载前for (int i = 0; i < 20; i++){//添加串口信息comboBox1.Items.Add("COM" + i.ToString());}//设置串口为COM1comboBox1.Text = "COM1";//设置默认波特率为9600comboBox2.Text = "9600";//手动设置串口的接收回调函数//当串口中有数据发送过来的时候,默认会调用回调函数serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);button3.Enabled = false;}//串口接收数据回调函数private void port_DataReceived(Object sender, SerialDataReceivedEventArgs e){//如果接收模式为字符模式if (radioButton3.Checked){//读取串口中的数据:以字符串方式进行接收String str = serialPort1.ReadExisting();//在文本框中添加内容textBox1.AppendText(str);}else//接收模式为数值接收{byte data;//读取串口中的数据:读取到的是int类型的数据,需要进行一次转换。强转为byte类型data = (byte)serialPort1.ReadByte();//把data数据,转换为16进制的字符串,再转换为字符全大写String str = Convert.ToString(data, 16).ToUpper();//如果是一位数据的话,需要再数据的前面进行补0//比如说串口中的数据为155//读取到的数值为   0x0e.0x05textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");}}//打开串口按钮private void button1_Click(object sender, EventArgs e){try{//设置串口号serialPort1.PortName = comboBox1.Text;//设置波特率:将字符串转换为10进制类型数据//参数1:需要转换的字符串//参数2:默认(10进制),可以是x(十六进制)serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);//打开串口serialPort1.Open();//设置打开串口为非点击状态:打开串口不可用button1.Enabled = false;//关闭串口按钮为可以点击状态:关闭串口可用button2.Enabled = true;}catch{MessageBox.Show("串口打开错误,请检查...", "错误");}}//关闭串口按钮private void button2_Click(object sender, EventArgs e){try{//关闭串口serialPort1.Close();//打开串口可点击button1.Enabled = true;//关闭串口不可点击button2.Enabled = false;}catch{MessageBox.Show("串口关闭错误,请检查...", "错误");}}//发送数据按钮private void button3_Click(object sender, EventArgs e){byte[] Data = new byte[1];//判断串口是否打开if (serialPort1.IsOpen){//判断发送域是否有数据if (textBox2.Text != ""){//以字符形式发送数据if (!radioButton1.Checked){try{//向串口中写入数据serialPort1.WriteLine(textBox2.Text);}catch (Exception err){//向串口写入数据发生错误MessageBox.Show("串口写入数据错误", "错误");//关闭串口serialPort1.Close();//打开串口按钮开启button1.Enabled = true;//关闭串口按钮关闭button2.Enabled = false;}}else{//以数值形式发送数据//防止用于输入的个数为奇数个for (int i = 0; i < (textBox2.Text.Length - textBox2.Text.Length % 2) / 2; i++){//将字符串转换为16进制的数值Data[0] = Convert.ToByte(textBox2.Text.Substring(i * 2, 2), 16);//向串口中写入数据serialPort1.Write(Data, 0, 1);}if (textBox2.Text.Length % 2 != 0){//Data[0] = Convert.ToByte(textBox2.Text.Substring(textBox2.Text.Length - 1, 1), 16);//发送数据serialPort1.Write(Data, 0, 1);}}}  }}private void textBox2_TextChanged(object sender, EventArgs e){if (textBox2.Text == ""){button3.Enabled = false;}else{button3.Enabled = true;}}private void textBox1_TextChanged(object sender, EventArgs e){//保持文本框的滚动条移动到最下方textBox1.ScrollToCaret();}}
}

3)效果如下:

① C#打开串口COM1,其他串口助手打开COM2。C#串口助手向其他串口助手发送数据,其他串口助手接收到C#串口助手发送的数据。情况如下图:

② C#打开串口COM2,其他串口助手打开COM1。其他串口助手向C#串口助手发送数据,C#串口助手接收其他串口助手发送的数据。情况如下图:

4)注意:

① 使用串口之前,需要设置串口的波特率,只有当两个串口的波特率相同的时候,发送的数据才可以接收到

② 发送串口需要和接收串口设置一定的发送数据和接收数据的规则:接收数据模式,发送数据模式

③ 此串口助手有一个小缺点是,中文会出现乱码,在后续文章中会进行改正

三、C#扫描串口助手

1)串口视图化

① 基本控件

  • label:文本
  • button:按钮
  • groupBox:带标题的框
  • comboBox:下拉框
  • serialPort:串口

2)代码

  • 【注意】:

    • 扫描按键的部分设计非常的巧妙。一个一个的试探哪一个串口是打开的,是通过异常试探的方式来实现串口扫描的功能的。然后把打开的串口的名字,加入到comboBox里面即可。本串口助手只扫描到COM20,可以自行更改扫描的上限。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;namespace SerialPort_3
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){//扫描当前哪个串口是打开状态SearchAndAddSerialToComboBox(serialPort1, comboBox1);}//串口打开 / 关闭按钮private void button2_Click(object sender, EventArgs e){//如果当前串口是打开的if (serialPort1.IsOpen){try{//关闭串口serialPort1.Close();radioButton1.Checked = false;}catch{}//文字设置为打开串口button2.Text = "打开串口";}else{try{//此时串口是关闭状态:连接当前扫描到的串口serialPort1.PortName = comboBox1.Text;//打开指定串口号的串口serialPort1.Open();radioButton1.Checked = true;//按钮设置为关闭串口button2.Text = "关闭串口";}catch{MessageBox.Show("串口打开失败", "错误");}}}//扫描按键的作用:扫描当前电脑中,串口打开状态private void SearchAndAddSerialToComboBox(SerialPort MySerialPort, ComboBox comboBox){string buffer;//清除下拉框的内容comboBox.Items.Clear();//获取当前计算机打开的串口for(int i = 1; i < 20; i++){try{buffer = "COM" + i.ToString();//假设COM+i是打开状态MySerialPort.PortName = buffer;//如果当前串口真的处于打开状态,会成功开启串口;否则会打开串口失败,直接跳到catch那边MySerialPort.Open();//把打开的串口名字,添加到下拉框中comboBox.Items.Add(buffer);//关闭打开的串口MySerialPort.Close();}catch{}}}private void button1_Click(object sender, EventArgs e){SearchAndAddSerialToComboBox(serialPort1, comboBox1);}//向串口写入数据private void writeByteToSerialPort(byte data){//封装这写入的数据byte[] buffer = new byte[1] {data};if (serialPort1.IsOpen){try{//向串口中写入数值数据serialPort1.Write(buffer, 0, 1);}catch{MessageBox.Show("串口发送数据错误", "错误");}}}//NO.1的开按钮private void button4_Click(object sender, EventArgs e){writeByteToSerialPort(Convert.ToByte("11", 10));}//NO.1的关按钮private void button3_Click(object sender, EventArgs e){writeByteToSerialPort(Convert.ToByte("10", 10));}private void button6_Click(object sender, EventArgs e){writeByteToSerialPort(Convert.ToByte("21", 10));}private void button5_Click(object sender, EventArgs e){writeByteToSerialPort(Convert.ToByte("20", 10));}private void button8_Click(object sender, EventArgs e){writeByteToSerialPort(Convert.ToByte("31", 10));}private void button7_Click(object sender, EventArgs e){writeByteToSerialPort(Convert.ToByte("30", 10));}}
}

3)实现效果

① 其他串口助手占用COM1端口,C#串口助手只扫描到COM2

② 其他串口助手不使用串口,C#串口助手扫描到COM1、COM2

③ C#串口助手向其他串口助手发送数据:

十进制:11、10、21、20、31、30

十六进制:0B、0A、15、14、1F、1E


4)注意

① 主要是如何实现串口助手的扫描。使用异常的方式,来搜索电脑上面可以使用的串口,通过试错的方式找到可以使用的串口助手。


其他串口助手资源链接:https://pan.baidu.com/s/1agi_IXcSI3L4URVlDzDXUw

提取码:x9i3


希望本篇文章对大家有所帮助,后续会继续分享C#串口助手相关知识…

如果文章内容有错误的地方,请在留言处留下你的见解,方便大家共同学习。谢谢。

作者:皮皮猫吖


`

【C#】基础篇(2) C#实现串口助手,C#扫描串口相关推荐

  1. plc.单片机的串口通讯的调试方法——通过虚拟串口工具和串口助手来调试串口

    加一个,串口助手和虚拟串口工具统合使用的链接,可以一起看哦~https://blog.csdn.net/qq_32278309/article/details/101384003 博主是新入坑的新人, ...

  2. 串口助手-简易串口助手-带时间戳的串口助手-极简串口助手-V1.5 自动保存配置参数 能显示收发时间方便调试

    1.串口助手 2.带时间戳的串口助手,每次收发指令带上了时间戳,方便调试 3.极简串口助手 4.简单易用 高速稳定 5.每次修改的参数都能自动保存,免去了重复配置的工作 软件下载地址:https:// ...

  3. 嵌入式课程设计 使用 tini4412配合交叉编译环境 完成串口助手的制作(已解决主机与设备通过网线FTP连接和交叉编译环境的部署问题)

    嵌入式课程设计 使用 tini4412配合交叉编译环境 完成串口助手的制作 注:还没有完全写完,不过主要过程都在中间了 摘要 本文主要介绍一下五个部分: tini4412的系统烧写 虚拟机上交叉编译环 ...

  4. 串口助手测试NB-IoT模块与华为OceanConnect平台通信(BC35-G模块、非常详细)

    华为OceanConnect平台配置 1 注册华为云平台 1.1 首先登陆华为云官网注册登陆自己的账号. 1.2 点击右上角的控制台进入自己的控制台,如下图所示: 1.3 进入控制台点击左上角的服务列 ...

  5. LabVIEW如何实现高性能串口助手-附代码

    LabVIEW基本上还是在Windows系统下进行开发.在Windows下,提供了非常多的系统接口,供应用开发时调用来实现各种功能,在LabVIEW里面也是可以通过对这些系统接口进行封装,形成LabV ...

  6. QT串口助手-ZUA课设

    QT串口助手 成品展示 QT全部程序构成 zua.pro serial.h main.cpp serial.cpp serial.ui Keil全部程序构成 main.c stm32f10x_conf ...

  7. 上位机开发C#语言:模拟STC串口助手接收单片机发送数据

    题目概述: 设计一个模拟STC串口助手,通过串口进行接收或发送数据. STC串口助手: 编程: using System; using System.Collections.Generic; usin ...

  8. STM32使用printf重定向到USART(串口)并打印数据到串口助手

    STM32使用sprintf打印数据到串口助手 一.背景知识 二. 重定向printf到USART1 三.使用printf打印hello,world到串口助手 3.1 usart.c 3.2 usar ...

  9. 昆仑通态屏幕制作(连载3)---基础篇(按钮串口发送)

    写在开始 经历了两天的努力,终于对这款嵌入式屏幕有了新的认识.下面做下类比: 单片机或者ARM: (1)main函数开始,进行INIT初始化: (2)while(1)循环: (3)外部或内部中断. 以 ...

最新文章

  1. Nginx之rewrite使用
  2. Cookie/Session机制详解--如何区分不同用户
  3. 10 种机器学习算法的要点(附 Python 和 R 代码)(转载)
  4. python 浮点数精度丢失_javascript解决小数的加减乘除精度丢失的方案
  5. mysql 不匹配的_mysql – 如何从两个表中获取不匹配的记录
  6. oracle安装无响应,求教 pl/sql连接本机数据库是未响应问题
  7. CDN加速下载VSCode-1.57.1
  8. 编写程序,生成一个包含20个随机整数的列表,然后对其中偶数下标的元素进行降序排列,基数下标的元素不变
  9. Jconsole/jvisualvm远程监控weblogic中间件配置
  10. Go语言基础之10--面向对象编程2之方法
  11. 独家:为了永不停机的计算服务 - 四月月刊 | 凌云时刻
  12. Python 从零开始制作自己的声音 - wave模块读写wav文件详解
  13. java实现数据库同步
  14. Android 获取地理位置的经度和纬度
  15. 手机如何测光照度_5分钟教你学会如何测光
  16. 请给开源软件一个机会:7-zip / PDFCreator / CDex / VirtualDub 等等
  17. Python 玩转数据 12 - 数据读写 Data I/O: Pandas 读写 JSON File Format
  18. oracle分区缺点,ORACLE的五种表的优缺点概述
  19. CERT_HAS_EXPIRED
  20. CMMI流程—配置管理流程

热门文章

  1. 相机快门之:电子快门
  2. 批处理命令html文件合并,cmd命令行无损合并批处理TS视频文件
  3. MathorCup大数据挑战赛第一届A题-移动通信基站流量预测赛题解析
  4. 微软愿景:未来工作, 也可以这样,强
  5. 牛逼!手把手教你制作个人微信红包封面,保姆级红包封面制作教程
  6. 【计算机网络】网络层——IPv6/IP组播/移动IP
  7. 项目提示JDK版本问题或者语言级别问题时的解决办法
  8. 可以储存照片的字段类型是_在数据库中可用来存储图片的字段对象是哪种类型的字段?...
  9. 设置plsql永久注册码
  10. UE4中动画优化与压缩