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

Unity 串口通信

可以通过计算机管理->设备管理器,查看端口
在这里插入图片描述
串口通讯,通常是指的通过计算机或其他设备上的串行端口实现数据传输的过程。
定义与特点:串口通讯是按位(bit)发送和接收字节的通信方式,它将数据一位一位地顺序传输。其特点是使用的数据线少,通常只需两根线就可以实现双向通信,并且能够实现远距离通信,比如串口通信的长度可达 1200 米,而并行通信设备线总长不得超过 20 米。
工作原理:串口通信采用 UART(通用异步收发传输器)协议进行数据传输。发送端的 UART 将并行数据转换为串行数据,在数据字节前发送起始位,然后依次发送数据字节的每个 Bit,最后发送停止位。接收端的 UART 检测到起始位后开始接收数据位和停止位,并将串行数据转换为并行数据。
关键参数
在这里插入图片描述

每秒位数(波特率):表示每秒钟传输的位数,常见的波特率有 4800bps、9600bps、19200bps 等。波特率越高,数据传输速度越快,但也可能带来更高的误码率。
数据位:指实际传输的数据位数,可能为 5、6、7、8 位等,标准的 ASCII 码是 7 位,扩展的 ASCII 码是 8 位。
奇偶校验位:用于接收方对接收到的数据进行校验,校验方式有奇校验、偶校验等,以判断数据在传输过程中是否出现错误。
停止位:用于表示单个包的最后一位,典型的值为 1、1.5 和 2 位。停止位的位数越多,不同时钟同步的容忍程度越大,但数据传输率也越慢。

使用C# System.IO.Ports下进行串口通讯,这边有个注意的地方就是从,net 2开始才有,如果没有命名空间,可以更改一下ProjectSetting->Player->Configuration-> API Compatibility Level

using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Text;public class SerialPortBridge : MonoBehaviour
{#region 定义串口属性//定义基本信息public string portName = "COM7";//串口名public int baudRate = 115200;//波特率public Parity parity = Parity.None;//校验位public int dataBits = 8;//数据位public StopBits stopBits = StopBits.One;//停止位SerialPort sp = null;Thread dataReceiveThread;//发送的消息string message = "";public List<byte> listReceive = new List<byte>();char[] strchar = new char[100];//接收的字符信息转换为字符数组信息string str;#endregionvoid Start(){OpenPort();dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));dataReceiveThread.Start();}void Update(){}#region 创建串口,并打开串口public void OpenPort(){//创建串口sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);sp.ReadTimeout = 400;try{sp.Open();}catch (Exception ex){Debug.Log(ex.Message);}}#endregion#region 程序退出时关闭串口void OnApplicationQuit(){ClosePort();}public void ClosePort(){try{sp.Close();dataReceiveThread.Abort();}catch (Exception ex){Debug.Log(ex.Message);}}#endregion/// <summary>/// 打印接收的信息/// </summary>void PrintData(){for (int i = 0; i < listReceive.Count; i++){strchar[i] = (char)(listReceive[i]);str = new string(strchar);}Debug.Log(str);}#region 接收数据void DataReceiveFunction(){byte[] buffer = new byte[1024];int bytes = 0;while (true){if (sp != null && sp.IsOpen){try{bytes = sp.Read(buffer, 0, buffer.Length);//接收字节if (bytes == 0){continue;}else{string strbytes = Encoding.Default.GetString(buffer);Debug.Log(strbytes);}}catch (Exception ex){if (ex.GetType() != typeof(ThreadAbortException)){}}}Thread.Sleep(10);}#endregion}#endregion#region 发送数据public void WriteData(string dataStr){if (sp.IsOpen){sp.Write(dataStr);}}void OnGUI(){message = GUILayout.TextField(message);if (GUILayout.Button("Send Input")){WriteData(message);}string test = "AA BB 01 12345 01AB 0@ab 发送";//测试字符串if (GUILayout.Button("Send Test")){WriteData(test);}}#endregion
}

其实这边更推荐插件SerialPortUtilityPro,C#原生的限制很大,串口相关的功能这个插件都封装好了,傻瓜式使用。
在这里插入图片描述
在这里插入图片描述
直接挂一下核心组件 SerialPortUtilityPro,直接在面板上设置好需要的参数,设备号,厂商号,端口可以不填,会自动扫描,填了会主动连接设置的端口,然后ReadCompleteEventObject中去添加UnityEvent事件,去响应收到的消息。

http://www.dtcms.com/a/352732.html

相关文章:

  • 解开 Ansible 任务复用谜题:过滤器用法、Include/Import 本质差异与任务文件价值详解
  • Writer-你的私人内容创作助手
  • TCP并发服务器构建
  • TensorFlow 深度学习 | Layer 基础知识介绍
  • 浅谈Elasticsearch数据写入流程的refresh和flush操作
  • 智能一卡通系统通过集成身份识别、权限管理、数据联动等技术,实现多场景一体化管理。以下是多奥基于最新技术趋势和应用案例的系统解析
  • screen命令
  • AI一周事件(2025年8月20日-8月26日)
  • 74hc4094芯片点亮LED闪烁问题的解决
  • JS(面试)
  • 深度学习——激活函数
  • 碳化硅衬底 TTV 厚度不均匀性测量的特殊采样策略
  • Redis哨兵机制:高可用架构的守护神!⚔️ 主从秒级切换实战指南
  • 力扣LCP 46. 志愿者调配随笔
  • 基于Spring Boot+Vue的生活用品购物平台/在线购物系统/生活用户在线销售系统/基于javaweb的在线商城系统
  • 微生产力革命:AI解决生活小任务分享会
  • AI 解决生活小事 2——用 AI 做一回新闻播客
  • 解决mac brew4.0安装速度慢的问题
  • 卫星轨道动力学基本理论
  • 精品短剧《奔腾的心》正式开机,以匠心描绘新时代西藏故事
  • 深入解析达梦数据库:模式分类、状态管理与实操指南
  • 21款m1 max升级到macOS 13——Ventura
  • ModuleNotFoundError: No module named ‘dbgpt_app‘
  • 【开源工具】基于Flask与Socket.IO的跨平台屏幕监控系统实战(附完整源码)
  • 宠物智能手机PetPhone技术解析:AI交互与健康监测的系统级创新
  • 设计模式与设计原则简介——及其设计模式学习方法
  • 【Java】异常处理:从入门到精通
  • `open()` 系统调用详解
  • Day7--HOT100--54. 螺旋矩阵,48. 旋转图像,240. 搜索二维矩阵 II
  • LeetCode 32. 最长有效括号