unity串口通信相关记录(通过unity和串口通信制作简单视频播放器)

一、相关软件

1、虚拟串口模拟器:vspn

下载链接vspd.zip_免费高速下载|百度网盘-分享无限制

下好之后,可以直接安装英文版vspd.exe,也可以选择Cracked文件夹中的已汉化好的版本直接使用vspdconfig.exe

注意:这个软件的使用期限,只有14天的免费使用时间,14天后不注册,软件就打不开了

使用方法:打开软件之后点击Add pair就可以直接增加虚拟串口了。然后不需要的时候就把串口删除就行(串口打开之后,在后面会显示[9600-N-8-1],如COM3后面的显示)

2、ATK串口调试助手

下载链接:https://pan.baidu.com/s/1WE85obmk93zntQiuv59ehA 
提取码:fdvw

使用方法:先点击上面红色框中的内容选择串口,这里选择的是COM3向COM2发送消息,因为在unity里面打开的COM2,COM2被占用,所以是这串口调试助手中打开了COM3,点击

由黄色框中可见,是COM3接收的内容。

COM2->COM3发送了两条消息,都是“12345”,这个是验证unity的串口是否打开的。

由蓝色框中可见,是COM3发送的内容。

是COM3->COM2发送的消息,在这发送消息,在unity中做对应的相应,例如,发送2的话就是播放视频,在unity中视频就会播放

下载完这两个软件之后,就可以实现不用硬件,只需要一台电脑就能实现unity的串口通信了。

二:unity的设置

代码的书写原文链接:http://t.csdn.cn/lUrd2(他前面写的那堆我也没看懂,就直接把全部的代码复制进来,然后再根据自己的需求进行修改)我这边做的是一个通过串口控制制作一个视频播放器

VideoController(视频控制器)

using RenderHeads.Media.AVProVideo;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
/// <summary>
/// 视频控制器
/// </summary>
public class VideoController : MonoBehaviour
{
    public GameObject  VideoRoot;  //video的root界面
    public GameObject  BGRoot;  //BG的root界面
     //持有控制视频播放的组件
     public MediaPlayer mediaPlayer;
     public MediaPlayer BGMediaPlayer;  //背景视频的mp

    //背景界面的显示
    public GameObject bgVideoUI;    //背景视频的ui
    public Image bgImg;             //背景图片的ui
    public Image maskImg;             //遮罩的ui
 
    [Header("视频名称")]
    public string[] VideoNames;
    public List<Sprite> imageList = new List<Sprite>();   //加载的图片的列表
    public List<Sprite> maskImageList = new List<Sprite>();   //加载的图片的列表

    static VideoController instance;

    TestPort testPort;

    public static VideoController GetInstance()
    {
        return instance;
    }
    //初始化
    void Awake()
     {
        instance = this;
        //视频名称的路径
        VideoNames = File.ReadAllLines(Application.streamingAssetsPath + "/Video/videoName.txt");

        //注册视频播放触发事件
        mediaPlayer.Events.AddListener(MediaEventHandler);

        //加载图片,加载遮罩图片
        LoadAllPic();
        LoadMaskPic();

        LoadVideo(0,false);

        testPort = new TestPort();

    }

    // 视频播放时间触发
    private void MediaEventHandler(MediaPlayer arg0, MediaPlayerEvent.EventType arg1, ErrorCode arg2)
    {
        switch (arg1)
        {
            case MediaPlayerEvent.EventType.Closing:
                break;
            case MediaPlayerEvent.EventType.Error:
                break;
            case MediaPlayerEvent.EventType.FinishedPlaying://注意:如果视频设置为循环播放模式,则不触发此项
                Debug.Log("播放完触发");
                //视频播放完的事件
                ListLoop();
                FinishShowBlack();
                ShowFirst();
                ShowBGImg();
                ShowBgVideo();
                break;
            case MediaPlayerEvent.EventType.FirstFrameReady:
                break;
            case MediaPlayerEvent.EventType.MetaDataReady:
                break;
            case MediaPlayerEvent.EventType.ReadyToPlay:
                break;
            case MediaPlayerEvent.EventType.Started://注意:每暂停之后的开始播放都会触发一次
                Debug.Log("开始播放触发");
                break;
            default:
                break;
        }
     }
 
