C# 串行端口:从嵌入式 Linux 设备读取输出数据
C# Serial Port: Read output data from an embedded Linux device
我被指派编写一个 C# WPF 应用程序以通过调试端口连接到 Google Coral 开发板,并将开发板输出的所有数据流式传输到 Windows 屏幕(例如 TextBlock ).
我关注 this Microsoft referemce 阅读活动。现在,在我建立与开发板的连接后,我在我的文本块中看到了输出,但它不是可读的文本格式。
我的预期:
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 端口进行调试。
谢谢!
从 documentation 开始,他们表示在所有平台上都使用终端仿真器,例如 screen (linux/MacOS) 或 PuTTy (windows) .
A terminal emulator 不仅仅是一个文本框,数据流也不仅仅是可读的 ANSI 字符。除了文本之外,数据流还将包含各种控制字符或转义序列,用于指示如何在远程终端中向用户布置和呈现基于文本的 UI window。您不能使用普通串行端口 class 来重现此行为 - 您需要一个功能齐全的终端仿真器。作为发送者,您还必须生成正确的控制字符输出,以便能够在终端 window 中移动光标,发送 copy/paste/cancel 或其他命令,并与远程屏幕执行其他用户交互。
存在许多为 C# 提供此功能的库,但推荐一个库超出了此处的答案范围。当然,您也可以 write your own terminal emulator 自己处理 VT100 控制序列,但这将是一项相当大的练习。无论如何,在将文本呈现到屏幕之前,需要对进入串口的数据进行解析和解释。简单地将传入的字符打印到文本框中是行不通的。
我被指派编写一个 C# WPF 应用程序以通过调试端口连接到 Google Coral 开发板,并将开发板输出的所有数据流式传输到 Windows 屏幕(例如 TextBlock ).
我关注 this Microsoft referemce 阅读活动。现在,在我建立与开发板的连接后,我在我的文本块中看到了输出,但它不是可读的文本格式。
我的预期:
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 端口进行调试。
谢谢!
从 documentation 开始,他们表示在所有平台上都使用终端仿真器,例如 screen (linux/MacOS) 或 PuTTy (windows) .
A terminal emulator 不仅仅是一个文本框,数据流也不仅仅是可读的 ANSI 字符。除了文本之外,数据流还将包含各种控制字符或转义序列,用于指示如何在远程终端中向用户布置和呈现基于文本的 UI window。您不能使用普通串行端口 class 来重现此行为 - 您需要一个功能齐全的终端仿真器。作为发送者,您还必须生成正确的控制字符输出,以便能够在终端 window 中移动光标,发送 copy/paste/cancel 或其他命令,并与远程屏幕执行其他用户交互。
存在许多为 C# 提供此功能的库,但推荐一个库超出了此处的答案范围。当然,您也可以 write your own terminal emulator 自己处理 VT100 控制序列,但这将是一项相当大的练习。无论如何,在将文本呈现到屏幕之前,需要对进入串口的数据进行解析和解释。简单地将传入的字符打印到文本框中是行不通的。