Последовательный порт C#: чтение выходных данных со встроенного устройства Linux.

Мне поручено написать приложение C# WPF для подключения к плате разработки Google Coral через порт отладки и потоковой передачи всех данных, которые плата выводит на экран Windows (например, TextBlock).

Я подписан на эта ссылка Microsoft для событий чтения. На данный момент, после того, как я устанавливаю соединение с платой, я вижу выходные данные в своем текстовом блоке, но они не в читаемом текстовом формате.

Что я ожидал:

U-Boot SPL 2019.04.1 (Jan 11 2021 - 20:43:00 +0000)
power_bd71837_init
Board id: 0
DDRINFO: start DRAM init
DDRINFO:ddrphy calibration done
DDRINFO: ddrmix config done
Normal Boot
Trying to boot from MMC1
hdr read sector 300, count=1


U-Boot 2019.04.1 (Jan 11 2021 - 20:43:00 +0000), Build: jenkins-enterprise.uboot                                                                                                                                                             -imx-1

CPU:   Freescale i.MX8MQ rev2.1 1500 MHz (running at 1000 MHz)
CPU:   Commercial temperature grade (0C to 95C) at 37C
Reset cause: POR
Model: Freescale i.MX8MQ Phanbell
DRAM:  4 GiB
MMC:   FSL_SDHC: 0, FSL_SDHC: 1
Loading Environment from MMC... *** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial

 BuildInfo:
  - ATF
  - U-Boot 2019.04.1

flash target is MMC:0
Net:
Warning: ethernet@30be0000 using MAC address from ROM
eth0: ethernet@30be0000
Fastboot: Normal
Normal Boot
Hit any key to stop autoboot:  0
2065 bytes read in 6 ms (335.9 KiB/s)

Что я на самом деле вижу в TextBlock: введите здесь описание изображения

Я проверяю BaudRate и другие настройки, кажется, все в порядке. Я знаю, что протокол UART отправляет данные как byte, может ли кто-нибудь определить мой вывод, если тип данных неправильный? Если да, то нужно ли читать получение byte и преобразовывать в читаемый текст?

Добавление моего кода

//Port setting
_serialPort.PortName = comPort.Name;
_serialPort.BaudRate = 115200;
_serialPort.Parity = Parity.None;
_serialPort.DataBits = 8;
_serialPort.StopBits = StopBits.One;         
_serialPort.ReadTimeout = 500;
_serialPort.WriteTimeout = 500;

_serialPort.DtrEnable = true;
_serialPort.RtsEnable = true;

// Port Data Receiving method
_serialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
_serialPort.Open();

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            this.Dispatcher.Invoke(() =>
            {
                TextBlock_Output.Text += indata; 
            });
        };

Аппаратное подключение Я подключаю порт отладки Google Coral Board к своему компьютеру с Windows через разъем micro-USB (Coral Board) к USB (компьютер с Windows). Я обычно использую это соединение для отладки через COM-порт через Putty.

Благодарю вас!


person Tony Nguyen    schedule 21.07.2021    source источник
comment
Попробуйте установить как mySerialPort.RtsEnable=true;, так и mySerialPort.DtrEnable=true;. Может быть полезно следующее: stackoverflow.com/questions/65957066/   -  person user9938    schedule 21.07.2021
comment
Вот еще несколько полезных URL-адресов: coral.ai /docs/dev-board/serial-console/#connect-with-windows и coral.ai/docs/dev-board/get-started/#requirements.   -  person user9938    schedule 22.07.2021
comment
@ user9938 Добавление этих настроек, похоже, не решает проблему. Я просмотрел пост и не смог найти решение.   -  person Tony Nguyen    schedule 22.07.2021
comment
@J... Обычно я использую COM-порт (скорость передачи: 115200) для отладки. Добавил в пост свои настройки COM порта. Есть ли способ проверить, является ли это аппаратной проблемой, а не программной?   -  person Tony Nguyen    schedule 22.07.2021
comment
@J... Да. Я также убедился, что он работает с RealTerm (т. е. бод: 115200, четность: нет, биты данных: 8 бит, стоповые биты: 1 бит, аппаратное управление потоком: нет)   -  person Tony Nguyen    schedule 22.07.2021
comment
@J... Да, я не изменил свойство _serialPort.Encoding. Я считаю, что этот пост имеет отношение к моей проблеме: stackoverflow.com/questions/18698292/   -  person Tony Nguyen    schedule 22.07.2021
comment
Вы установили драйвер, как описано в одном из URL-адресов, которые я разместил?   -  person user9938    schedule 22.07.2021
comment
Я думаю, вам следует написать минимальное приложение — возможно, даже консольное, чтобы доказать, является ли он классом SerialPort или нет. Вы уверены, что не устанавливаете скорость передачи данных где-то еще в своем коде или что-то в этом роде? Если другое приложение может успешно прочитать данные, то нет никаких причин, по которым SerialPort не может этого сделать.   -  person Jonathon Reinhart    schedule 23.07.2021


Ответы (1)


Из документации на всех платформах указано с помощью эмулятора терминала, такого как screen (linux/MacOS) или PuTTy (windows).

эмулятор терминала – это больше, чем просто текстовое поле, а поток данных будет более чем удобочитаемым. символы ANSI. В дополнение к тексту поток данных также будет включать различные управляющие символы или управляющие последовательности, которые используются для указания того, как размещать и отображать текстовый пользовательский интерфейс для пользователя в окне удаленного терминала. Вы не можете использовать простой класс последовательного порта, чтобы воспроизвести это поведение — вам нужен полнофункциональный эмулятор терминала. Как отправитель, вы также должны правильно выводить управляющие символы, чтобы иметь возможность перемещать курсор в окне терминала, отправлять команды копирования/вставки/отмены или другие команды, а также выполнять другие действия пользователя с удаленным экраном.

Существует ряд библиотек, предоставляющих эту функциональность для C#, но рекомендации по одной из них выходят за рамки ответов здесь. Вы также можете написать свой собственный эмулятор терминала, конечно, самостоятельно обрабатывая управляющие последовательности VT100, но это будет значительным упражнением. . В любом случае данные, поступающие в последовательный порт, должны быть проанализированы и интерпретированы, прежде чем вы сможете отобразить текст на экране. Простая печать входящих символов в текстовое поле не сработает.

person J...    schedule 22.07.2021
comment
Да, но символы ASCII все равно должны отображаться как символы ASCII. Я не думаю, что это проблема ОП. - person Jonathon Reinhart; 23.07.2021
comment
@JonathonReinhart Если это не так, то, возможно, это один из тех случаев, когда класс последовательного порта .net просто не работает. Некоторые UART на некоторых скоростях передачи, которые я видел, возвращают подобный мусор в событии DataReceived. Это недостаток в структуре, и вам просто нужно найти обходной путь в этих случаях. В остальном код OP выглядит нормально. В любом случае, также хорошо использовать библиотеку эмулятора терминала. - person J...; 23.07.2021
comment
У меня, конечно, была своя доля SerialPort проблем, но у меня никогда не было проблем с простым получением каких-то достоверных данных, подобных этой. Это похоже на проблему со скоростью передачи данных. - person Jonathon Reinhart; 23.07.2021
comment
@JonathonReinhart OP утверждает, что устранил это. - person J...; 23.07.2021
comment
OP также не опубликовал минимально воспроизводимый пример. - person Jonathon Reinhart; 23.07.2021