Unity3D 串口通讯(二)---进行串口通讯

传送门:Unity3D 串口通讯(一)---添加虚拟串口

写在前面:

代码中引用using System.IO.Ports;报错的话,把PlayerSettings界面下的OtherSettings下的Api Comatibility Level改为.NET2.0

 或者,把Scripting Runtime Version改为.Net4.6。

 上面两个根据需求选择一种即可。

一、新建一个Dropdown,用于串口的切换,总共涉及两个脚本:SerialNameDropDown、SerialCommunication,把SerialNameDropDown脚本挂载在DropDown控件上。运行效果如下:

由于我这里com2跟com3是一对虚拟的串口,所以与com1不能进行通讯,只能com2、com3之间互通。

二、脚本如下:

using System;
using System.Collections.Generic;
using System.IO.Ports;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class SerialNameDropDown : MonoBehaviour , IPointerDownHandler
{private Dropdown portDropdown;private List<string> portNames;void Start () {portDropdown = GetComponent<Dropdown>();portDropdown.onValueChanged.AddListener(delegate { DropdownValueChanged(portDropdown); });}void OnGUI(){if (SerialCommunication.sp != null && SerialCommunication.sp.IsOpen){byte[] data = { 0x01, 0x10, 0x00, 0x03, 0x00, 0x07, 0x0E, 0x00, 0x04, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x46, 0x70, 0xD5 };if (GUILayout.Button("SendData", GUILayout.Height(50), GUILayout.Width(100))){SerialCommunication.SendData(data);}string by = "01 10 00 03 00 07 0E 00 04 00 46 00 00 00 00 00 00 00 04 00 46 70 D5";if (GUILayout.Button("Send", GUILayout.Height(50), GUILayout.Width(100))){SerialCommunication.SendData(SerialCommunication.StringToBytes(by));}}}public void OnPointerDown(PointerEventData eventData){//如果有串口打开,关闭串口SerialCommunication. ClosePort();关闭接收数据的线程//readThread.Abort();portNames = new List<string>(GetPortNames());//串口列表不为空时if (portNames.Count > 0){portNames.Sort();//清除下拉列表中的选项列表portDropdown.ClearOptions();//根据串口列表,将多个选项添加到Dropdown的选项中portDropdown.AddOptions(portNames);}}/// <summary>获取串口/// </summary>/// <param name="ports"></param>public string[] GetPortNames(){string[] portName;try{portName = SerialPort.GetPortNames();if (portName.Length == 0){portName = null;}}catch (Exception e){Debug.LogError("串口错误" + e.ToString());portName = null;}return portName;}private void DropdownValueChanged(Dropdown portDropdown){//串口列表不为空时,打开串口if (portNames.Count > 0){Debug.Log(portNames[portDropdown.value]);//要打开的串口SerialCommunication.portName = portNames[portDropdown.value];SerialCommunication.OpenPort();}}
}
using System;
using System.IO.Ports;
using System.Threading;
using UnityEngine;public class SerialCommunication
{public static string portName;//串口名private static readonly int baudRate = 38400;//波特率private static readonly Parity parity = Parity.None;//校验位private static readonly int dataBits = 8;//数据位private static readonly StopBits stopBits = StopBits.One;//停止位public static SerialPort sp = null;public static Thread dataReceiveThread;//接收数据进程//void Start()//{//    dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));//}/// <summary>/// 打开端口/// </summary>public static void OpenPort(){sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);sp.ReadTimeout = 400;try{sp.Open();Debug.Log("打开端口:" + portName + "成功!");}catch (Exception ex){Debug.Log(ex.Message);}}/// <summary>/// 关闭端口/// </summary>public static void ClosePort(){try{sp.Close();sp.Dispose();//dataReceiveThread.Abort();//关闭接收数据进程Debug.Log("关闭端口");}catch (Exception ex){Debug.Log(ex.Message);}}/// <summary>/// 发送数据/// </summary>/// <param name="dataStr"></param>public static void SendData(byte[] dataStr){if (sp.IsOpen){sp.Write(dataStr, 0, dataStr.Length);Debug.Log("发送成功");}}static int num = 0;/// <summary>/// 接收数据/// </summary>public static void DataReceiveFunction(){byte[] buffer = new byte[8];int bytes = 0;string[] d = new string[buffer.Length];while (true){if (sp != null && sp.IsOpen){try{bytes = sp.Read(buffer, 0, buffer.Length);sp.DiscardOutBuffer();string s = "";for (int i = 0; i < buffer.Length; i++){if (bytes == 0)continue;else{d[i] = Convert.ToString(buffer[i], 8);}}num++;for (int x = 0; x < d.Length; x++)s += d[x];Debug.Log(s + ";" + num);//打印接收的数据}catch (Exception ex){if (ex.GetType() != typeof(ThreadAbortException)){//Debug.Log(ex.Message);}}}Thread.Sleep(10);}}/// <summary>/// 字符串转字节流/// </summary>/// <param name="str">字符串</param>/// <returns></returns>public static byte[] StringToBytes(string str){if (string.IsNullOrEmpty(str)){return new byte[0];}string s = str.Replace(" ", "");int count = s.Length / 2;var result = new byte[count];for (int i = 0; i < count; i++){var tempBytes = Byte.Parse(s.Substring(2 * i, 2), System.Globalization.NumberStyles.HexNumber);result[i] = tempBytes;}return result;}
}

Unity3D 串口通讯(二)---进行串口通讯相关推荐

  1. USART HMI智能串口屏与单片机双向通讯

    目录 ·HMI串口屏介绍 ·HMI串口屏开发实操 ·准备 ·界面认识 ·写命令 ·下载 ·HMI串口屏与单片机(stm32)双向通信 [ 功能实现: STM32控制串口屏对应的数值.文本完成相应变化 ...

  2. plc串口通讯 qt_Qt 编写串口调试助手

    一.成品图展示 成品图如下所示: 二.串口通讯步骤 1.在工程文件(.pro)中添加串口通信相关运行库:QT += serialport 2.在头文件中添加: #include #include 3. ...

  3. MCGS触摸屏在运行过程中设置Modbus通讯地址及串口参数的方法

    MCGS触摸屏在运行过程中设置Modbus通讯地址及串口参数的方法 一.准备工作 二.操作步骤 测试验证 一.准备工作 昆仑通态官方提供的原版Modbus驱动不支持在程序运行过程中动态修改Modbus ...

  4. 西门子200PLC做自由口通讯,向串口1发送数据

    西门子200PLC做自由口通讯,向串口1发送数据 一.PLC自由口协议初始化. 根据智能设备通信时使用的波特率.校验方式.起始位等参数,配置PLC自由口,即将上述参数用MOVB指令写入SMB30(PO ...

  5. STM32L051测试 (五、串口测试 — 与Enocean模块通讯问题)

    STM32L051测试 第五课,串口的使用 .... by 矜辰所致 ..添加目录栏目 2021/9/30 ..调整文章格式,增加串口接收卡死处理说明 2022/7/18 目录 前言 一.串口接收处理 ...

  6. android 串口一直打开_串口通讯你真的会了吗?不妨来看看这些经验

    平时使用串口打印出现乱码的绝大部分原因是串口波特率没对.那么我们怎么测量实际的波特率呢?在这之前,顺便一起回顾一下波特率的概念. 什么是波特率.比特率? 比特率(Bitrate)表示每秒钟传输的二进制 ...

  7. imx6 配置串口波特率_stm32异步串口(uart)通讯基本操作

    | 串口是一种全双工通讯方式 单工 数据传输只支持数据在一个方向上传输 半双工 允许数据在两个方向上传输,在同一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信 全双工 允许数据同时 ...

  8. STM32 USB使用记录:使用CDC类虚拟串口(VCP)进行通讯

    文章目录 目的 基础说明 使用STM32CubeIDE配置生成代码 用户代码分析 回环测试 串口参数设置 USB HS使用与演示 通讯速率测试 测试代码 USB FS测试 USB HS测试 影响速度的 ...

  9. ros串口通讯(读取串口数据)

    ros串口通讯是非常重要的通讯手段,通常跟下位机或者各种usb口外设都是通过串口进行通讯的. 那么我们跟着教程来学习一下如何读取手机通过无线串口发送给电脑的数据. 这里我通过一个usb-ttl工具将蓝 ...

  10. 野火串口助手协议发送文件通讯协议——XMODEM协议——YMODEM协议

    野火串口助手协议发送文件通讯协议 修订历史 日期 版本 更新内容 2020/6/22 0.0.1 首次发布 XMODEM协议 上位机是现实了XModem-CRC16和XModem-1K; XModem ...

最新文章

  1. java基础面向对象_Java基础面向对象
  2. Linux中设置定期备份oracle数据库
  3. oracle重启监听报01106,oracle 监听重启
  4. pythonflask框架_Flask框架
  5. mac电脑LC_CTYPE: cannot change locale (UTF-8): No such file or directory
  6. 使用YAML创建一个 Kubernetes Depolyment
  7. Vimium快捷键使用
  8. 为Druid监控配置访问权限(配置访问监控信息的用户与密码)
  9. mysql索引简单介绍
  10. LiveGBS国标获取接入海康大华宇视摄像机设备通道的视频流直播地址 HLS/HTTP-FLV/WS-FLV/WebRTC/RTMP/RTSP
  11. iphone11京东商品评论分析
  12. 今天分享一下做支付宝小程序遇到的坑。ISV权限不足,建议在开发者中心检查对应功能是否已经添加。验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配
  13. php 串口 主板,图解主板插槽:教你选对串口卡
  14. 全球地震 Python 爬虫可视化,最频发的地方是这里!
  15. 用 MatLab 绘制立体心形
  16. 删除UltraISO(软碟通)卸载后的遗留文件“isoshl64.dll”
  17. 将HEX文件通过Keil软件进行下载
  18. 金融危机殃及色*情业,女*优转行做黑客?
  19. python matplotlib绘制伯德图
  20. 常用聊天工具(IM)在线客服链接代码

热门文章

  1. Docker 三剑客之Docker Swarm
  2. 通过SelectedIndexChanged获取当前行
  3. jquery thickbox插件
  4. 火车最少钢轨数目问题
  5. 新技术不断发展,一个全新的互联网行业的新风口已然来临
  6. # es6 学习笔记
  7. 你不问它不说:ChatGPT 创建的大部分代码都不安全
  8. pam_succeed_if(sshd:auth): requirement “uid 」= 1000“ not met by user “root“
  9. [FAQ21281]android P分区表中odmdtbo与dtbo分区的说明
  10. 设计模式- 策略模式(Strategy)