     void Start ()
     {
        //默认界面显示
        BGRoot.SetActive(false);
        VideoRoot.SetActive(true);

        //默认不显示遮罩
        //DisShowMask();
     }

    #region 视频加载,内容视频和背景视频
    // 加载视频方法
    int index = 0;

    public int Index { get => index; set => index = value; }
    public void LoadVideo(int index,bool isPlay)
     {
        if (index>=VideoNames.Length)
        {
            index = 0;
        }
         //通过插件中的方法加载(参数为:1.加载路径格式(与面板上相对应)2.加载的文件名 3.默认是否开始播放)
         mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, "Video/"+ VideoNames[index] + ".mp4", isPlay);

        BGMediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, "bgContent/bg.mp4", false);

    }
    #endregion

    #region 视频切换

    // 下一个视频
    public void NextVideo()
    {
        index++;
        if (index > VideoNames.Length - 1)
            index = 0;
        //视频播放
        LoadVideo(index,true);
    }

    public void NextVideoCK(int _index)
    {
        //testPort.IsClick = isClick;
        index = _index;
        index++;
        if (index >= VideoNames.Length )
            index = 0;

    }

    // 上一个视频
    public void LastVideo()
    {
        index--;
        if (index < 0)
            index = VideoNames.Length - 1;
        //视频播放
        LoadVideo(index,true);
    }

    public void LastVideoCK(int _index)
    {
        index = _index;
        index--;
        if (index < 0)
            index = VideoNames.Length - 1;
    }

    #endregion

    #region 视频播放、暂停、循环
    // 播放与暂停开关点击触发
    public void DoPlayOrPause(bool s_isOn)
     {
        if (VideoRoot.activeSelf)
        {
            if (s_isOn)
            {
                //通过持有的MediaPlayer类进行操控
                mediaPlayer.Control.Play();
            }
            else
            {
                mediaPlayer.Control.Pause();
            }
        }
        
     }

    public void DoPlay(bool s_isOn)
    {

        if (s_isOn)
        {
            //通过持有的MediaPlayer类进行操控
            mediaPlayer.Control.Play();
        }
        else
        {
            mediaPlayer.Control.Pause();
        }


    }

    //重播
    public void Restart()
    {
        mediaPlayer.Control.Rewind();
    }

     // 是否循环播放开关点击触发
    public void DoSetLoop(bool s_isOn)
     {
         //通过持有的MediaPlayer类进行操控
         mediaPlayer.Control.SetLooping(s_isOn);
     }

    public bool isListLoop = false;    //是否列表播放
    public void ListLoop()
    {
        if (isListLoop)
        {
            NextVideo();
            mediaPlayer.Play();
            Debug.Log(111);
        }
    }

    #endregion

    #region 倍速

    // 改变播放速度方法(正的加速放映,负的倒放映)
    public  void DoChangeSpeed(int s_speed)//下拉列表对应索引值
     {
         float tSpeed = 1;
         switch (s_speed)
         {
             case 0:
                 tSpeed = 2;
                 break;
             case 1:
                 tSpeed = 1.5f;
                 break;
             case 2:
                 tSpeed = 1;
                 break;
             case 3:
                 tSpeed = 0.5f;
                 break;
             
             default :
                 Debug.Assert(false);
                 break;
         }
         mediaPlayer.Control.SetPlaybackRate(tSpeed);
     }
    #endregion

    #region 进度条
    // 时刻更新视频进度到滑动条上
    void DoUpdateVideoProcess()
     {
         //获取当前播放时长
         float tCurrentTime = mediaPlayer.Control.GetCurrentTimeMs();
         //获取视频总长度
         float tVideoTime = mediaPlayer.Info.GetDurationMs();
         //计算出对应的播放进度赋值给显示播放进度的进度条
         //m_processSlider.value = tCurrentTime/tVideoTime;
     }

    int tCurrentMin;
    int tCurrentSeconds;
    int tVideoTimeMin;
    string tVideoTimeSecondStr;
     // 更新播放进度的时间显示
     void UpdateTimeText()
     {
         //对当前播放时间转换时间格式
         //转化为 秒
         tCurrentSeconds = (int)mediaPlayer.Control.GetCurrentTimeMs()/1000;
         //获取当前分数
         tCurrentMin = tCurrentSeconds/60;
         //重新赋值剩余多少秒
         tCurrentSeconds = tCurrentSeconds%60;
         string tCurrentSecondStr = tCurrentSeconds < 10 ? "0" + tCurrentSeconds : tCurrentSeconds.ToString();
 
         //对总时间转化时间格式
         //转化为秒
         int tVideoTimeSeconds = (int) mediaPlayer.Info.GetDurationMs()/1000;
         //获取总的分数
         tVideoTimeMin = tVideoTimeSeconds/60;
         //重新复制剩余多少秒
         tVideoTimeSeconds = tVideoTimeSeconds%60;
         tVideoTimeSecondStr = tVideoTimeSeconds < 10 ? "0" + tVideoTimeSeconds : tVideoTimeSeconds.ToString();
 
         //拼接一下时间显示字符串
         string tTime = string.Format("<color=write>{0}:{1}/{2}:{3}</color>", tCurrentMin, tCurrentSecondStr, tVideoTimeMin, tVideoTimeSecondStr);
 
         //m_videoTimeTex.text =  tTime;
     }
 
     // 视频播放进度条值改变触发
     void OnProcessSliderChange(float value)
     {
         //获取视频总长度
         float tVideoTime = mediaPlayer.Info.GetDurationMs();
         //当前视频的时间
        // //float tCurrentTime = m_processSlider.value*tVideoTime;
        // //将视频时间调到对应的节点
        // mediaPlayer.Control.Seek(tCurrentTime);

        //m_processSlider.transform.Find("Fill Area").Find("Fill").GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
        //m_processSlider.transform.Find("Handle Slide Area").Find("Handle").GetComponent<RectTransform>().anchoredPosition = new Vector2(0, 0);
     }
 
 
     // 播放进度条开始拖动触发(EventTrigger触发)
     public void OnProcessSliderDragBegin()
     {
         //暂停播放
         mediaPlayer.Control.Pause();
     }
 
     // 播放进度条结束拖动触发(EventTrigger触发)
     public void OnProcessSliderDragEnd()
     {
         //开始播放
         mediaPlayer.Control.Play();
     }

    #endregion

    #region 音量设置

    //音量加减
    float value = 1f;
    public void VolumeAdd(float change)
    {
        value+=(change/100);
        if (value>=1)
            value = 1;
        mediaPlayer.Control.SetVolume(value);
    }

    public  void VolumeSub(float change)
    {
        value -= (change / 100);
        if (value <= 0)
            value = 0;
        mediaPlayer.Control.SetVolume(value);
    }
 
     // 静音
    public void Mute()
     {
        mediaPlayer.Control.SetVolume(0);
        
    }

    //取消静音
     public void CanelMute()
    {
        mediaPlayer.Control.SetVolume(value);
    }
    #endregion

    #region 开启和关闭视频
    //视频开启时,视频的Root开启,背景的Root关闭,背景视频停止播放
    public void OpenVideo()
    {
        VideoRoot.SetActive(true);
        BGRoot.SetActive(false);
        BGMediaPlayer.Pause();

        iSshowBlack = false;
        IsShowBGImg = false;
        IsShowFirst = false;
    }

    //关闭视频,显示黑屏
    public void CloseVideo1()
    {
        //界面的显示
        VideoRoot.SetActive(false);
        BGRoot.SetActive(true);

        mediaPlayer.Stop();
        bgImg.color = Color.black;
        BGMediaPlayer.Stop();
    }

    //关闭视频,显示背景视频
    public void CloseVideo2()
    {
        //界面的显示
        VideoRoot.SetActive(false);
        BGRoot.SetActive(true);

        mediaPlayer.Stop();
        bgImg.gameObject.SetActive(false);
        BGMediaPlayer.Play();
    }

    public void CloseVideo3()
    {
        //界面的显示
        VideoRoot.SetActive(false);
        BGRoot.SetActive(true);
        mediaPlayer.Stop();

        bgImg.gameObject.SetActive(true);
        bgImg.color = Color.white;
        bgImg.sprite = imageList[0];
        //背景视频停止播放
        BGMediaPlayer.Stop();
    }
    #endregion

    #region 视频播放完之后
    public bool iSshowBlack = false;  //播放完毕是否显示黑屏

    //播放完之后显示黑屏
    public void FinishShowBlack()
    {
        if (iSshowBlack)
        {
            //界面切换
            VideoRoot.SetActive(false);
            BGRoot.SetActive(true);

            bgImg.color = Color.black;
            BGMediaPlayer.Stop();
        }
    }

    public bool IsShowFirst;    //播放完毕是否显示第一帧
    public void ShowFirst()
    {
        if (IsShowFirst)
        {
            //界面切换
            VideoRoot.SetActive(false);
            BGRoot.SetActive(true);

            Texture2D texture2D = new Texture2D(1920, 1080);
            mediaPlayer.ExtractFrame(texture2D, 0);
            Sprite sprite = Sprite.Create(texture2D, new Rect(0, 0, texture2D.width, texture2D.height), new Vector2(-500, -500));

            bgImg.color = Color.white;
            bgImg.sprite = sprite;
            BGMediaPlayer.Stop();
        }
        
    }

    public bool IsShowBGImg = false;

    void ShowBGImg()
    {
        if (IsShowBGImg)
        {
            VideoRoot.SetActive(false);
            BGRoot.SetActive(true);
            mediaPlayer.Stop();

            bgImg.gameObject.SetActive(true);
            bgImg.color = Color.white;
            bgImg.sprite = imageList[0];

            BGMediaPlayer.Stop();
        }
    }

    public bool IsShowBGVideo = false;

    void ShowBgVideo()
    {
        if (IsShowBGVideo)
        {
            VideoRoot.SetActive(false);
            BGRoot.SetActive(true);
            mediaPlayer.Stop();

            bgImg.gameObject.SetActive(false);
            BGMediaPlayer.Play();
        }
    }

    #endregion

    #region 显示和隐藏遮罩
    public void ShowMask()
    {
        if (maskImageList.Count <= 0)
        {
            maskImg.sprite = null;
            Debug.Log("没有遮罩");
            maskImg.gameObject.SetActive(false);
        }
        else
        {
            maskImg.sprite = maskImageList[0];
            maskImg.gameObject.SetActive(true);
        }
    }

    public void DisShowMask()
    {
        maskImg.gameObject.SetActive(false);

    }
    #endregion

    #region 外部加载背景图片
    void LoadAllPic()
    {
        //从StreamingAssets中加载图片
        string imgtype = "*.BMP|*.JPG|*.GIF|*.PNG|*.JPEG";
        string[] ImageType = imgtype.Split('|');
        for (int k = 0; k < ImageType.Length; k++)
        {
            //获取streamingAssets文件夹下所有的图片路径  
            string[] dirs = Directory.GetFiles(Application.streamingAssetsPath+"/bgContent", ImageType[k]);
            for (int j = 0; j < dirs.Length; j++)
            {
                Texture2D tx = new Texture2D(100, 100);
                tx.LoadImage(getImageByte(dirs[j]));
                Sprite sprite = Sprite.Create(tx, new Rect(0, 0, tx.width, tx.height), new Vector2(-500, -500));
                sprite.name = Path.GetFileNameWithoutExtension(dirs[j]);
                //将获取的图片加到图片列表中
                imageList.Add(sprite);
            }
        }
    }

    void LoadMaskPic()
    {
        //从StreamingAssets中加载图片
        string imgtype = "*.BMP|*.JPG|*.GIF|*.PNG|*.JPEG";
        string[] ImageType = imgtype.Split('|');
        for (int k = 0; k < ImageType.Length; k++)
        {
            //获取streamingAssets文件夹下所有的图片路径  
            string[] dirs = Directory.GetFiles(Application.streamingAssetsPath + "/mask", ImageType[k]);
            for (int j = 0; j < dirs.Length; j++)
            {
                Texture2D tx = new Texture2D(100, 100);
                tx.LoadImage(getImageByte(dirs[j]));
                Sprite sprite = Sprite.Create(tx, new Rect(0, 0, tx.width, tx.height), new Vector2(-500, -500));
                sprite.name = Path.GetFileNameWithoutExtension(dirs[j]);
                //将获取的图片加到图片列表中
                maskImageList.Add(sprite);
            }
        }
    }

    private static byte[] getImageByte(string imagePath)
    {
        FileStream files = new FileStream(imagePath, FileMode.Open);
        byte[] imgByte = new byte[files.Length];
        files.Read(imgByte, 0, imgByte.Length);
        files.Close();
        return imgByte;
    }

    #endregion
}

