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

小榄做网站上海市网站建设

小榄做网站,上海市网站建设,阿里云oss做网站,茌平做创建网站公司一、本文介绍在windows环境下unity与usb串口进行通信的代码 web版本的放在下一个文章 注: 1.我的硬件是检测磁阻液位,用到四字节十六进制浮点数,所以这里会直接转换到十进制。 2.我的硬件会返回9字节响应,所以我会限制响应长度…

一、本文介绍在windows环境下unity与usb串口进行通信的代码

web版本的放在下一个文章

注:

1.我的硬件是检测磁阻液位,用到四字节十六进制浮点数,所以这里会直接转换到十进制。

2.我的硬件会返回9字节响应,所以我会限制响应长度,可以进行适当更改

重要:再开始前一定要改为.NET 4.x,或者.NET Framework,因为.NET standard 2.0或者2.1不包括需要用到的using System.IO.Ports;更换路径为File/Build Setting/Player Settings.../Other Settings/Api Compatibility Level

二、脚本

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
using System.Text;
using System.Threading;
using UnityEngine;public class SerialPortCommunicationManager : MonoBehaviour
{private static SerialPortCommunicationManager _instance;public static SerialPortCommunicationManager Instance{get{if (_instance == null){GameObject obj = new GameObject("SerialPortCommunicationManager");_instance = obj.AddComponent<SerialPortCommunicationManager>();DontDestroyOnLoad(obj);}return _instance;}}public string portName;// 串口号public int baudRate;// 波特率public int dataBit;//数据位public Parity parity;//校验位public StopBits stopBit;//停止位private SerialPort sp = new SerialPort();private List<byte> receiveBuffer = new List<byte>(); // 用于存储接收到的字节private const int RESPONSE_LENGTH = 9; // 每组响应的长度(9 个字节)/// <summary>/// 打开端口/// </summary>public void OpenPort(){sp = new SerialPort(portName, baudRate, parity, dataBit, stopBit);sp.ReadTimeout = 20;try{sp.Open();Debug.Log("端口已打开");}catch (Exception e){Debug.LogError("端口未打开: " + e.Message);}}/// <summary>/// 关闭端口/// </summary>public void ClosePort(){try{sp.Close();sp.Dispose();Debug.Log("端口已关闭");}catch (Exception e){Debug.LogError("端口无法关闭: " + e.Message);}}/// <summary>/// 检查串口是否打开/// </summary>public bool IsPortOpen(){return sp != null && sp.IsOpen;}/// <summary>/// 发送数据/// </summary>public void SendData(byte[] dataStr){if (sp != null && sp.IsOpen){sp.Write(dataStr, 0, dataStr.Length);Debug.LogWarning("发送成功: " + BitConverter.ToString(dataStr).Replace("-", " "));}else{Debug.LogError("串口未打开,无法发送数据!");}}/// <summary>/// 接收端口数据/// </summary>public void DataReceiveFun(){while (true){if (sp != null && sp.IsOpen){try{int bytesToRead = sp.BytesToRead;if (bytesToRead > 0){byte[] buffer = new byte[bytesToRead];int bytesRead = sp.Read(buffer, 0, bytesToRead);if (bytesRead > 0){// 将读取到的数据添加到缓冲区receiveBuffer.AddRange(buffer);// 按 9 个字节为单位处理数据while (receiveBuffer.Count >= RESPONSE_LENGTH){byte[] response = receiveBuffer.GetRange(0, RESPONSE_LENGTH).ToArray();receiveBuffer.RemoveRange(0, RESPONSE_LENGTH); // 移除已处理的数据// 打印原始响应数据string responseHex = BitConverter.ToString(response).Replace("-", " ");Debug.Log($"收到响应: {responseHex}");// 解析浮点数数据if (response.Length == RESPONSE_LENGTH && response[0] == 0x01 && response[1] == 0x04){// 假设从第 3 字节起 4 个字节是 IEEE 754 单精度浮点数byte[] floatBytes = new byte[4];Array.Copy(response, 3, floatBytes, 0, 4); // 提取第 3 到第 6 字节// 将字节转换为浮点数float floatValue = ConvertHexToFloat(floatBytes);Debug.Log($"解析得到的浮点数: {floatValue}");}else{Debug.LogWarning("响应格式错误!");}}}}}catch (Exception e){Debug.LogError($"接收数据异常: {e.GetType()} - {e.Message}");}}Thread.Sleep(10); // 降低 CPU 占用,10 毫秒足够快}}/// <summary>/// 将 4 个字节转换为 IEEE 754 单精度浮点数/// </summary>private float ConvertHexToFloat(byte[] bytes){// 确保字节顺序正确(大端或小端取决于你的设备,这里假设是大端)if (BitConverter.IsLittleEndian){Array.Reverse(bytes); // 如果是小端机器,翻转字节顺序}// 直接使用 BitConverter 将字节转换为浮点数float result = BitConverter.ToSingle(bytes, 0);return result;}// 字符串转字节流 推荐public byte[] Convert16(string strText){strText = strText.Replace(" ", "");byte[] bText = new byte[strText.Length / 2];for (int i = 0; i < strText.Length / 2; i++){bText[i] = Convert.ToByte(Convert.ToInt32(strText.Substring(i * 2, 2), 16));}return bText;}
}

