英创Linux主板的Python, C#实例简介之一

 2020-9-29 14:19:50     作者:Emtronix    

  本文主要介绍在英创工控主板(ESM8000、ESM7000和ESM6800H)上,采用Python和C#编程,实现文件访问、串口通讯、GPIO和网络通讯的方法。用Python或C#编写的程序,均可通过相应的class库,直接操作这些接口。


  本文的4个demo实例,均采用Visual Studio Code作为基本的编程工具,其代码可在主板 + ESMARC评估底板上运行,其基本的硬件环境采用采用ESM8000工控主板 + 评估底板构成,如下图所示:


esm8000套件侧面2.png


  实例1 – Step1_File:介绍文件读取的基本方法(link to Step1_File)。

  实例2 – Step2_Serial:介绍异步串口UART的应用方法,以ttyS2的收发为例(link to Step2_Serial)。丰富的串口资源是英创工控主板特色之一。

  实例3 – Step3_Gpio:介绍通用数字IO(GPIO)的使用方法(link to Step3_Gpio)。英创工控主板均包含32位GPIO。

  实例4 – Step4_Net:介绍网口的使用方法(link to Step4_Net)。这里网口既可以是常用的RJ45形式以太网口,也可以是SPF接口形式的光纤网口、WiFi无线局域网,以及4G/GPRS广域网接口,英创Linux主板对这些网络都有完善的支持。


Step1_File


  userinfo.txt是英创Linux主板(ESM8000、ESM7000和ESM6800H)的基本配置文件,存放在/mnt/mmc/目录下。读取文件userinfo.txt信息,打印到console;提取eth0网口的IP参数,打印到console。


  测试硬件平台:ESM8000 + ESMARC评估底板,仅使用调试串口。


  Python实现


  首先创建一个新目录,如D:\Python>mkdir Step1_File,然后启动VS Code,打开该目录同时点击“New File”添加文件step1_file.py,并在该文件编写相应的实现代码,如下:


英创Linux主板的Python, C#实例简介之一.png


  代码编写好后,即可直接在ESM8000板卡上直接运行。


  开发中为了方便测试,一般采用文件系统挂载的方式进行,详细的配置和使用的方法请参考ESM8000使用必读中相关介绍(link to 使用必读)。


  在ESM8000 console终端中运行如下命令:

  root@ESM8000#>mount -t nfs -o nfsvers=3 192.168.201.12:/home/zhl/esm8000/python /mnt/nfs

  root@ESM8000#>cd /mnt/nfs/step1_file

  root@ESM8000#>python3 step1_file.py


  即可在终端看到该程序的执行结果。


  C#实现


  首先创建一个新目录,如D:\CSharp>mkdir Step1_File,然后启动VS Code,打开该目录如下:


英创Linux主板的Python, C#实例简介之一.png


  在VS Code的Terminal窗口中执行dotnet new console,创建C# Project,可看到基本程序框架如下:


英创Linux主板的Python, C#实例简介之一.png


  编写代码实现Step1_File要求的功能:


英创Linux主板的Python, C#实例简介之一.png


  执行dotnet publish –r linux-arm64 –self-contained false,编译程序并发布可以在ARM64 CPU架构的Linux系统中运行的代码。


  发布的可执行代码包含在..\Step1_File\bin\Debug\net5.0\linux-arm64\publish\目录下。ESM8000目标机只需挂载开发主机的这个目录,就可以运行这个程序了。


  开发主机若为Linux系统,挂载命令为:

  root@ESM8000#>mount -t nfs -o nfsvers=3 192.168.201.137:/home/x10/esm8000/csharp  /mnt/nfs


  开发主机若为Windows系统,挂载命令为:

  root@ESM8000#>mount -t nfs -o nfsvers=3 192.168.201.14:/d/csharp  /mnt/nfs


  在ESM8000 console运行Step1_File程序:

  root@ESM8000#>cd /mnt/nfs

  root@ESM8000:/mnt/nfs #>./Step1_File/bin/Debug/linux-arm64/publish/Step1_File


  可在console窗口看到Step1_File运行输出的结果。


  Step1_File实现的功能很简单,本例主要是展示C#程序开发的基本流程,特别是它跨平台的特性。


