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


背景

我用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。

Unity3D中使用SerialPort类实现简单的串口通信_第1张图片

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中的测试分两次进行。呼灯的效果省略

Unity3D中使用SerialPort类实现简单的串口通信_第2张图片
Receive
Unity3D中使用SerialPort类实现简单的串口通信_第3张图片
Send

吐槽

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

你可能感兴趣的:(Unity3D中使用SerialPort类实现简单的串口通信)