三、使用

using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
using System.Threading;
using UnityEngine;public class UseSerialPort : MonoBehaviour
{private bool isRunning = true; // 控制发送循环的标志void Start(){SerialPortCommunicationManager.Instance.portName="COM3";      // 串口号SerialPortCommunicationManager.Instance.baudRate=9600;         // 波特率SerialPortCommunicationManager.Instance.dataBit=8;           // 数据位SerialPortCommunicationManager.Instance.parity=Parity.None;  // 校验位SerialPortCommunicationManager.Instance.stopBit=StopBits.One; // 停止位SerialPortCommunicationManager.Instance.OpenPort(); // 打开串口// 启动接收线程new Thread(() =>{SerialPortCommunicationManager control = new SerialPortCommunicationManager();control.DataReceiveFun(); // 持续监听数据}).Start();// 启动发送协程,持续发送命令StartCoroutine(SendCommandRoutine());}/// <summary>/// 持续发送命令/// </summary>/// <returns></returns>IEnumerator SendCommandRoutine(){// 这里是我要发送的命令,并且会接收到9字节响应,所以会限制响应长度string commandHex = "01 04 00 02 00 02 D0 0B"; // 与日志中的命令一致byte[] commandBytes = SerialPortCommunicationManager.Instance.Convert16(commandHex.Replace(" ", ""));while (isRunning){SerialPortCommunicationManager.Instance.SendData(commandBytes);// 等待时间yield return new WaitForSeconds(0.1f); }}
}

四、结尾

有任何错误请指出,补充请评论,看到会第一时间回复,谢谢。

http://www.dtcms.com/wzjs/785750.html

相关文章:

  • 在线做qq空间的网站wordpress 小视频模板
  • 爱站关键词挖掘软件西安推荐企业网站制作平台
  • 大型网站维护费用怎么查网站的备案号
  • 叫别人做网站要多久淄博网站建设卓迅网络
  • 建设工程招投标网站杭州网站制作工具
  • 把网站放到域名上河南宝盈建设工程有限公司网站
  • 中学生设计的网站如何看出一个网站优化的是否好
  • 网站设计公司服务平台哈尔滨h5模板建站
  • 网页设计与网站开发试卷手机上部署网站
  • 怎么做二级网站百度 营销推广多少钱
  • 模板建站优点网店代运营
  • 网站的类型主要有免费做网站怎么做网站吗2
  • asp网站怎样做app网站建设如何做报价
  • 五金网站模板注册公司流程和费用大概多少钱
  • 嘉兴做网站公司哪家好北京网站建设外包公司哪家好
  • 做运动鞋的网站视频网站排行榜前十名
  • 甘肃建投土木工程建设有限公司网站请问做网站和编程哪个容易些
  • 中介网站开发广西做网站找谁
  • 自己建网站数据怎么做制作网站 公司
  • 山西网站建设营销qqwin优化大师官网
  • 做暧暧网站酒泉哪家公司可以做网站
  • 手机销售网站怎么做的买了vps后怎么安装Wordpress
  • 公司网站建设费放什么科目自动生成网页代码的软件
  • 广西建设工程质量安全监督总站网站普通的个人简历怎么写
  • 手机端视频网站模板网络品牌推广方法
  • 查重网站开发天津做网站印标
  • 个人注什么域名的网站app创建
  • 学校学院网站建设意义北京网站制作公司转型方向
  • 怎么做旅游网站框架网站的ftp账号和密码是什么
  • 工信部信息备案网站首页网站建设公司专业网站科技开发