网上找了很多资料,找到了很多解决办法,但基本上都不行,最后测试中无意发现了解决办法
1.指定长度后判断长度【可行,但是并不通用】
2.Thread.Sleep(200);放到线程后面【不可行,接收到的数据一样不完整】
3.还有人说放到主线程里就没问题,我把【int datalength = m_serial.BytesToRead;】放到Update里,确实每次接收到的长度都是对的,然后我把代码完整的放入协程里发现会卡。而且接收到的数据还是不完整。这时候我就奇怪了,为什么只运行【int datalength = m_serial.BytesToRead;】这段代码的时候每次长度都是正确的。
4.我就试着在线程里加了一句【Thread.Sleep(20);】,加在【int datalength = m_serial.BytesToRead;】这句代码的后面,发现每次线程获取到的长度不对,但是获取到的内容却是正确的
5.【最终解决方案】:我把【Thread.Sleep(20);】移动到【int datalength = m_serial.BytesToRead;】这句代码的前面,果然,长度和内容都变成完整的了
结论:只要加一句【Thread.Sleep(20);】即可,实际使用发现,还是有时候会不对,我猜测只要分成2段【Thread.Sleep(10);】即可,但是没时间测试了,改天再测
完整代码下载:SerialPortManage.cs
Unity代码正常使用需要依赖以下脚本:LoveNeon.cs