背景
我用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。
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中的测试分两次进行。呼灯的效果省略
Receive Send吐槽
看很多大神需要处理的数据很多,需要read Byte再做处理,对于简单的的数据处理还是直接用ReadLine简单粗暴一些。
网友评论