Считывание последовательного порта "COM3" в Unity. Установление соединения успешно, но DataReceiveHandler не вызывается - PullRequest
2 голосов
/ 12 апреля 2019

Мне нужно отсканировать QR-код (через сканер, а не камеру). Сканер отправляет данные через последовательный порт «COM3», и мне нужно это как строка в Unity. Так что настройка соединения работает нормально и без каких-либо ошибок или исключений, но система не регистрирует мое событие в SerialDataReceivedEventHandler. (См. Код: DataReceiveHandler и все, что в нем есть, кажется, просто нереальным)

Я использую следующие настройки для открытия порта:

PortName является "COM3" BaudRate составляет 19200 PortParity - это None PortBits составляет 8 PortStopBits - это один

Как я уже сказал, порт открывается правильно. Я не получаю ошибок или исключений. Может быть, вы видите то, чего я не вижу. Спасибо!

private void Start()
{
    Init();
}

private void Update()
{
    PortIsOpen = SP.IsOpen;
}

private void EstablishPortConnection()
{
    try
    {
        if(SP != null)
        {
            SP.Close();
            SP.Dispose();
            SP = null;
        }

        if(SP == null)
        {
            SP = new SerialPort(PortName, BaudRate, PortParity, PortBits, PortStopBits);
            SP.RtsEnable = true;
            SP.DataReceived += new        SerialDataReceivedEventHandler(DataRecievedHandler);
            SP.Open();
        }
    }
    catch(Exception _ex)
    {
        Debug.Log("Error while establishing connection! Error: " + _ex);
    }
}

private void DataRecievedHandler(object _sender,   SerialDataReceivedEventArgs _e)
{
    Debug.Log("DataReceived");
    try
    {
        SerialPort tmpsp = (SerialPort)_sender;
        Debug.Log(tmpsp.ReadLine());
        Message = tmpsp.ReadLine();
    }
    catch(Exception _ex)
    {
        Debug.Log("Error during message receiving. Error: " + _ex);
    }
}

public void Init()
{
    Message = "";
    EstablishPortConnection();
}

1 Ответ

0 голосов
/ 12 апреля 2019

Краткий ответ:

Вы не можете использовать обработчик DataReceived в Unity, так как он не реализован в Mono.

Для чтения необходимо выполнить пул портов вручную, поэтому лучше всего запускать его в отдельном потоке (так как пул блокирует). Пожалуйста, смотрите ссылку в комментариях derHugo для получения более подробной информации (любой, у кого есть права на удаление - не стесняйтесь удалять этот ответ, этот вопрос сформулирован лучше, чем оригинальный вопрос, поэтому я подумал, что стоит продублировать ответ)

...