Unity中的串口
如下,初学者有很多不明白的地方,或者表述不正确的地方欢迎指正。
2021-4-12 21:24
串口中的专业名词
-
串口:
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。
串口号:在"此电脑">右键管理》设备管理器》端口(COM和LPT)中查看串口,一般是虚拟串口,是成对出现的,COM1501对应COM501,客户端是COM501,服务器端COM1501。若运行报错提示串口不存在可以在这里查看是否有对应的虚拟串口。有时又串口也叫端口,这时候就要区别去TCP,UDP这种网络协议中的端口了,在不同的协议中端口的含义不同,注意区分。串口可以同时打开很多个,比如打开COM501,COM502,但是一个一个串口只能同时打开一次,可以参考USB端口,来想象一下。 -
波特率:
波特率表示每秒钟传送的码元符号的个数,它是对符号传输速率的一种度量,它用单位时间内载波调制状态改变的次数来表示,1波特率即指每秒传输1个符号。它和比特率不一样,比特率是对信息传输速率(传信率)的度量。波特率一般使用9600.(拷贝来自百度百科) -
奇偶校验:
奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。(拷贝来自百度百科) -
数据位:
数据位是串行通信中的一个概念,在串行异步通信中规定,传输的数据格式由起始位(start bit)、数据位(data bit)、奇偶校验位(parity bit)和停止位(stop bit)组成,如概述图所示(图中未画出奇偶校验位,因为奇偶检验位不是必须有的,如果有奇偶检验位,则奇偶检验位应该在数据位之后,停止位之前)。(拷贝来自百度百科) -
停止位:
用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。(拷贝来自百度百科) -
从机地址
接收到的的Modbus指令,例如(01 02 03 FFFF 5678),其中01为从机的地址,代表一个Modbus设备,每一个在Modbus组网中每一个设备都有他自己的从机地址。通过从机地址可以确定是哪一个设备。
从机地址的分配有手动分配和自动分配。 -
起始地址
接收到的的Modbus指令,例如(01 02 03 FFFF 5678)其中02 是起始地址。
起始地址有很多其他的名字例如:寄存器起始地址,寄存器地址。
从机地址是设备,设备上有很多参数,每一个参数对应一个起始地址。通过从机地址和起始地址确定要获取哪一个设备的哪一个参数。
关于起始地址的几句描述,链接如下:
有关Modbus起始的几句讨论,不经过很早了。东方俗人,tjig两个人回复 -
Modbus协议
物联网通讯协议,有三个变形》
Modbus RTU:Modbus RTU需要从机地址和串口号,Modbus RTU是一种紧凑的,采用二进制表示数据的方式,RTU格式后续的命令/数据带有循环冗余校验的校验和。
Modbus ASCII:Modbus ASCII需要从机地址和串口号,Modbus ASCII是一种人类可读的,冗长的表示方式,而ASCII格式采用纵向冗余校验的校验和
Modbus TCP:Modbus TCP需要IP和端口号,对于通过TCP/IP(例如以太网)的连接,存在多个Modbus/TCP变种,这种方式不需要校验和计算。
Modbus RTU,Modbus TCP,Modbus ASCII,所需要的参数是一样的。
Modbus专业介绍⬇
知乎Modbus专栏
简书Modbus协议详解
- ZigBee
ZigBee的知乎连接 - MQTT协议
MQTT菜鸟教程
打开串口需要的东西
引用命名空间
using System.IO.Ports;
声明变量
private SerialPort _slavePort=null;//一个空的串口对象
private string protName="COM502";//串口号
private int baudRate=9600;//波特率
private Parity parity=Parity.None;//奇偶校验
private int dataBits=8;//数据位
private StopBits stopBits=StopBits.One;//停止位
private bool _isOpenPort=false;//判断串口是否打开了
打开串口
打开串口在程序结束之前一定要关闭,不然下次启动程序会报错。
private void Openports()
{
if (_isOpenPort == false)
{
_slavePort = new SerialPort(protName, baudRate, parity, dataBits, stopBits);//参数:端口号,波特率,奇偶校验,数据为,停止位
_slavePort.Open();
_isOpenPort = true;
}
}
private void Start()
{
Openports();//打开串口
}
关闭串口
串口被打开一定要关闭
private void ClosePort()
{
if (_isOpenPort==true)
{
_isOpenPort = false;
_slavePort.Close();
}
}
在Disable中关闭串口
protected override void OnDisable()
{
ClosePort();
}
查看有哪些端口
使用C#自带的控制台程序,可能会提示没有包,升级一下就行了, 在报错的地方使用ALT+ENTER就可以修复错误。
- 引用命名空间
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.IO.Ports;
主要是最后一个命名空间
static void Main(string[] args)
{
List<string> cmbPortID = new List<string>();
string[] ports = SerialPort.GetPortNames();//字符串数组存储端口号
if (ports.Length > 0)
{
for (int i = 0; i < ports.Length; i++)
{
cmbPortID.Add(ports[i]);
}
}
else
{
Console.WriteLine("未找到可用串口,请检查连接是否正常!");
}
for (int i = 0; i < cmbPortID.Count; i++)
{
Console.WriteLine(cmbPortID[i].ToString());
}
Console.ReadLine();
}


可能会遇到的错误
-
提示串口不存在
在"此电脑">右键管理》设备管理器》端口(COM和LPT)中查看串口,检查是否有对应的串口 -
串口打开失败
结束程序之后打开的串口是否被关闭了,重新启动Unity并在结束程序之前关闭串口。 -
安装包之后VS还是会报错。提示{ 命名空间“System.IO”中不存在类型或命名空间名“Ports”(是否缺少程序集引用?) }或者提示 { 明明空间转移请使用V=4.000},解决方式:去Unity中修改API,从2.0升级为4.x,步骤Edit>Project Setting>Player>Api Compatibility Level 从.NET Standed 2.0换成。NET 4.x。
本文详细介绍了Unity中的串口通信基础知识,包括串口号、波特率、奇偶校验、数据位和停止位的概念,以及Modbus协议和ZigBee的区别。此外,还指导如何在Unity中设置和管理串口,以及可能遇到的问题和解决方案。
4953