PortVideo(串口控制器)

using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
using UnityEngine;
/// <summary>
/// 串口控制器
/// </summary>
public class PortVideo : MonoBehaviour
{
    PortManagerTest portManagerTest;
    // Start is called before the first frame update
    void Start()
    {
        portManagerTest = new PortManagerTest();
        string[] portArray = portManagerTest.ScanPorts_TryFail();//使用试错函数,可以解决COM被占用问题

        //遍历场景中的所有串口号并输出
        foreach (string port in portArray)
        {
            Debug.Log(port);
        }
        portManagerTest.OpenSerialPort(portArray[0], 9600, Parity.None, 8, StopBits.None);
        //发送数据
        portManagerTest.SendData("12345");
    }

    // Update is called once per frame
    void Update()
    {
        switch (portManagerTest.Num)
        {
            #region 视频部分
            //播放 暂停
            case 2:
                if (!VideoController.GetInstance().VideoRoot.activeSelf)
                    VideoController.GetInstance().OpenVideo();
                break;
            case 3:
                VideoController.GetInstance().DoPlayOrPause(false);
                break;

            //视频关闭
            case 4:
            case 5:
            case 6:
                if (ConfigFile.LoadString("closeVideo") == "1")
                    VideoController.GetInstance().CloseVideo1();
                if (ConfigFile.LoadString("closeVideo") == "2")
                    VideoController.GetInstance().CloseVideo2();
                if (ConfigFile.LoadString("closeVideo") == "3")
                    VideoController.GetInstance().CloseVideo3();
                break;

            //视频切换,上一个,下一个
            case 13:
            case 14:
                if (!VideoController.GetInstance().VideoRoot.activeSelf)
                    VideoController.GetInstance().OpenVideo();
                VideoController.GetInstance().LoadVideo(VideoController.GetInstance().Index, true);
                break;

            最小化视频,最大化视频
            //case 15:
            //    MinOrMaxPanel.MinWin();
            //    break;
            //case 16:
            //    MinOrMaxPanel.MaxWin();
            //    break;

            //音量加减在portManagerTest线程接受里面
            //静音和取消静音
            case 23:
                VideoController.GetInstance().Mute();
                break;
            case 24:
                VideoController.GetInstance().CanelMute();
                break;
            default:

                //循环
                if (ConfigFile.LoadString("loop") == "1")
                    VideoController.GetInstance().DoSetLoop(true);
                else if (ConfigFile.LoadString("loop") == "2")
                    VideoController.GetInstance().isListLoop = true;
                else if (ConfigFile.LoadString("loop") == "3")
                {
                    VideoController.GetInstance().DoSetLoop(false);
                    VideoController.GetInstance().isListLoop = false;
                }

                //视频播放完
                if (ConfigFile.LoadString("finish") == "1" && ConfigFile.LoadString("loop") == "3")
                    VideoController.GetInstance().iSshowBlack = true;
                if (ConfigFile.LoadString("finish") == "4" && ConfigFile.LoadString("loop") == "3")
                    VideoController.GetInstance().IsShowFirst = true;
                if (ConfigFile.LoadString("finish") == "3" && ConfigFile.LoadString("loop") == "3")
                    VideoController.GetInstance().IsShowBGImg = true;
                if (ConfigFile.LoadString("finish") == "2" && ConfigFile.LoadString("loop") == "3")
                    VideoController.GetInstance().IsShowBGVideo = true;

                //是否显示遮罩
                if (ConfigFile.LoadString("showMask") == "1")
                    VideoController.GetInstance().ShowMask();
                if (ConfigFile.LoadString("showMask") == "2")
                    VideoController.GetInstance().DisShowMask();
                break;
        }
        for (int i = 0; i < VideoController.GetInstance().VideoNames.Length; i++)
        {
            if (portManagerTest.Num == i + 51)
            {
                ShowWhereVideo(i);
            }
        }
        #endregion


        portManagerTest.Num = 0;

    }
    void OnApplicationQuit()
    {
        portManagerTest.CloseSerialPort();    //关闭串口
    }

