当前位置: 首页 > news >正文

串口通信基础知识

串口通信基础知识

串口对象

SerialPort

serialPort:串口通信的编程接口,.NET 提供了内置的 System.IO.Ports.SerialPort 类,用于 Windows 平台的串口通信。

重要参数:

  • 波特率(BaudRate):决定数据的传输速度,常见 9600,115200。
  • 数据位(DataBits):表示每个字符的数据位数,通常位 8 位。
  • 校验位(Parity):用于数据的错误检测,无校验(None)、奇校验(Odd)、偶校验(Even)等。
  • 停止位(StopBits):表示数据帧的结束标志,通常位为 1 位。

串口通信的双方参数配置要保持一致。


创建方式

// 获取当前计算机所有有效的端口名称数组
string[] portNames = SerialPort.GetPortNames();
foreach (string portName in portNames)
{cboPortNames.Items.Add(portName);
}// 对象实例化
SerialPort serialPort = new SerialPort();
serialPort.PortName = "COM1";
serialPort.BaudRate = 9600
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.ReadTimeout = 1000;	// 读取超时(毫秒)
serialPort.WriteTimeout = 1000;	// 写入超时// 或者 使用带参数构造函数创建
SerialPort serialPort = new SerialPort("COM1",9600,Parity.None,8,StopBits.One)
{ReadTimeout = 1000;	// 读取超时(毫秒)WriteTimeout = 1000;	// 写入超时
};

核心属性与方法

