【问题标题】:C# Serial Port: Read output data from an embedded Linux deviceC# 串行端口:从嵌入式 Linux 设备读取输出数据
【发布时间】:2021-07-21 20:24:16
【问题描述】:

我被分配编写一个 C# WPF 应用程序以通过调试端口连接到 Google Coral 开发板,并将开发板输出的所有数据流式传输到 Windows 屏幕(例如 TextBlock)。

我关注this Microsoft referemce 的阅读活动。现在,在我建立与电路板的连接后,我在 Textblock 中看到了输出,但它不是可读的文本格式。

我的预期:

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 中实际看到的内容:

我检查了波特率和其他设置,似乎没有什么不正确的。我知道 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; 
            });
        };

硬件连接 我通过微型 USB(珊瑚板)到 USB(Windows 计算机)将 Google Coral Board 的调试端口连接到我的 Windows 计算机。我通常也使用此连接通过 Putty 通过 COM 端口进行调试。

谢谢!

【问题讨论】:

  • 尝试同时设置mySerialPort.RtsEnable=true;mySerialPort.DtrEnable=true; 以下可能会有所帮助:stackoverflow.com/questions/65957066/…
  • @user9938 添加这些设置似乎并不能解决问题。我查看了帖子,找不到解决方案。
  • @J... 通常,我通过 COM Port (BaudRate: 115200) 进行调试。我在帖子中添加了我的 COM 端口设置。我有什么方法可以检查这是硬件问题而不是软件问题吗?
  • @J... 是的。我还验证了它可以与 RealTerm 一起使用(即波特:115200,奇偶校验:无,数据位:8 位,停止位:1 位,硬件流控制:无)

标签: c# serial-port google-coral


【解决方案1】:

来自documentation,在所有平台上,他们都表示使用终端模拟器,如 screen (linux/MacOS) 或 PuTTy (windows)。

terminal emulator 不仅仅是一个文本框,数据流也不仅仅是可读的 ANSI 字符。除了文本之外,数据流还将包括各种控制字符或转义序列,用于指示如何在远程终端窗口中为用户布置和呈现基于文本的 UI。您不能使用普通的串行端口类来重现此行为 - 您需要一个功能齐全的终端仿真器。作为发送者,您还必须生成正确的控制字符输出,以便能够在终端窗口中移动光标、发送复制/粘贴/取消或其他命令,以及执行与远程屏幕的其他用户交互。

存在许多为 C# 提供此功能的库,但在这里推荐一个超出了答案的范围。当然,您也可以write your own terminal emulator 自己处理 VT100 控制序列,但这将是一个相当大的练习。在任何情况下,进入串行端口的数据都需要被解析和解释,然后才能将文本呈现到屏幕上。简单地将传入的字符打印到文本框是行不通的。

【讨论】:

  • 是的,但 ASCII 字符仍应显示为 ASCII 字符。我不认为这是 OP 的问题。
  • @JonathonReinhart 如果不是这样,那么这可能是 .net 串行端口类为 simply broken 的情况之一。我在 DataReceived 事件中看到某些波特率的 UART 返回像这样的垃圾。这是框架中的一个缺陷,您只需要在这些情况下解决。 OP 的代码看起来还不错。无论如何也可以使用终端仿真器库。
  • 我当然也遇到过SerialPort 的麻烦,但我从来没有遇到过像这样简单地接收某种有效数据的麻烦。 看起来是波特率问题。
  • @JonathonReinhart OP 声称已经消除了这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多