unity串口通讯总结

1.要将playersetting下的optimization中的api COmpatibility Level设置为.net2.0才可实现serialport的new

2.在unity中对于serialport自带的datareceived方法是无法启用的,接收数据需要自己写

3.为了不影响主线程main-主要负责UI数据处理,对于串口数据的处理最好和主线程数据处理分开

4.串口数据处理时,数据的接收和数据处理也是最好分开处理,这是为了防止数据丢失(接收的数据快,处理数据慢)

5.如果开启线程不当可能会引起unity崩溃,如果是出现unity需要调试算是比较严重的情况了,重装unity或者重启机子都无法解决,现在针对出现这种情况做个总结:

(1)启动unity时按住alt,打开另一个工程

(2)打开任何项目都会崩时,删除C:\ProgramData\unity下面的文件(或者卸载的时候删除)

(3)如果都无法解决,只能看是否机子是否中毒了

6.数据接收和数据处理参考代码:

void Start () 

{

    //设置com的portname、baudrate、parity、databits、stopbits

     sp = new SerialPort(comname, 115200, Parity.Even, 8, StopBits.One);

     if(!sp.IsOpen)

     {

         sp.Open();

        //com写入数据和读取数据的时间限制

         sp.WriteTimeout = 300;

         sp.ReadTimeout = 300;

     }

    

     receCOMData = new Thread(ReceCOMData);

     receCOMData.Start();

     dealCOMData = new Thread(DealCOMData);

     dealCOMData.Start();

}

void Update () 

{

    //将Update中的内容设置成5帧执行一次,以防刷新过多反而影响性能

     if(Time.frameCount % 5 == 0)

     {

         SendSeiralPortData("S");

    

          if(!receCOMData.IsAlive)

          {

              receCOMData = new Thread(ReceCOMData);

             receCOMData.Start();

          }

           if(!dealCOMData.IsAlive)

          {

             dealCOMData = new Thread(DealCOMData);

              dealCOMData.Start();

         }

     }

     cube.localRotation = quat;

}

private void SendSeiralPortData(string data)

{

    if(sp.IsOpen)

    {

        //sp.DiscardInBuffer();

        //sp.DiscardOutBuffer();

        sp.WriteLine(data);

    }

}


private void ReceCOMData()

    {  

        while(sp.IsOpen)

        {

             readstr = sp.ReadLine();

            // readstr = sp.ReadTo("\n");

            // sp.DiscardInBuffer();

            // queueDataPool.Enqueue(readstr);

             Debug.Log(readstr);

        }

    }

    private void DealCOMData() 

    { 

         while(sp.IsOpen)

        {

             DealWithReceiveData(readstr);

            // if(queueDataPool.Count != 0) 

            // { 

                    // strOutPool = queueDataPool.Dequeue();

                    // if(strOutPool.Length == 61)//其中的61可以重新设置为需要的数值

                    // {

                            // DealWithReceiveData(strOutPool); 

                    // }

            // }

         }

    } 

private void DealWithReceiveData(string data)

{

    //对数据进一步处理

}

你可能感兴趣的:(Unity3D)