UnityとArduinoとのシリアル通信メモ
Arduino
void setup() { Serial.begin(115200); } void loop() { if (Serial.available() > 0) { int i = Serial.read(); if (i == 's') { Serial.println("s incomoing. create over 64.0000000000000000000000000000000098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321"); } else { Serial.println("unknown incoming!!"); } } else { Serial.println("This message is sample."); } delay(100); }
簡易シリアル通信クラス
using System.IO.Ports; using System.Collections.Generic; public class Serial { private SerialPort serial_; private Queue<string> messages_ = new Queue<string>(); private Queue<int> inputs_ = new Queue<int>(); private bool isRunning_; public Serial( string portName, int baudRate = 115200 ) { serial_ = new SerialPort( portName, baudRate, Parity.None, 8, StopBits.One ); serial_.Open(); serial_.DtrEnable = false; serial_.RtsEnable = true; serial_.DiscardInBuffer(); serial_.ReadTimeout = 5; var thread = new System.Threading.Thread( Update ); thread.Start(); } private void Update() { UnityEngine.Debug.LogWarning( "Start Serial" ); isRunning_ = true; while ( isRunning_ ) { try { lock ( inputs_ ) { if ( inputs_.Count > 0 ) { var p = inputs_.Dequeue(); byte[] buffer = new byte[1] { (byte) (p & 0xff) }; serial_.Write( buffer, 0, buffer.Length ); } } var line = serial_.ReadLine(); lock ( messages_ ) { messages_.Enqueue( line ); } } catch ( System.Exception e ) { } } serial_.Close(); serial_ = null; UnityEngine.Debug.LogWarning( "Stop Serial" ); } public string Pop() { lock ( messages_ ) { if ( messages_.Count > 0 ) { return messages_.Dequeue(); } else { return null; } } } public void Send( byte p ) { lock ( inputs_ ) { inputs_.Enqueue( p ); } } public void Stop() { isRunning_ = false; } }
Unityのシーン
using System.Collections; using UnityEngine; public class Main : MonoBehaviour { private Serial serial_; void Start() { if ( serial_ != null ) { serial_.Stop(); } serial_ = new Serial( @"COM3" ); } void Update() { string message = serial_.Pop(); if ( !string.IsNullOrEmpty( message ) ) { Debug.Log( message ); } if ( Input.GetKeyDown( KeyCode.Space ) ) { serial_.Send( (byte) 's' ); } } void OnDestroy() { serial_.Stop(); } }