属性/方法说明示例
PortName串口号(如 COM3)serialPort,PortName =“COM3”
BaudRate波特率(如9600)serialPort.BaudRate=9600
DataBits数据位(5-9,常用8)serialPort.DataBits=8
Parity校验位(None、Even、Odd)serialPort.Parity=Parity.None
StopBits停止位(One、Two)serialPort.StopBits =StopBits.one
ReadBufferSize输入缓冲区的大小serialPort.ReadBuffersize=4800
ReadTimeout读取操作未完成时发生超时之前的毫秒数serialPort.ReadTimeout= 2000
WriteBufferSize串行端口输出缓冲区的大小serialPort.WriteBuffersize= 4800
WriteTimeout写入操作未完成时发生超时之前的毫秒数serialPort.WriteTimeout= 2000
Open()打开串口serialPort.Open()
Close()关闭串口serialPort.Close()
Write()发送字节数组serialPort.Write(data,0,data.Length)
ReadExisting()读取接收缓冲区所有字符string received=serialPort.ReadExisting()
打开串口
serialPort.Open();
if(serialPort.IsOpen)
{lblConnection.Text = "已连接";
}
关闭串口
serialPort.Close();
if(!serialPort.IsOpen)
{lblConnection.Text = "已断开";
}
发送信息
serialPort.Write("Hello,Welcome");
seria1Port.write("Hi,你好”);	// 能发送,但commix无法解析,只支持英文、数字、符号string str ="你好,Leah!";
byte[] bytes = Encoding.UTF8.GetBytes(str);	// UTF8下,一个汉字3个字节
serialPort2.Write(bytes,0,bytes,Length);	// 发送字节数组
接收信息
// 返回缓冲区内的所有字符,一个字符串,有数据就读取,没数据就为空字符串,不会卡线程
string receivestr = serialPort2.ReadExisting();// 定义缓冲区
byte[] recBytes = new byte[10];
// 等一会儿,接收需要时间
Thread.sleep(1000);
// 读取输入缓冲区的字节数组,写入指定缓冲区,返回实际读到的数量
int count = serialPort2.Read(recBytes,0,recBytes.Length);
// 将缓冲区中的字节数组转换为字符串
string str = Encoding,UTF8,Getstring(recBytes,0,count).Trim();// 从缓冲区读一个字节(每次调用)
byte one = serialPort2.ReadByte();
// 读取一个字符
serialPort2.Readchar();
// 读到换行符为止
serialPort2,ReadLine();
// 读到特定字符为止,返回读到的字符串。如果没有特定字符,会一直卡着
string str= serialPort2.ReadTo(".");// 接收缓冲区里可读取的字节数---有风险----信息已发送后才行
int len = serialPort2.BytesToRead;
// 读取可读取的字节数组
serialPort2.Read(recBytes,0,1en);

数据接收事件

  • 关键事件:DataReceived (数据到达时触发)
  • 实现异步接收:
// 当前输入缓冲区中有数据时触发,在创建串口后订阅
serialPort.DataReceived += dataReceived;private void dataReceived(object sender, SerialDataReceiveEventArgs e)
{SerialPort port = (SerialPort)sender;int len = port.BytesToRead;byte[] recbytes = new byte[len];port.Read(recbytes,0,len);
}

串口通信主要情况:

  • 数据安全:DataReceived事件发送在非 UI 线程中,如果在改事件中需要处理界面逻辑,需通过窗体对象的Invoke方法同步执行委托更新界面。
  • 资源释放:使用usingtry/finally确保串口关闭。
  • 缓冲区管理:注意及时读取数据,避免缓冲区出现溢出情况。

文章转载自:

http://pMczP4jV.xzjsb.cn
http://xxm4KzGi.xzjsb.cn
http://XhWMtqkQ.xzjsb.cn
http://csnISBG0.xzjsb.cn
http://f5VoKBMH.xzjsb.cn
http://UofvlmUV.xzjsb.cn
http://HHnyrCOb.xzjsb.cn
http://Fr2NEGX2.xzjsb.cn
http://70EkT9zS.xzjsb.cn
http://Y8uteKoA.xzjsb.cn
http://0G9kzgzF.xzjsb.cn
http://FpQ5m6Uw.xzjsb.cn
http://hFPjZUr1.xzjsb.cn
http://jBmJTlg3.xzjsb.cn
http://H7cvBlwu.xzjsb.cn
http://3X8ufSg5.xzjsb.cn
http://UHxZMYb7.xzjsb.cn
http://x02STjOy.xzjsb.cn
http://M4n7m9Uf.xzjsb.cn
http://gaZFC2iv.xzjsb.cn
http://DIs541uy.xzjsb.cn
http://aKJXKsAT.xzjsb.cn
http://12j82KGp.xzjsb.cn
http://SKPBmvdU.xzjsb.cn
http://FMaKBs6Q.xzjsb.cn
http://KyUzaQiG.xzjsb.cn
http://xsjUziOk.xzjsb.cn
http://lf17w8ay.xzjsb.cn
http://jIwbwdPm.xzjsb.cn
http://DF3EN6vy.xzjsb.cn
http://www.dtcms.com/a/368418.html

相关文章:

  • webshell及冰蝎双击无法打开?
  • Doris 数据仓库例子
  • 从零构建企业级LLMOps平台:LMForge——支持多模型、可视化编排、知识库与安全审核的全栈解决方案
  • 如何根据Excel数据表生成多个合同、工作证、录取通知书等word文件?
  • Highcharts 数据源常见问题解析:连接方式、格式处理与性能优化指南
  • T06_RNN示例
  • 【Android】Room数据库的使用
  • CoolGuard风控系统配置评分卡、权重策略|QLExpress脚本
  • 【FastDDS】Layer Transport ( 02-Transport API )
  • 确保 SQL Server 备份安全有效的最佳实践
  • 盘点完今年CoRL最火的VLA论文,发现最强的机器人,竟是用“假数据”喂大的
  • 新闻丨重庆两江新区党工委副书记、管委会主任许宏球一行莅临华院计算考察指导
  • 基于YOLO目标检测模型的视频推理GUI工具
  • latex公式符号与字体
  • SQL Server事务隔离级别
  • SQL高效处理海量GPS轨迹数据:人员gps轨迹数据抽稀实战指南
  • 查询语言的进化:SQL之后,为什么是GQL?数据世界正在改变
  • 概念 | C标准库STL,C运行时库CRT
  • JAiRouter 配置文件重构纪实 ——基于单一职责原则的模块化拆分与内聚性提升
  • ZooKeeper架构深度解析:分布式协调服务的核心设计与实现
  • ResNet 迁移学习---加速深度学习模型训练
  • Django REST framework:SimpleRouter 使用指南
  • Vue3 频率范围输入失焦自动校验实现
  • 删除元素(不是删除而是覆盖)快慢指针 慢指针是覆盖位置,快指针找元素
  • 代码随想录算法训练营第三天| 链表理论基础 203.移除链表元素 707.设计链表 206.反转链表
  • 结合机器学习的Backtrader跨市场交易策略研究
  • 前端开发vscode插件 - live server
  • 码农的“必修课”:深度解析Rust的所有权系统(与C++内存模型对比)
  • 【Python基础】 17 Rust 与 Python 运算符对比学习笔记
  • 云手机可以息屏挂手游吗?