    void ShowWhereVideo(int index)
    {
        if (!VideoController.GetInstance().VideoRoot.activeSelf)
            VideoController.GetInstance().OpenVideo();
        VideoController.GetInstance().LoadVideo(index, true);
        VideoController.GetInstance().Index = index;
    }
}

 PortManagerTest(串口管理器)

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Text;
using System.Threading;
using UnityEngine;
/// <summary>
/// 串口管理器
/// </summary>
public class PortManagerTest
{
    private SerialPort sp;

    #region 扫描端口
    //使用API扫描
    public string[] ScanPorts_API()
    {
        string[] portList = SerialPort.GetPortNames();
        return portList;
    }
    //使用注册表信息扫描
    public string[] ScanPorts_Regedit()
    {
        RegistryKey keyCom = Registry.LocalMachine.OpenSubKey("Hardware\\DeviceMap\\SerialComm");
        string[] SubKeys = keyCom.GetValueNames();
        string[] portList = new string[SubKeys.Length];
        for (int i = 0; i < SubKeys.Length; i++)
        {
            portList[i] = (string)keyCom.GetValue(SubKeys[i]);
        }
        return portList;
    }

    //试错方式扫描
    public string[] ScanPorts_TryFail()
    {
        List<string> tempPost = new List<string>();
        bool mark = false;
        for (int i = 0; i < 10; i++)
        {
            try
            {
                SerialPort sp = new SerialPort("COM" + (i + 1).ToString());
                sp.Open();
                sp.Close();
                tempPost.Add("COM" + (i + 1).ToString());
                mark = true;
            }
            catch (System.Exception)
            {
                continue;
            }

        }
        if (mark)
        {
            string[] portList = tempPost.ToArray();
            return portList;
        }
        else
        {
            return null;
        }
    }
    #endregion

