本文主要介紹在英創(chuàng)工控主板(ESM8000、ESM7000和ESM6800H)上,采用Python和C#編程,實(shí)現(xiàn)文件訪問、串口通訊、GPIO和網(wǎng)絡(luò)通訊的方法。用Python或C#編寫的程序,均可通過相應(yīng)的class庫,直接操作這些接口。
本文的4個(gè)demo實(shí)例,均采用Visual Studio Code作為基本的編程工具,其代碼可在主板 + ESMARC評(píng)估底板上運(yùn)行,其基本的硬件環(huán)境采用采用ESM8000工控主板 + 評(píng)估底板構(gòu)成,如下圖所示:
實(shí)例1 – Step1_File:介紹文件讀取的基本方法(link to Step1_File)。
實(shí)例2 – Step2_Serial:介紹異步串口UART的應(yīng)用方法,以ttyS2的收發(fā)為例(link to Step2_Serial)。豐富的串口資源是英創(chuàng)工控主板特色之一。
實(shí)例3 – Step3_Gpio:介紹通用數(shù)字IO(GPIO)的使用方法(link to Step3_Gpio)。英創(chuàng)工控主板均包含32位GPIO。
實(shí)例4 – Step4_Net:介紹網(wǎng)口的使用方法(link to Step4_Net)。這里網(wǎng)口既可以是常用的RJ45形式以太網(wǎng)口,也可以是SPF接口形式的光纖網(wǎng)口、WiFi無線局域網(wǎng),以及4G/GPRS廣域網(wǎng)接口,英創(chuàng)Linux主板對這些網(wǎng)絡(luò)都有完善的支持。
userinfo.txt是英創(chuàng)Linux主板(ESM8000、ESM7000和ESM6800H)的基本配置文件,存放在/mnt/mmc/目錄下。讀取文件userinfo.txt信息,打印到console;提取eth0網(wǎng)口的IP參數(shù),打印到console。
測試硬件平臺(tái):ESM8000 + ESMARC評(píng)估底板,僅使用調(diào)試串口。
Python實(shí)現(xiàn)
首先創(chuàng)建一個(gè)新目錄,如D:\Python>mkdir Step1_File,然后啟動(dòng)VS Code,打開該目錄同時(shí)點(diǎn)擊“New File”添加文件step1_file.py,并在該文件編寫相應(yīng)的實(shí)現(xiàn)代碼,如下:
代碼編寫好后,即可直接在ESM8000板卡上直接運(yùn)行。
開發(fā)中為了方便測試,一般采用文件系統(tǒng)掛載的方式進(jìn)行,詳細(xì)的配置和使用的方法請參考ESM8000使用必讀中相關(guān)介紹(link to 使用必讀)。
在ESM8000 console終端中運(yùn)行如下命令:
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
即可在終端看到該程序的執(zhí)行結(jié)果。
C#實(shí)現(xiàn)
首先創(chuàng)建一個(gè)新目錄,如D:\CSharp>mkdir Step1_File,然后啟動(dòng)VS Code,打開該目錄如下:
在VS Code的Terminal窗口中執(zhí)行dotnet new console,創(chuàng)建C# Project,可看到基本程序框架如下:
編寫代碼實(shí)現(xiàn)Step1_File要求的功能:
執(zhí)行dotnet publish –r linux-arm64 –self-contained false,編譯程序并發(fā)布可以在ARM64 CPU架構(gòu)的Linux系統(tǒng)中運(yùn)行的代碼。
發(fā)布的可執(zhí)行代碼包含在..\Step1_File\bin\Debug\net5.0\linux-arm64\publish\目錄下。ESM8000目標(biāo)機(jī)只需掛載開發(fā)主機(jī)的這個(gè)目錄,就可以運(yùn)行這個(gè)程序了。
開發(fā)主機(jī)若為Linux系統(tǒng),掛載命令為:
root@ESM8000#>mount -t nfs -o nfsvers=3 192.168.201.137:/home/x10/esm8000/csharp /mnt/nfs
開發(fā)主機(jī)若為Windows系統(tǒng),掛載命令為:
root@ESM8000#>mount -t nfs -o nfsvers=3 192.168.201.14:/d/csharp /mnt/nfs
在ESM8000 console運(yùn)行Step1_File程序:
root@ESM8000#>cd /mnt/nfs
root@ESM8000:/mnt/nfs #>./Step1_File/bin/Debug/linux-arm64/publish/Step1_File
可在console窗口看到Step1_File運(yùn)行輸出的結(jié)果。
Step1_File實(shí)現(xiàn)的功能很簡單,本例主要是展示C#程序開發(fā)的基本流程,特別是它跨平臺(tái)的特性。
串口(ttyS2,115200-8-N-1)接收后回發(fā),并把接收到的字節(jié)數(shù)等統(tǒng)計(jì)信息顯示到console。
Python實(shí)現(xiàn)
在該例程中需要用pyserial的庫文件,ESM8000主板文件系統(tǒng)中已經(jīng)配置pyserial package,原則上客戶在開發(fā)主機(jī)上編寫好如下代碼,即可直接在ESM8000上運(yùn)行。
為了在VS Code編輯環(huán)境中對導(dǎo)入的python庫有在線幫助及聯(lián)想功能,需在開發(fā)主機(jī)上也安裝python以及pyserial package等。無論是Linux開發(fā)主機(jī)還是Windows開發(fā)主機(jī),都可以通過pip 命令進(jìn)行安裝。這里重點(diǎn)介紹一下Windows主機(jī)上VS Code安裝方法。
首先在Windows主機(jī)上安裝python,直接下載安裝即可,這里不再贅述。安裝完成后,啟動(dòng)VS code界面中就可看到安裝python的版本信息。此時(shí)打開Terminal 窗口,運(yùn)行如下命令:>pip install pyserial
C#實(shí)現(xiàn)
.NET 5的C#程序的一個(gè)特點(diǎn)之一,是系統(tǒng)僅包含.NET Core部分,而具體的應(yīng)用程序再包含所需的特殊功能包,這樣做可使.NET環(huán)境保持相對穩(wěn)定。Step2_Serial對一部串口UART的操作,需要C#的System.IO.Ports類庫,可在VS Code的Terminal窗口(D:\CSharp\Step2_Serial>)完成相關(guān)類庫的添加:
>dotnet add package System.IO.Ports --version 5.0.0-rc.1.20451.14
注意有些類庫的版本,需要與.NET的版本保持一致。具體的實(shí)現(xiàn)代碼如下所示:
編譯及發(fā)布方法與Step1一樣,這里不再贅述。
Step3_Gpio把ESM8000主板的GPIO8作為輸入,GPIO9作為輸出。檢測到GPIO8的下降沿,就改變GPIO9的輸出電平。
Python實(shí)現(xiàn)
ESM8000共32路GPIO,Step3_gpio.py例程實(shí)現(xiàn)的功能是設(shè)置相鄰的兩路GPIO,其中分別為輸出和輸入,測試時(shí)將它們短接,通過讀取輸入GPIO的狀態(tài),觀察電平的變化。
例程可帶參數(shù),該參數(shù)為GPIO的序號(hào),缺省為0。代碼中定義的EM_GPIOs列表實(shí)現(xiàn)ESM8000的32位GPIO管腳至iMX8MM系統(tǒng)GPIO的轉(zhuǎn)換。
C#實(shí)現(xiàn)
在創(chuàng)建Step3_Gpio工程后,需要添加C#的System.Device.Gpio類庫,才能實(shí)現(xiàn)對GPIO的操作。在Linux平臺(tái),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類來實(shí)現(xiàn)ESM8000的32位GPIO管腳至iMX8MM系統(tǒng)GPIO的轉(zhuǎn)換。
接著就可以定義相關(guān)的對象了,每位GPIO都有自己的Controller,在構(gòu)造函數(shù)中需要與Linux平臺(tái)的libgpiod驅(qū)動(dòng)聯(lián)系在一起。
對Linux平臺(tái),System.Device.Gpio實(shí)現(xiàn)了對輸入事件回調(diào)函數(shù)響應(yīng)功能,正好應(yīng)用到本實(shí)例中。主循環(huán)檢查事件計(jì)數(shù)器,并根據(jù)結(jié)果來驅(qū)動(dòng)GPIO9電平翻轉(zhuǎn)。
實(shí)際應(yīng)用程序可根據(jù)實(shí)際需求,在回調(diào)函數(shù)中實(shí)現(xiàn)更多復(fù)雜的功能。
TCP(Port No = 6000)接收后回發(fā),并把接收到的字節(jié)數(shù)等統(tǒng)計(jì)信息顯示到console。
Python實(shí)現(xiàn)
step4_net.py 直接調(diào)用socket函數(shù)啟動(dòng)tcp 服務(wù)器模式,代碼如下:
C#實(shí)現(xiàn)
C#的網(wǎng)絡(luò)通訊功能需要System.Net.Sockets類庫,.NET Core已包含該庫,也認(rèn)可從NuGet下載最新版本的庫。具體的實(shí)現(xiàn)代碼如下:
值得一提的是,應(yīng)用程序是在Socket層面操作網(wǎng)絡(luò)接口,與具體的網(wǎng)絡(luò)接口形式無關(guān),即網(wǎng)絡(luò)接口可以是最基本的RJ45形式的以太網(wǎng)口,也可以是WiFi接口、4G/GPRS無線接口等等。在傳統(tǒng)的WinCE平臺(tái)上,由于微軟對WiFi等新的網(wǎng)絡(luò)接口支持不夠,限制了CE平臺(tái)在這方面的應(yīng)用,而在Linux平臺(tái)上,對各種網(wǎng)絡(luò)接口都有很好的支持,為使用C#的客戶遷移到Linux平臺(tái)提供了重要的支撐。
成都英創(chuàng)信息技術(shù)有限公司 028-8618 0660