Unity3D SerialPort处理

using UnityEngine;
using System.Collections;
using System;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO.Ports;
using System.Text.RegularExpressions;
using System.Text;

public class UnitySerialPort : MonoBehaviour
{

    private SerialPort sp;
    private Queue queueDataPool;
    private Thread tPort;
    private Thread tPortDeal;
    private string strOutPool = string.Empty;
    string finalstring = string.Empty;
    string tempstring = string.Empty;

    byte flag0 = 0xAA;//start sign
    byte flag1 = 0x8E;//end sign

    List cmdList = null;//catch pre sign

    List<List> DataList = new List<List>();//catch all sign
    // Use this for initialization
    void Start()
    {
        sp = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);
        if (!sp.IsOpen)
        {
            sp.Open();
        }
        tPort = new Thread(DealData);
        tPort.Start();
        tPortDeal = new Thread(ReceiveData);
        tPortDeal.Start();
    }

    // Update is called once per frame
    void Update()
    {
        if (!tPortDeal.IsAlive)
        {
            tPortDeal = new Thread(ReceiveData);
            tPortDeal.Start();
        }
        if (!tPort.IsAlive)
        {
            tPort = new Thread(DealData);
            tPort.Start();
        }
    }

    private void ReceiveData()
    {
        try
        {
            Byte[] buf = new Byte[1];
            string sbReadline2str = string.Empty;
            if (sp.IsOpen) sp.Read(buf, 0, 1);
            if (buf.Length == 0)
            {
                return;
            }
            if (buf != null)
            {

                for (int i = 0; i < buf.Length; i++)
                {
                    if (buf[i] == flag0)
                    {
                        cmdList = new List();
                        cmdList.Add(buf[i]);
                    }
                    else if (buf[i] == flag1)
                    {
                        cmdList.Add(buf[i]);
                        DataList.Add(cmdList);
                    }
                    else
                    {
                        cmdList.Add(buf[i]);
                    }
                }

                if (DataList.Count > 0)
                {
                    List cmd = DataList[0];

                    StringBuilder sb = new StringBuilder();
                    for (int i = 0; i < cmd.Count; i++)
                    {
                        sb.Append(cmd[i] + " ");
                    }

                    Debug.Log(sb.ToString());

                    DataList.RemoveAt(0);
                }

            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
    }
    private void DealData()
    {
        while (queueDataPool.Count != 0)
        {
            for (int i = 0; i < queueDataPool.Count; i++)
            {
                strOutPool += queueDataPool.Dequeue();
                if (strOutPool.Length == 16)
                {
                    Debug.Log(strOutPool);
                    strOutPool = string.Empty;
                }
            }

        }
    }

    private void SendSerialPortData(string data)
    {
        if (sp.IsOpen)
        {
            sp.WriteLine(data);
        }
    }

    void OnApplicationQuit()
    {
        sp.Close();
    }

    void OnGUI()
    {
        if (GUILayout.Button("Send Data", GUILayout.Height(30)))
        {
            byte[] buffer = { 0xAA, 0x00, 0x22, 0x00, 0x00, 0x22, 0x8E };
            sp.Write(buffer, 0, buffer.Length);
        }

    }
}

Unity3中使用SerialPort类进行串口通讯好像有bug,主要是在数据接收这一块,数据接收采用单独的线程来处理并缓存下来,然后再进行解析,经过测试prefect;

时间: 2024-11-05 20:40:10

Unity3D SerialPort处理的相关文章

出售 unity3d串口插件

出售unity3d串口插件 利用C++编写,解决了mono库 serialport的bug. serialport串口的bug地方在于: 1.有一些数据无法收到. 2.会丢失第一个字节. 3.延迟 我写的库,可以接受所有消息,实时接受,支持高波特率,测试稳定的有38400,单片机30ms发送过来一次数据. 我的QQ:1357098586,欢迎联系.

泰课在线的:HTC Vive 基础入门 基于Unity3D引擎

任务1: 关注公众号即可下载本视频教程 任务2: 01-概述 07:08 任务3: 02-HTC Vive设备的安装 08:33 任务4: 03-下载Steam与SteamVR 03:05 任务5: 04-使用Steam VR 调试设备 14:40 任务6: 05-下载Unity3D 03:24 任务7: 06-配置Unity VR开发环境 09:43 任务8: 07-Steam VR插件的基本使用 20:25 任务9: 08-VR开发初体验 07:15 .net大神老师给我扫盲了,从一点没接触

unity3d 项目源码下载链接

2-1 炉石传说 客户端加服务器端 链接:http://pan.baidu.com/s/1dDKY3Fr 密码:c03q 2-2 新仙剑奇侠传 链接:http://pan.baidu.com/s/1b4QVqI 密码:dic5 2-3 unity3d 战斗卡牌<变身吧主公>客户端+服务器源码 链接:http://pan.baidu.com/s/1kUpot51 密码:i02u 2-4 降临OL-U3D全套源码 链接:http://pan.baidu.com/s/1sktLQ5v 密码:we0g

Unity3D 视频教程列表,列表共 91 套

[000001]<Unity3D Platform 中文视频教程>[7课时] [000002]<Unity3D 游戏蛮荒之地教学视频>[15课时] [000003]<Unity3D 坦克克星视频教程>[9课时] [000004]<Unity3D 太空射击游戏中文视频>[17课时] [000005]<Unity3D 切水果视频教程>[9课时] [000006]<Unity3D 精神時光屋>[5课时] [000007]<Unity3

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因: 多半是因为物体所属Layer与照相机的culling mask不一致导致的,或者超出照相机的可视范围. 如果游戏中有多个相机,每个相机都有自己的可视范围和culling mask,物体在移动的过程中,进入不同的相机,其可见性可能是变化的,取决与物体所属Layer与当前相机是否一致

unity3d编程日志

2014/4/27 编写脚本的时候,加入了中文凝视,发现console面板有非常多不可思议的bug.查了一下发现是由于monodevelop脚本中文凝视报错,而英文凝视不会受影响. 解决方法:把凝视放在//...//中,bug就消失了. 2014/8/22 unity3d常常会报这种错误:object reference can't add to an instance object.这种情况出现是由于在调用的时候没有找到那个对象,解决方法,加if推断方法推断是否存在.排除异常

Unity3D在Android平台使用嵌入式数据库Sqlite,解决无法找到数据库文件的问题

做一个需要嵌入式数据库Sqlite 的unity3d项目,在pc机上运行良好,需要发布到Android平台上,于是,各种坑爹...会遇到找不到数据库文件的问题.当在pc机上使用sqlite时,当执行SqliteConnection dbConnection = new SqliteConnection("data source = test.db");语句时,如果有这个数据库文件则建立连接,如果没有则创建出这个文件,然后建立连接.当在Android平台上时,扯淡的事情就开始了,总之便不

Unity3D学习笔记之七创建自己的游戏场景

到现在为止我们已经拥有了比较完备的Prefab,已经可以创建宏大的游戏场景,并以第一人称视角在场景中漫游了.这里给大家做个小的示范,建一个小场景大家在创建场景的时候需要自由发挥,做个尽量大的场景出来. 这一系列教程以及素材均参考自人人素材翻译组出品的翻译教程<Unity游戏引擎的基础入门视频教程>,下载链接附在第二篇学习笔记中. 我们以最初的添加了First Person Controller的PFB_Straight为整个场景的中心点来展开.我们先从Project中Prefabs文件夹拖出来

unity3d 赛车游戏——复位点检测

一直没有时间写博客 昨天我的CarWaypoints插件也告一段落了 今年没回家,过年就我一个人 挺无聊的,那就休息一天写几篇博客吧 我的代码可能很少,但是思路很重要 希望不懂的朋友别只copy代码 赛车游戏的话赛车难免会冲出跑道.掉入水坑.卡在障碍物上....等情况 那么问题来了,遇到这些情况怎么办呢? 玩家玩得好好的,难道就因为遇到这些情况要退出游戏重新进入吗? 那当然是不现实的,要是我的话果断卸载游戏 还要骂一句做游戏的人是脑残啊 我想你不希望玩家骂你是脑残吧,哈哈哈 新技能,赶快GET起