Step2_Serial


  串口(ttyS2,115200-8-N-1)接收后回发,并把接收到的字节数等统计信息显示到console。


  Python实现


  在该例程中需要用pyserial的库文件,ESM8000主板文件系统中已经配置pyserial package,原则上客户在开发主机上编写好如下代码,即可直接在ESM8000上运行。


英创Linux主板的Python, C#实例简介之一.png


  为了在VS Code编辑环境中对导入的python库有在线帮助及联想功能,需在开发主机上也安装python以及pyserial package等。无论是Linux开发主机还是Windows开发主机,都可以通过pip 命令进行安装。这里重点介绍一下Windows主机上VS Code安装方法。


  首先在Windows主机上安装python,直接下载安装即可,这里不再赘述。安装完成后,启动VS code界面中就可看到安装python的版本信息。此时打开Terminal 窗口,运行如下命令:>pip install pyserial


  C#实现


  .NET 5的C#程序的一个特点之一,是系统仅包含.NET Core部分,而具体的应用程序再包含所需的特殊功能包,这样做可使.NET环境保持相对稳定。Step2_Serial对一部串口UART的操作,需要C#的System.IO.Ports类库,可在VS Code的Terminal窗口(D:\CSharp\Step2_Serial>)完成相关类库的添加:

  >dotnet add package System.IO.Ports --version 5.0.0-rc.1.20451.14


  注意有些类库的版本,需要与.NET的版本保持一致。具体的实现代码如下所示:


英创Linux主板的Python, C#实例简介之一.png


  编译及发布方法与Step1一样,这里不再赘述。


Step3_Gpio


  Step3_Gpio把ESM8000主板的GPIO8作为输入,GPIO9作为输出。检测到GPIO8的下降沿,就改变GPIO9的输出电平。


  Python实现


  ESM8000共32路GPIO,Step3_gpio.py例程实现的功能是设置相邻的两路GPIO,其中分别为输出和输入,测试时将它们短接,通过读取输入GPIO的状态,观察电平的变化。


  例程可带参数,该参数为GPIO的序号,缺省为0。代码中定义的EM_GPIOs列表实现ESM8000的32位GPIO管脚至iMX8MM系统GPIO的转换。


英创Linux主板的Python, C#实例简介之一.png


  C#实现


  在创建Step3_Gpio工程后,需要添加C#的System.Device.Gpio类库,才能实现对GPIO的操作。在Linux平台,System.Device.Gpio类库依赖于libgpiod库。添加类库的操作也是在VS Code的Terminal窗口(D:\CSharp\Step3_Gpio>)完成:

  dotnet add package System.Device.Gpio --version 1.1.0-prerelease.20276.1


  代码中用class Esm8000Gpio类来实现ESM8000的32位GPIO管脚至iMX8MM系统GPIO的转换。


英创Linux主板的Python, C#实例简介之一.png


  接着就可以定义相关的对象了,每位GPIO都有自己的Controller,在构造函数中需要与Linux平台的libgpiod驱动联系在一起。


英创Linux主板的Python, C#实例简介之一.png


  对Linux平台,System.Device.Gpio实现了对输入事件回调函数响应功能,正好应用到本实例中。主循环检查事件计数器,并根据结果来驱动GPIO9电平翻转。


英创Linux主板的Python, C#实例简介之一.png


  实际应用程序可根据实际需求,在回调函数中实现更多复杂的功能。


Step4_Net


  TCP(Port No = 6000)接收后回发,并把接收到的字节数等统计信息显示到console。


  Python实现


  step4_net.py 直接调用socket函数启动tcp 服务器模式,代码如下:


英创Linux主板的Python, C#实例简介之一.png


  C#实现


  C#的网络通讯功能需要System.Net.Sockets类库,.NET Core已包含该库,也认可从NuGet下载最新版本的库。具体的实现代码如下:


英创Linux主板的Python, C#实例简介之一.png


  值得一提的是,应用程序是在Socket层面操作网络接口,与具体的网络接口形式无关,即网络接口可以是最基本的RJ45形式的以太网口,也可以是WiFi接口、4G/GPRS无线接口等等。在传统的WinCE平台上,由于微软对WiFi等新的网络接口支持不够,限制了CE平台在这方面的应用,而在Linux平台上,对各种网络接口都有很好的支持,为使用C#的客户迁移到Linux平台提供了重要的支撑。