Ein Artikel zum Erlernen der Kommunikation über die serielle Schnittstelle von Unity/C# (Bilder, Text, Download/Verwendung der virtuellen seriellen Schnittstelle, kann durch persönlichen Unity22-Test realisiert werden)

Unity ist eine leistungsstarke Spiel-Engine. Wir können Unity verwenden, um einige Simulationsanforderungen zu erfüllen, was die Verwendung einer seriellen Schnittstelle erfordert.

Die Standardbibliothek von C# bietet eine serielle Port-API. Ausführliche Informationen finden Sie in der offiziellen Dokumentation von Microsoft:

SerialPort – Der Port

Hier finden Sie eine kurze Einführung in die Verwendung

Bezogen auf den Artikel dieses alten Mannes:

Serielle Kommunikation mit Unity3D (2) --- Führen Sie eine serielle Kommunikation durch

Um das Debuggen zu erleichtern, ist zunächst ein virtueller serieller Port erforderlich. Die Lernversion können Sie hier herunterladen:

https://www.xue51.com/soft/9349.html

Folgen Sie dem Tutorial zum Knacken, öffnen und starten Sie dann die virtuelle serielle Schnittstelle

 Was ich hier verwende, sind die seriellen Ports 1 und 2.

Zum Assistenten für die serielle Schnittstelle muss ich nicht mehr sagen, ich verwende XCOM

 (Beachten Sie, dass dies der serielle Port 1 ist, das sendende Ende. Zum Empfangen müssen wir in unserem Skript den seriellen Port 2 starten.)

Ok, jetzt öffnen Sie Unity, erstellen Sie ein neues Projekt und erstellen Sie ein neues Skript

Es gibt noch eine weitere Sache, die Sie vorbereiten müssen: Sie müssen die NET-Version von Unity auf 2.0 ändern.

Öffnen Sie die Player-Einstellung und stellen Sie die API-Kompatibilitätsstufe in der Konfiguration auf .Net2.0 ein

Wenn Sie 22 Jahre alt sind, wählen Sie .NET Framework

 OK, dann erstellen Sie ein neues Skript

 Für die Initialisierung der seriellen Schnittstelle habe ich es in Awake() geschrieben. Es sollte auch funktionieren, wenn ich es in start() geschrieben habe.

    public SerialPort uart;
    void Awake()
    {
        uart = new SerialPort
        {
            PortName = "COM2",//串口号
            BaudRate = 115200,//波特率
            DataBits = 8,//数据位
            StopBits = StopBits.One,//停止位
            Parity = Parity.None,//验证位
            DtrEnable = true,
            RtsEnable = true,
            ReadTimeout = 1000
        };
        
        uart.Open();//启动串口
        
        Thread recT = new Thread(SerialPort_DataReceived);
        recT.IsBackground = true;
        recT.Start();
    }

Wir verwenden die Update()-Methode nicht zum Empfangen. Sie ist zu langsam. Sie wird nur einmal pro Frame ausgeführt. Wir müssen einen separaten Thread öffnen. Hier ist einer.

public void SerialPort_DataReceived()
    {

        while (true)
        {
            if (uart.IsOpen)
            {
                var length = uart.BytesToRead;//获取接收字符串长度
                if (length > 0)//大于0的话才会接收
                {
                    byte[] bytestest = new byte[length];
                    uart.Read(bytestest, 0, length);
                    Debug.Log(System.Text.Encoding.UTF8.GetString(bytestest));
                    //以日志的形式输出到控制台
                } 
                
            }
        }
    }

Schauen Sie sich den Ausführungseffekt an:

 Sie können sehen, dass die Zeichenfolge empfangen wurde

Jetzt gibt es noch eine andere Frage. Wenn wir eine Simulation durchführen, ist die Sendegeschwindigkeit sehr hoch. In diesem Fall können wir 10 ms verwenden, um regelmäßig zu senden und zu sehen, was passiert:

 Sie können sehen, dass die empfangene Zeichenfolge abgeschnitten ist, weil die Sendegeschwindigkeit zu hoch ist.

Hier können Sie die von SerialPort bereitgestellte ReadTo-Methode verwenden

 Die Empfangsfunktion kann wie folgt geändert werden:

 public void SerialPort_DataReceived()
    {
        while (true)
        {
            if (uart.IsOpen)
            {
                var length = uart.BytesToRead;
                if (length > 0)
                {
                    Debug.Log(uart.ReadTo("E"));
                    uart.DiscardInBuffer();
                } 
            }
        }
    }

Ich habe hier E als Endzeichen festgelegt

Beachten Sie, dass Sie DiscardInBuffer() verwenden müssen, um den Puffer zu löschen, andernfalls wird eine Timeout-Ausnahme gemeldet.

Schauen wir uns den Effekt an:

 Es sind keine Kürzungsprobleme aufgetreten.

Ich hoffe, es kann etwas helfen

おすすめ

転載: blog.csdn.net/qq_38830492/article/details/131430581