You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity与Arduino通信故障排查:指定端口未打开及SerialPort命名空间缺失问题

Troubleshooting Arduino-Unity Connection Issues: "Port Not Open" & Missing System.IO.Ports

Hey there, let's work through your Arduino-Unity problems step by step—you’ve got two key technical hurdles to fix, plus some clarifications on port naming. Let’s dive in:

1. Fixing the System.IO.Ports Namespace Error

The red underlines you’re seeing happen because .NET Standard 2.0 doesn’t include the System.IO.Ports library by default. Here are two ways to resolve this:

Option 1: Switch to .NET Framework 4.x (Simplest Fix)

Unity’s .NET Framework compatibility includes System.IO.Ports out of the box:

  • Go to Edit > Project Settings > Player
  • Scroll to Other Settings > Configuration > API Compatibility Level
  • Switch the dropdown to .NET Framework 4.x (e.g., .NET Framework 4.8)
  • Restart Unity—your red underlines should disappear immediately.

Option 2: Manually Add the Library (If You Need .NET Standard 2.0)

If you must stick with .NET Standard 2.0, you’ll need to import the required DLL:

  • Locate System.IO.Ports.dll from your .NET SDK installation (typical path on Windows: C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\3.1.0\ref\netcoreapp3.1\System.IO.Ports.dll; adjust for your SDK version/macOS path)
  • Copy this DLL into your Unity project’s Assets/Plugins folder
  • In the Unity Inspector for the DLL, check the platform compatibility boxes for your target system (Windows/macOS/Linux)

2. Fixing the "Specified Port Not Open" Error

This error stems from one of several common issues—let’s eliminate them one by one:

Port Path: Your Format Is Correct (Don’t Worry!)

First, a quick clarification: /dev/cu.usbmodem142401 is the correct port format for macOS/Linux, while COM4 is for Windows. The tutorial you watched used Windows, so their path looks different. This isn’t your core problem, but you do need to confirm you’re using the right port:

  • On macOS, open Terminal and run ls /dev/cu.usbmodem* to list all connected Arduino-style ports
  • Or open the Arduino IDE, go to Tools > Port, and copy the exact port path shown there into your Unity code

Ensure the Port Isn’t Locked by Another Program

If the Arduino IDE (especially the Serial Monitor) is running, it will hog the port, preventing Unity from opening it. Close the Arduino IDE entirely before launching your Unity game.

Fix Permissions (macOS/Linux)

Unity might not have permission to access the serial port:

  • On macOS: Go to System Preferences > Security & Privacy > Privacy > Serial Port, then add Unity to the list of allowed apps. You may need to restart Unity afterward.
  • If that fails, run this Terminal command (replace with your port path):
    sudo chmod 666 /dev/cu.usbmodem142401
    
    Enter your password when prompted—this gives all users read/write access to the port.

Add Error Handling to Your Code

Your current code doesn’t account for failed port openings or bad data, which can hide useful debugging info. Update your code with try-catch blocks and checks:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO.Ports;

public class movingTest : MonoBehaviour {
    SerialPort data_stream = new SerialPort("/dev/cu.usbmodem142401", 19200);
    public string receivedstring;
    public GameObject test_data;
    public Rigidbody rb;
    public float sensitivity = 0.01f;
    public string[] datas;

    void Start() {
        try {
            if (!data_stream.IsOpen) {
                data_stream.Open();
                Debug.Log("Serial port opened successfully!");
            }
        } catch (System.Exception e) {
            Debug.LogError("Failed to open port: " + e.Message);
        }
    }

    void Update() {
        if (data_stream != null && data_stream.IsOpen) {
            try {
                receivedstring = data_stream.ReadLine();
                datas = receivedstring.Split(',');
                
                // Validate data format before parsing
                if (datas.Length == 3) {
                    rb.AddForce(0, 0, float.Parse(datas[0]) * sensitivity * Time.deltaTime, ForceMode.VelocityChange);
                    rb.AddForce(float.Parse(datas[1]) * sensitivity * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
                    transform.Rotate(0, float.Parse(datas[2]), 0);
                } else {
                    Debug.LogWarning("Invalid data received: " + receivedstring);
                }
            } catch (System.Exception e) {
                Debug.LogError("Error reading serial data: " + e.Message);
            }
        } else {
            Debug.LogWarning("Serial port is not open!");
        }
    }

    // Close the port when the object is destroyed
    void OnDestroy() {
        if (data_stream != null && data_stream.IsOpen) {
            data_stream.Close();
        }
    }
}

3. Extra Debugging Tips

  • Test Arduino Serial First: Write a simple Arduino sketch that sends formatted data (e.g., Serial.println("0.5,1.0,0.2");) and verify it works in the Arduino Serial Monitor.
  • Check Baud Rate: Ensure your Unity code’s 19200 matches the Serial.begin(19200) line in your Arduino code—mismatched baud rates cause garbage data or connection failures.
  • Log Received Data: Add Debug.Log("Received: " + receivedstring); to your Update method to confirm Unity is getting the data you expect.

内容的提问来源于stack exchange,提问作者Perynal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:12:49