UWP C # UART RS485 Проблема с коммуникацией - PullRequest
0 голосов
/ 22 января 2019

Я тестировал RaspberryPi3 с Windows IoT Core для связи с моим существующим оборудованием FreeScale через RS485. Я использовал SerialUART образец в качестве справки. После того, как мой UWP успешно запустил порт UART, я, похоже, не смог получить данные RS485, переданные моим оборудованием.

Мое аппаратное оборудование RS485 UART настроено на скорости 4800 бод, 8-битный формат данных, режим без проверки на четность и режим остановки в режиме ожидания отключен. Мне удалось успешно инициализировать 4800-8-none-one на образце UWP, но данные, передаваемые аппаратным обеспечением, не запускаются и не отображаются на Read Data text block. Данные, передаваемые с моего оборудования, записаны в шестнадцатеричном формате F5-01-55-4B

Ошибка при передаче. An exception error appear.

Схема RS485 работает следующим образом. enter image description here

Пожалуйста, сообщите, я что-то упустил? Спасибо.

1 Ответ

0 голосов
/ 24 января 2019

Вы можете обратиться к следующему коду.Обратите внимание, что метод ReadString требует длины «кодовых единиц» для чтения.По этой причине каждой строке предшествует ее длина, когда она «на проводе».В вашем сценарии вы не могли убедиться, что данные передаются с аппаратного обеспечения в единицу кода.Я не уверен, что показ данных в шестнадцатеричном формате в TextBox приемлем для вас.

    private async Task ReadAsync(CancellationToken cancellationToken)
    {
        Task<UInt32> loadAsyncTask;

        uint ReadBufferLength = 1024;

        // If task cancellation was requested, comply
        cancellationToken.ThrowIfCancellationRequested();

        // Set InputStreamOptions to complete the asynchronous read operation when one or more bytes is available
        dataReaderObject.InputStreamOptions = InputStreamOptions.Partial;

        using (var childCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken))
        {
            // Create a task object to wait for data on the serialPort.InputStream
            loadAsyncTask = dataReaderObject.LoadAsync(ReadBufferLength).AsTask(childCancellationTokenSource.Token);

            // Launch the task and wait
            UInt32 bytesRead = await loadAsyncTask;
            if (bytesRead > 0)
            {
                //rcvdText.Text = dataReaderObject.ReadString(bytesRead);
                var bufferArray = dataReaderObject.ReadBuffer(bytesRead).ToArray();
                var content = string.Empty;
                foreach(var b in bufferArray)
                {
                    content += Convert.ToString(b,16).ToUpper() + " ";
                }

                rcvdText.Text = content;
                status.Text = "bytes read successfully!";
            }
        }
    }
...