unity串口通信

   同学们好 本次教程带来unity的端口通信!

     端口一般需要接入外设,比如arduino等单片机,通过端口像电脑传输数据。而unity想要获取硬件信息就要读取端口里的数据。

    点开设备管理器可以看到当前连接的所有设备,也可以查看端口。我们一台电脑有多个端口,所以我们需要确定读取的是哪个端口。

本次教程涉及的软件 脚本均可在会员库- 公众号链接 - 端口 文件夹里获取!

加入会员即可免费下载并可永久免费更新公众号教程资源(关注公众号 小森游戏制作  获取会员)

     我们需要先下载端口调试的工具 ,网上很多这里老师用的是德飞莱串口

可以看到我们如果要读取端口数据 需要指定端口号,波特率,校验位,数据位和停止位。新建脚本 定义这些变量:

    public string portName = "COM3";//串口名    public int baudRate = 9600;//波特率    public Parity parity = Parity.None;//效验位    public int dataBits = 8;//数据位    public StopBits stopBits = StopBits.One;//停止位

并且定义一个serialport(需要引入IO.Port类库)

   SerialPort sp = null;

然后初始化

   /// <summary>    /// 初始化    /// </summary>    /// <param name="port"></param>    public void InitPort(string port)    {        portName = port;        OpenPort();       // StartCoroutine(DataReceiveFunction1());        dataReceiveThread = new Thread(new ThreadStart(DataReceiveFunction));        dataReceiveThread.Start();    }

如果你不知道目标端口 可以遍历获取 并且链接闲置的(这里默认第一个)

   /// <summary>    /// 检索端口    /// </summary>    public void SearchPort()    {        List<string> ports = new List<string>();        bool con = false;        for (int i = 0; i < 5; i++)        {            try            {                SerialPort spa = new SerialPort("COM" + (i + 1));                spa.Open();                spa.Close();                ports.Add("COM" + (i + 1));                Debug.Log("COM" + (i + 1));                con = true;            }            catch (System.Exception)            {                continue;            }        }        Debug.Log(ports[0]);        if (con)            InitPort(ports[0]);    }

消息接收(这里定义了队列来存储消息 外部需要访问数据只需要队列出列就行)

     public Queue<string> msgs = new Queue<string>();//消息队列   void DataReceiveFunction()    {        #region         byte[] buffer = new byte[1024];        int bytes = 0;        while (true)        {            if (sp != null && sp.IsOpen)            {                try                {                    bytes = sp.Read(buffer, 0, buffer.Length);//接收字节                     Debug.Log(bytes);                    if (bytes == 0)                    {                        continue;                    }                    else                    {                        byte[] readdata = new byte[bytes];                        Array.Copy(buffer, 0, readdata,0, bytes);                        //string Utf8str = Encoding.UTF8.GetString(readdata);                       // string ASCIIstr = Encoding.ASCII.GetString(readdata);                        string Defaultstr = Encoding.Default.GetString(readdata);                        //string Unicodestr = Encoding.Unicode.GetString(readdata);                       // Debug.Log("Unicodestr:" + Unicodestr);                        Debug.Log("Defaultstr:" + Defaultstr);                       // Debug.Log("ASCIIstr:" + ASCIIstr);                       // Debug.Log("Utf8str:" + Utf8str);                    }                }                catch (Exception ex)                {                }            }            Thread.Sleep(100);        }        #endregion    }    #endregion

写入数据

    public void WriteData(string dataStr)    {        if (sp.IsOpen)        {            sp.Write(dataStr);        }    }

那么到这里我们的脚本就做好了 挂载到空物体上既可以进行测试,。

如果我们没有实际硬件 那么就需要一个虚拟化工具来开启虚拟端口,这里小森老师用的是这个configurevirtualseralportdriver

该软件试用版可试用14天 如需破解只需要解压破解包吧下图的exe dll 替换掉安装位置的exe和dll(左侧拖到右侧替换)

打开之后是这样

我们点击添加端口就会添加一对 注意是一对 因为虚拟的或者实际的端口只能同时被一个进程访问 所以我们如果用一个端口就会只能收不能发 或者只能发不能收,所以这里添加的一对 我们其中一个用来发 另外一个用来接收即可。

比如我串口工具绑定com1 那么unity软件程序读取就绑定com2,然后运行unity 用工具向端口1发送数据 在unity端即可接收到消息:

不过需要注意的是 有时候数据会被拆开 所以建议大家发送的时候加上数据长度 解析的时候进行存储 到指定长度之后拼接处理

对接收修改如下:

   public Queue<string> msgs = new Queue<string>();    StringBuilder sb = new StringBuilder();    int length = -1;    void DataReceiveFunction()    {        #region         byte[] buffer = new byte[1024];        int bytes = 0;        while (true)        {            if (sp != null && sp.IsOpen)            {                try                {                    bytes = sp.Read(buffer, 0, buffer.Length);//接收字节                     Debug.Log(bytes);                    if (bytes == 0)                    {                        continue;                    }                    else                    {                        byte[] readdata = new byte[bytes];                        Array.Copy(buffer, 0, readdata,0, bytes);                        //string Utf8str = Encoding.UTF8.GetString(readdata);                       // string ASCIIstr = Encoding.ASCII.GetString(readdata);                        string Defaultstr = Encoding.Default.GetString(readdata);                        //string Unicodestr = Encoding.Unicode.GetString(readdata);                        if(length < 0)                        {                            length = int.Parse(Defaultstr[0].ToString ());                            for (int i = 1; i < Defaultstr .Length ; i++)                            {                                sb.Append(Defaultstr[i]);                            }                        }else                        {                            for (int i = 0; i < Defaultstr.Length; i++)                            {                                sb.Append(Defaultstr[i]);                            }                        }                        if(sb .Length == length)                        {                            Debug.Log("数据:" + sb.ToString());                            msgs.Enqueue(sb.ToString());                            sb.Clear();                            length = -1;                        }                                           }                }                catch (Exception ex)                {                }            }            Thread.Sleep(100);        }        #endregion    }

效果如下:不管有没有分开 数据都是正常接收处理了

好了 如上即为端口通信的全部内容,希望对同学们有所帮助!

期待你的点赞 关注 收藏!!!

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值