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)
{
//对数据进一步处理
}