Строка не содержит символов даже после проверки с помощью оператора if - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь прочитать данные датчика в Unity.Для этого я использую TCP-сервер на ESP32, отправляя данные в json.Я сейчас пытаюсь разобрать полученные данные в сериализуемый объект.В настоящее время я читаю данные с сервера, пока не получу заключительную скобку "}" как очень элементарную проверку допустимого json в качестве отправной точки.

Теперь я не могу найти свою ошибку.Я запускаю поток в классе, который работает в фоновом режиме и постоянно читает сервер для новых значений.Но почему-то я не могу успешно объединить строку, которая должна быть проверена на наличие символа "}".

Мой код пока:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Net.Sockets;
using System.Threading;

[Serializable]
public class SensorData
{
    public int capacity;
}

public class MugSensorRead : MonoBehaviour 
{
    TcpClient client = new TcpClient();
    const string IP = "192.168.137.50";
    const int PORT = 5000;

    public SensorData sensorData;
    public int capacity;

    bool _threadRunning;
    Thread _thread;

    // Use this for initialization
    void Start () 
    {
        client.Connect (IP, PORT);  
        _thread = new Thread (updateSensorData);
        _thread.Start ();
    }

    // Update is called once per frame
    void Update () 
    {
        capacity = sensorData.capacity;
    }

    void updateSensorData()
    {
        _threadRunning = true;

        while (_threadRunning) 
        {
            NetworkStream stream = client.GetStream ();
            string jsonMsg = "";
            bool validJson = false;

            while (!validJson) 
            {
                byte[] inStream = new byte[1024];
                stream.Read (inStream, 0, 1024);
                string jsonData = System.Text.Encoding.ASCII.GetString (inStream);
                jsonMsg = string.Concat (jsonMsg, jsonData);
                if (jsonMsg.Contains("}"))
                {
                    validJson = true;
                    //This part here is executed, but when I print(jsonMsg), it just prints the character "{" which gets transmitted in the first segment
                }
            }
            sensorData = JsonUtility.FromJson<SensorData> (jsonMsg);
        }
        _threadRunning = false;
    }

    void OnDisable()
    {
        if (_threadRunning) 
        {
            _threadRunning = false;
            _thread.Join ();
        }
    }
}

Можете ли вы определить мою ошибку?Я просто не могу увидеть, где мой код не работает.

1 Ответ

0 голосов
/ 15 мая 2018

Ваша ошибка в том, что вы не проверяете, сколько байтов вернуло чтение, и вы добавляете 0 как часть содержимого строки.

Это следует заменить:

    while (!validJson) 
    {
        byte[] inStream = new byte[1024];
        stream.Read (inStream, 0, 1024);
        string jsonData = System.Text.Encoding.ASCII.GetString (inStream);
        jsonMsg = string.Concat (jsonMsg, jsonData);
        if (jsonMsg.Contains("}"))
        {
            validJson = true;
            //This part here is executed, but when I print(jsonMsg), it just prints the character "{" which gets transmitted in the first segment
        }
    }

Это будет правильный код:

    while (!validJson) 
    {
        byte[] inStream = new byte[1024];
        int bytesRead = stream.Read (inStream, 0, 1024);
        string jsonData = System.Text.Encoding.ASCII.GetString (inStream, 0, bytesRead);
        jsonMsg = string.Concat (jsonMsg, jsonData);
        if (jsonMsg.Contains("}"))
        {
            validJson = true;
            //This part here is executed, but when I print(jsonMsg), it just prints the character "{" which gets transmitted in the first segment
        }
    }

0 в массиве преобразуются в байты конца строки, поэтому вы не видите символ '}', потому что раньше были символы конца строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...