栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

Unity C#向串口写入数据

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity C#向串口写入数据

这篇文章随手记录之用

前面的博客很多写需要调整Unity的API到.net 2.0,我这个项目使用的Unity2020.1和VS2019,目前调整PlayerSettings中的API版本到.net 4.x时,编译等都正常,不知道具体原因。

代码(已删除无关部分)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;
using System;

public class SerialPortCommunication : MonoBehaviour
{
    System.IO.Ports.SerialPort sp = new SerialPort();//创建一个端口
    private byte[] openBytes = new byte[4] { 0x0a,0x01,0x01,0xa2};

    // Start is called before the first frame update
    void Start()
    {
        //需要依照电脑情况,我这里电脑只有一个占用的COM1,插入之后就是其他的串口号(虽然不同USB接口也不同),但排除一个COM1就行。实际上可以通过串口助手或者设备管理器等确认具体的串口号。
        string[] names = SerialPort.GetPortNames();
        for (int i = 0; i < names.Length; i++)
            if (names[i].ToUpper() != "COM1")
                sp.PortName = names[i];

        //设置串口的属性
        sp.BaudRate = 9600;
        sp.WriteTimeout = 5;
        sp.ReadTimeout = 5;
        try
        {
            sp.DataReceived += Sp_DataReceived;
            sp.Open();//打开串口开始通信
        }
        catch (Exception e)
        {
            Debug.Log($"serial error:{e.ToString()}");
        }
    }

    public void Send(string command)
    {
        try
        {
            //写入数据并清空缓存,不过后面一句不确定是否需要
            sp.Write(command);
            sp.BaseStream.Flush();
        }
        catch (Exception e)
        {
            Debug.Log($"serial write error:{e.ToString()}");
        }
    }

    public void Send(byte[] command)
    {
        try
        {
            //写入数据并清空缓存,不过后面一句不确定是否需要
            sp.Write(command, 0, command.Length);
            sp.BaseStream.Flush();
        }
        catch (Exception e)
        {
            Debug.Log($"serial write error:{e.ToString()}");
        }
    }

    //保留了一个输入接收事件,但因为没有数据所以也没有调试。根据其他博客内容,似乎事件优先级比较低,如此的话似乎可以考虑开子线程随时监听和处理
    private void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string result=sp.ReadExisting();
        PocessRecievedData(result);
    }

    private void PocessRecievedData(string data)
    {
        //do something...
    }
    
    //退出时关闭串口
    private void OnApplicationQuit()
    {
        if (sp.IsOpen)
            sp.Close();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902281.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号