美文网首页
Unity3D中使用SerialPort类实现简单的串口通信

Unity3D中使用SerialPort类实现简单的串口通信

作者: 沙克大 | 来源:发表于2017-04-16 00:34 被阅读0次

    背景

    我用Arduino写的一个小东西需要与Unity进行数据的交换,通过C#的SerialPort类可以实现串口数据的读取和发送。

    Arduino程序

    方便起见,写两个最简单的例子。第一个只输出数字,第二个只读取数值analgoWrite给小灯泡模拟呼灯效果。

    int i =0;
    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      if(i == 350)
        i = 0;
      Serial.println(i++);
    }
    
    int light = 11;
    void setup() {
      // put your setup code here, to run once:
      pinMode(light,OUTPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
      if(Serial.available()>0)
        analogWrite(light,Serial.read());
    }
    

    SerialPort的使用

    1.首先需要对Unity进行设置,Edit->Project Settings->Player,找到Api Compatibility Level,将默认的.NET 2.0 Subset改为.NET 2.0。否则会在之后的import时找不到System.IO.Ports。

    2.开始码代码。

        private SerialPort sp;
        private Thread receiveThread;  //用于接收消息的线程
        private Thread sendThread;     //用于发送消息的线程
    

    先写一个openPort的方法,在Start()中调用。

        sp = new SerialPort("COM4", 9600);  //这里的"COM4"是我的设备,可以在设备管理器查看。
                                            //9600是默认的波特率,需要和Arduino对应,其它的构造参数可以不用配置。
        sp.ReadTimeout = 500;
        sp.Open();
    

    再写一个StartThread的方法,启动接受和发送数据的线程,根据调试的需要注释掉一部分即可。

        receiveThread = new Thread(ReceiveThread);
        receiveThread.IsBackground = true;
        receiveThread.Start();
        sendThread = new Thread(SendThread);
        sendThread.IsBackground = true;
        sendThread.Start();
    

    接下来就是两个简单的线程

        private void SendThread()
        {
            while (true)
            {
                Thread.Sleep(20);
                this.sp.DiscardInBuffer();
                if (i > 255)
                    i = 0;
                sp.WriteLine(i++.ToString());
                Debug.Log(i++.ToString());
            }
        }
        private void ReceiveThread()
        {
            while (true)
            {
                if(this.sp != null && this.sp.IsOpen)
                {
                    try
                    {
                        String strRec = sp.ReadLine();            //SerialPort读取数据有多种方法,我这里根据需要使用了ReadLine()
                        Debug.Log("Receive From Serial: " +strRec);
                    }
                    catch
                    {
                        //continue;
                    }
                }
            }
        }
    

    最后就可以开始调试了,为了方便我写的Arduino程序中读取和写入是分开的,所以在Unity中的测试分两次进行。呼灯的效果省略

    Receive Send

    吐槽

    看很多大神需要处理的数据很多,需要read Byte再做处理,对于简单的的数据处理还是直接用ReadLine简单粗暴一些。

    相关文章

      网友评论

          本文标题:Unity3D中使用SerialPort类实现简单的串口通信

          本文链接:https://www.haomeiwen.com/subject/fwboattx.html