陀螺仪结合Unity姿态孪生Demo演示 硬件使用:MPU6050,MPU9250。 MCU使用:ESP8266。 自备串口TTL读取工具。 固件选择:MicroPython&NodeMCU。 拷贝Assets\ESP8266Program中对应脚本到MCU内存中运行即可,连接串口后,串口收到消息时,打开Unity运行对应程序即可看到陀螺仪模块的姿态孪生(旋转角度会和陀螺仪保持一致)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

119 lines
2.9 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO.Ports;
using System.Threading;
using UnityEngine;
public class UnitySerialPort : MonoBehaviour
{
private SerialPort serialPort;
private Thread readPortData;
public int[] SpeedValueArr;
int ClientCount = 2;
public List<byte> listReceive = new List<byte>();
private void Start()
{
SpeedValueArr = new int[ClientCount];
try
{
serialPort = new SerialPort("COM4", 115200);
serialPort.ReadTimeout = 500;
if (!serialPort.IsOpen)
{
serialPort.Open();
}
readPortData = new Thread(new ThreadStart(readData));
readPortData.IsBackground = true;
readPortData.Start();
}
catch (Exception)
{
throw;
}
}
private void OnDestroy()
{
if (serialPort.IsOpen)
serialPort.Close();
readPortData.Abort();
}
/// <summary>
/// 读取数据
/// </summary>
private void readData()
{
try
{
while (serialPort != null && serialPort.IsOpen)
{
byte addr = Convert.ToByte(serialPort.ReadByte());
serialPort.DiscardInBuffer();
listReceive.Add(addr);
ParseReceive();
PrintData();
print(serialPort.ReadLine());
}
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 打印数据
/// </summary>
void PrintData()
{
string str = string.Empty;
for (int i = 0; i < listReceive.Count; i++)
{
str += listReceive[i].ToString("X2"); //这里只会得到数据 FC
}
string Data = System.Text.Encoding.Default.GetString(listReceive.ToArray());
//print(Data);
}
private void ParseReceive()
{
if (listReceive.Count < ClientCount + 2)
{
return;
}
for (int i = 0; i < ClientCount; i++)
{
SpeedValueArr[i] = listReceive[listReceive.Count - 1 - i]; //这里只会得到数据 252
}
listReceive.RemoveRange(0, ClientCount + 2);
}
void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Debug.Log("???");
try
{
System.Threading.Thread.Sleep(20);
byte[] _data = new byte[serialPort.BytesToRead];
serialPort.Read(_data, 0, _data.Length);
if (_data.Length == 0) { return; }
if (serialPort != null)
{
print(_data);
}
//_serialPort.DiscardInBuffer(); //清空接收缓冲区
}
catch (Exception ex)
{
throw ex;
}
}
}