C# 串口通信简单示例

C# 简单串口通信示例

  • 串口通信
  • 示例代码

串口通信

C# 串口通信主要操作:

  • 命名空间:using System.IO.Ports;
  • 获取端口:string[] ports = System.IO.Ports.SerialPort.GetPortNames();
  • 设置端口名:serialPort1.PortName = “COM1”; // 字符串
  • 设置波特率:serialPort1.BaudRate = 115200;// int.Parse(“115200”);
  • 设置数据位:serialPort1.DataBits = 1; // int.Parse(“1”);
  • 设置停止位:serialPort1.StopBits = StopBits.One;
    • StopBits.One:停止位1
    • StopBits.OnePointFive:停止位1.5
    • StopBits.Two:停止位2
  • 设置校验位:serialPort1.Parity = Parity.None;
    • Parity.None:无
    • Parity.Even:奇校验
    • Parity.Odd:偶校验
  • 打开串口:serialPort1.Open();
  • 关闭串口:serialPort1.Close();
  • 可读字节:serialPort1.BytesToRead;
  • 读取数据:serialPort1.Read(buffer, 0, len);
  • 写入数据:serialPort1.Write(buffer);
  • 接收事件: XXX_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e);

示例代码

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;
using System.IO;
using System.IO.Ports;namespace serial_tools
{public partial class Form1 : Form{String serialPortName;public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){string[] ports = System.IO.Ports.SerialPort.GetPortNames(); // 获取本机可用串口端口comboBoxPort.Items.AddRange(ports);comboBoxPort.SelectedIndex = comboBoxPort.Items.Count > 0 ? 0 : -1; // 有可用端口显示第一个comboBoxBaudrate.Text = "115200"; // 默认波特率comboBoxDataBits.Text = "8"; // 默认数据位:8comboBoxStopbit.Text = "1"; // 默认停止位:1comboBoxCheck.Text = "无"; // 默认无校验}/// <summary>/// 重写 系统消息函数/// </summary>/// <param name="m"></param>protected override void WndProc(ref Message m){base.WndProc(ref m);}/// <summary>/// 串口数据接收/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e){int len = serialPort1.BytesToRead; // 获取可读字节数byte[] buff = new byte[len]; // 创建缓存数据数组serialPort1.Read(buff, 0, len); // 把数据读取到buff数组string str = Encoding.Default.GetString(buff); // Byte值转ASCII字符串Invoke((new Action(() => {if (checkBoxHexShow.Checked){textBoxRecv.AppendText(byteToHexStr(buff));}else{ textBoxRecv.AppendText(str);                 }}))); // 对话框追加显示数据}public static string byteToHexStr(byte[] bytes){string hexStr = "";try{if (bytes != null) {for (int i = 0; i < bytes.Length; i++){hexStr += bytes[i].ToString("X2");hexStr += " "; // 两个Hex数值以空格隔开}}return hexStr;}catch (Exception){return hexStr;}}/// <summary>/// 打开关闭串口/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void buttonPortOnOff_Click(object sender, EventArgs e){if (buttonPortOnOff.Text == "打开串口") {try{serialPort1.PortName = comboBoxPort.Text; // 获取选择的串口端口serialPortName = comboBoxPort.Text;serialPort1.BaudRate = int.Parse(comboBoxBaudrate.Text); // 获取选择的波特率serialPort1.DataBits = int.Parse(comboBoxDataBits.Text); // 获取选择的数据位// 设置停止位if (comboBoxStopbit.Text == "1") { serialPort1.StopBits = StopBits.One; }else if (comboBoxStopbit.Text == "1.5") { serialPort1.StopBits = StopBits.OnePointFive; }else if (comboBoxStopbit.Text == "2") { serialPort1.StopBits = StopBits.Two; }// 设置奇偶校验if (comboBoxCheck.Text == "无") { serialPort1.Parity = Parity.None; }else if (comboBoxCheck.Text == "奇校验") { serialPort1.Parity = Parity.Even; }else if (comboBoxCheck.Text == "偶校验") { serialPort1.Parity = Parity.Odd; }// 打开串口serialPort1.Open();buttonPortOnOff.Text = "关闭串口";}catch (Exception ex){MessageBox.Show("串口打开失败"+ ex.ToString(), "警告",MessageBoxButtons.OK, MessageBoxIcon.Error);}}else{try{serialPort1.Close();}catch (Exception ex){ }buttonPortOnOff.Text = "打开串口"; }}/// <summary>/// 清空接收数据/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void buttonClearRecv_Click(object sender, EventArgs e){textBoxRecv.Clear();}/// <summary>/// 发送数据/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void buttonSendData_Click(object sender, EventArgs e){String Str = textBoxSend.Text.ToString(); // 获取发送文本框里的数据try{if (Str.Length > 0) {serialPort1.Write(Str); // 串口发送数据}}catch (Exception){ }}/// <summary>/// 清除发送数据/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void buttonClearSend_Click(object sender, EventArgs e){textBoxSend.Clear();}private void comboBoxPort_SelectedIndexChanged(object sender, EventArgs e){}private void comboBoxPort_MouseClick(object sender, MouseEventArgs e){}}
}

窗体界面设计
在这里插入图片描述

运行效果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3中常用的新组件

一、Fragment vue2中&#xff0c;组件必须有一个根标签 vue3中&#xff0c;组件可以没有根标签&#xff0c;内部会将多个标签包含在一个Fragment虚拟元素中。 优点&#xff1a;减少标签层级。 二、Teleport&#xff08;传送门&#xff09; 作用&#xff1a;将组件的 html …

渗透测试tomcat错误信息泄露解决办法

解决方法&#xff1a; 1、使用tomcat8.5.16&#xff0c;会重定向非法url到登录url 2、配置server.xml&#xff0c;加上 <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" />配置…

C++ 模板和泛型编程详解

C中的模板和泛型编程是非常重要的概念。模板是一种将数据类型作为参数的通用程序设计方法。它们允许开发人员编写可以处理各种数据类型的代码&#xff0c;而无需为每种数据类型编写不同的代码。下面介绍了一些关于C中模板和泛型编程的重要知识点 模板的定义 模板是一种通用程序…

opencalib中lidar2camera安装记录

目录 一、opencalib安装 二、lidar2camera的安装 三、测试运行 四、出现过的问题 一、opencalib安装 代码地址&#xff1a;https://github.com/PJLab-ADG/SensorsCalibration/blob/master/README.md # pull docker image sudo docker pull scllovewkf/opencalib:v1 # Aft…

【计算机网络】HTTP 协议的基本格式以及 fiddler 的用法

HTTP协议的基本格式如下&#xff1a; 1.请求行&#xff1a; 包括请求THHP协议的版本、请求URI&#xff08;资源路径&#xff09;和HTTP方法&#xff08;如GET、POST、PUT、DELETE等&#xff09; GET/example.html HTTP/1.1 GET表示请求方法&#xff0c;/example.html表示请求的…

HTTP 协议参考文档

开发者Web协议文档&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web 其中子节点包含 HTTP 协议内容&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/HTTP 其内容是基于 markdown 编写的&#xff0c;对应源文件在 Github 中&#xff0c;如下&#xf…

IDEA 之 在不更改操作系统用户名的情况下更改 ${USER} 变量?

如何在不更改操作系统用户名的情况下更改 IntelliJ IDEA 中的 ${USER} 变量 IDEA -> Help -> Edit Custom VM 添加如下内容 -Duser.nameusername这样在文件或者函数注释的时候会读取这个配置&#xff0c;而不会读取电脑登录用户名

ADB原理(第四篇:聊聊adb shell ps与adb shell ps有无双引号的区别)

前言 对于经常使用adb的同学&#xff0c;不可避免的一定会这样用adb&#xff0c;比如我们想在手机里执行ps命令&#xff0c;于是在命令行中写下如下代码&#xff1a; adb shell ps -ef 或者 adb shell "ps -ef" 两种方式都可以使用&#xff0c;你喜欢用哪个呢&#…

大语言模型(LLM)综述(三):大语言模型预训练的进展

A Survey of Large Language Models 前言4. PRE-TRAINING4.1数据收集4.1.1 数据源4.1.2 数据预处理4.1.3 预训练数据对LLM的影响 4.2 模型架构4.2.1 典型架构4.2.2 详细配置4.2.3 预训练任务4.2.4 解码策略4.2.5 总结和讨论 4.3 模型训练4.3.1 优化设置4.3.2 可扩展的训练技术 …

TypeScript之索引签名

1. 索引签名 在 TypeScript 中&#xff0c;索引签名是一种定义对象类型的方式&#xff0c;它允许我们使用字符串或数字作为索引来访问对象的属性。 索引签名最主要的作用就是允许我们动态地添加或访问对象的属性&#xff0c;通过使用索引签名&#xff0c;我们可以在编译时无法…

【Linux】线程同步

线程同步 线程仅仅互斥&#xff0c;是可以保证线程安全的。但是&#xff0c;这不合理&#xff01;如果一个线程竞争到了锁&#xff0c;那么再它释放后它依然可以竞争个锁。因为CPU此时正在执行当前线程&#xff0c;所以该线程又可以继续竞争锁。 这样就会造成一个问题&#xf…

Python 继承和子类示例:从 Person 到 Student 的演示

继承允许我们定义一个类&#xff0c;该类继承另一个类的所有方法和属性。父类是被继承的类&#xff0c;也叫做基类。子类是从另一个类继承的类&#xff0c;也叫做派生类。 创建一个父类 任何类都可以成为父类&#xff0c;因此语法与创建任何其他类相同&#xff1a; 示例&…

简单介绍一下迁移学习

迁移学习是一种机器学习技术&#xff0c;旨在利用从一个任务或领域学习到的知识来改善另一个任务或领域的学习性能。在传统的机器学习方法中&#xff0c;通常假设训练数据和测试数据是从相同的分布中独立同分布采样的。然而&#xff0c;在现实世界中&#xff0c;这个假设并不总…

Golang Websocket框架:实时通信的新选择

前言 在现代应用程序中&#xff0c;实时通信已经成为了一种必需的特性。而Websocket是一种在客户端和服务器之间建立持久连接的协议&#xff0c;可以实现实时的双向通信。Golang作为一门高效且简洁的语言&#xff0c;也提供了一些优秀的Websocket框架&#xff0c;方便开发者构…

【计算机网络】从输入URL到页面都显示经历了什么??

文字总结 ① DNS 解析&#xff1a;当用户输入一个网址并按下回车键的时候&#xff0c;浏览器获得一个域名&#xff0c;而在实际通信过程中&#xff0c;我们需要的是一个 IP 地址&#xff0c;因此我们需要先把域名转换成相应 IP 地址。浏览器会首先从缓存中找是否存在域名&…

一文5000字从0到1使用Jmeter实现轻量级的接口自动化测试(图文并茂)

接口测试虽然作为版本的一环&#xff0c;但是也是有一套完整的体系&#xff0c;有接口的功能测试、性能测试、安全测试&#xff1b;同时&#xff0c;由于接口的特性&#xff0c;接口的自动化低成本高收益的&#xff0c;使用一些开源工具或一些轻量级的方法&#xff0c;在测试用…

uniapp进行条件编译的两种方法

在UniApp中&#xff0c;进行条件编译有两种方法&#xff1a;使用process.env全局变量和使用条件注释。 1.使用process.env全局变量&#xff1a;UniApp支持根据不同的环境变量来进行条件编译。可以通过在代码中使用process.env来判断当前环境并执行相应的逻辑。 if(process.env…

Tauri2 mobile development traps

时间点&#xff1a;2023/10/24。最近在倒腾移动端开发&#xff0c;不想学原生和 flutter&#xff0c;试了试 react-native&#xff0c;开发体验没有想象中的舒服&#xff0c;干脆直接上 tauri 2 吧&#xff0c;半年前就听说 tauri 2 支持移动端&#xff0c;到现在应该可堪小用。…

idea 插件 checkstyle 规则示例和说明

idea 安装插件 idea 配置插件 checkstyle.xml 示例和说明 <?xml version"1.0"?> <!DOCTYPE module PUBLIC"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN""https://checkstyle.org/dtds/configuration_1_3.dtd"><mod…

Are Large Language Models Really Robust to Word-Level Perturbations?

本文是LLM系列文章&#xff0c;针对《Are Large Language Models Really Robust to Word-Level Perturbations?》的翻译。 大型语言模型真的对单词级扰动具有鲁棒性吗&#xff1f; 摘要1 引言2 相关工作3 合理稳健性评价的奖励模型&#xff08;TREvaL&#xff09;4 LLM的词级…