    #region 打开串口/关闭串口
    /// <summary>
    /// 打开串口
    /// </summary>
    /// <param name="_portName">端口号</param>
    /// <param name="_baudRate">波特率</param>
    /// <param name="_parity">校验位</param>
    /// <param name="dataBits">数据位</param>
    /// <param name="_stopbits">停止位</param>
    public void OpenSerialPort(string _portName, int _baudRate, Parity _parity, int dataBits, StopBits _stopbits)
    {
        try
        {
            sp = new SerialPort(_portName, _baudRate, _parity, dataBits, _stopbits);//绑定端口
            sp.Open();
            //使用委托
            //sp.DataReceived += DataReceived;
            //使用线程
            Thread thread = new Thread(new ThreadStart(DataReceived));
            thread.Start();

        }
        catch (Exception ex)
        {
            sp = new SerialPort();
            Debug.Log(ex);
        }
    }

    /// <summary>
    /// 关闭串口
    /// </summary>
    public void CloseSerialPort()
    {
        try
        {
            sp.Close();
            sp.Dispose();
            Debug.Log("关闭端口");
        }
        catch (Exception e)
        {
            Debug.Log(e.Message);
        }
    }
    #endregion

    #region 发送数据
    /// <summary>
    /// 发送数据
    /// </summary>
    /// <param name="_info">string数据</param>
    public void SendData(string _info)
    {
        try
        {
            if (sp.IsOpen)
            {
                sp.WriteLine(_info);
            }
            else
            {
                sp.Open();
                sp.WriteLine(_info);
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
    }
    /// <summary>
    /// 发送数据
    /// </summary>
    /// <param name="send">byte数据</param>
    /// <param name="offSet">起始位</param>
    /// <param name="count">byte长度</param>
    public void SendData(byte[] send, int offSet, int count)
    {
        try
        {
            if (sp.IsOpen)
            {
                sp.Write(send, offSet, count);
            }
            else
            {
                sp.Open();
                sp.Write(send, offSet, count);
            }
        }
        catch (Exception ex)
        {
            Debug.Log(ex);
        }
    }
    #endregion

    #region 接收数据
    /// <summary>
    /// 接收数据 回调函数
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        byte[] ReDatas = new byte[sp.BytesToRead];
        sp.Read(ReDatas, 0, ReDatas.Length);//读取数据
        DataProcessing(ReDatas);//数据处理

    }

    /// <summary>
    /// 接收数据 线程
    /// </summary>
    public void DataReceived()
    {
        while (true)
        {
            if (sp.IsOpen)
            {
                int count = sp.BytesToRead;
                if (count > 0)
                {
                    byte[] readBuffer = new byte[count];
                    try
                    {
                        sp.Read(readBuffer, 0, count);
                        DataProcessing(readBuffer);//数据处理

                        //播放
                        if (num == 2)
                            VideoController.GetInstance().mediaPlayer.Control.Play();

                        //上一个,下一个视频
                        if (num == 13)
                            VideoController.GetInstance().LastVideoCK(VideoController.GetInstance().Index);
                        if (num == 14)
                            VideoController.GetInstance().NextVideoCK(VideoController.GetInstance().Index);

                        //ppt上一页,下一页
                        if (num == 36)
                            LoadPPT.GetInstance().ToLastOrNext(LoadPPT.GetInstance().Index, false);
                        if (num == 37)
                            LoadPPT.GetInstance().ToLastOrNext(LoadPPT.GetInstance().Index, true);

                        if (num == 42)
                            LoadPPT.GetInstance().ImgToLastOrNext(LoadPPT.GetInstance().ImgIndex, false);
                        if (num == 43)
                            LoadPPT.GetInstance().ImgToLastOrNext(LoadPPT.GetInstance().ImgIndex, true);

                        //音量加减,大小只能在内部调节
                        if (num == 17)
                            VideoController.GetInstance().VolumeAdd(5);
                        else if (num == 18)
                            VideoController.GetInstance().VolumeAdd(10);
                        else if (num == 19)
                            VideoController.GetInstance().VolumeAdd(15);
                        else if (num == 20)
                            VideoController.GetInstance().VolumeSub(5);
                        else if (num == 21)
                            VideoController.GetInstance().VolumeSub(10);
                        else if (num == 22)
                            VideoController.GetInstance().VolumeSub(15);
                    }
                    catch (Exception ex)
                    {
                        Debug.Log(ex.Message);
                    }
                }
            }
            Thread.Sleep(10);
        }
    }
    /// <summary>
    /// 数据处理
    /// </summary>
    /// <param name="data">字节数组</param>
    int num;
    string name;

    public int Num { get => num; set => num = value; }
    public string Name { get => name; set => name = value; }

    public void DataProcessing(byte[] data)
    {
        //将字节流转换成字符串
        //Encoding gb2312;
        //gb2312 = Encoding.GetEncoding("gb2312");
        //name = gb2312.GetString(data);
        //num = int.Parse(gb2312.GetString(data));

        num = int.Parse(Encoding.ASCII.GetString(data));
        //for (int i = 0; i < data.Length; i++)
        //{
        //    //str += data[i].ToString();
        //    int asciicode = (int)(data[i]);
        //    str += Convert.ToString(asciicode);//字符串ASCIIstr2 为对应的ASCII字符串

        //}
        Debug.Log(num);
    }
    #endregion



}

 三:unity效果演示

1、指令截图

 2、效果演示

猜你喜欢

转载自blog.csdn.net/shijinlinaaa/article/details/132669611