.Net?Core跨平臺(tái)應(yīng)用開發(fā)串口篇HelloArm
引言
為了驗(yàn)證采用dotnet core技術(shù)開發(fā)的物聯(lián)網(wǎng)設(shè)備數(shù)據(jù)采集接入服務(wù)應(yīng)用是否能在高性價(jià)比的linux嵌入式平臺(tái)運(yùn)行,針對(duì)dotnet core應(yīng)用程序進(jìn)行嵌入式linux環(huán)境的發(fā)布部署運(yùn)行驗(yàn)證研究。
硬件環(huán)境
硬件系統(tǒng)經(jīng)過對(duì)比篩選,選用了友善之臂出品的NanoPC-T3 Plus。該控制板為掌上型嵌入式Linux系統(tǒng)迷你PC,采用64位三星arm CPU,具有完善的硬件接口和驅(qū)動(dòng)支持,大于1G的內(nèi)存和8G以上的eMMC閃存,具有較高的性能價(jià)格比。
- NanoPC-T3 Plus是友善之臂專門針對(duì)企業(yè)用戶而設(shè)計(jì),它采用三星八核Cortex -A53架構(gòu)的S5P6818處理器,動(dòng)態(tài)運(yùn)行主頻400M-1.4GHz。NanoPC-T3 Plus配備了16GB的eMMC、音頻接口、視頻輸入/輸出接口等;并且集成了WiFi和藍(lán)牙,增加千兆以太網(wǎng)和電源管理功能,板載陶瓷天線,帶串口調(diào)試功能。為適應(yīng)工業(yè)客戶需要,NanoPC-T3 Plus加裝了標(biāo)配的散熱片,以解決芯片發(fā)熱問題。
- NanoPC-T3 Plus帶兩路視頻輸入,支持DVP 攝像頭及MIPI-CSI攝像頭,并且?guī)穆芬曨l輸出,分別為HDMI 1.4A接口、LVDS接口、并行RGB-LCD接口、MIPI-DSI接口。并且支持RTC,板載備份電池接口,引出四個(gè)USB接口(其中三個(gè)是標(biāo)準(zhǔn)A型接口, 另外一個(gè)是2.54mm排母)等。
- NanoPC-T3 Plus)流暢運(yùn)行Android5.1、Debian、UbuntuCore+Qt等系統(tǒng),內(nèi)核驅(qū)動(dòng)源碼完全開源,接口豐富。
硬件資源特性
- CPU: S5P6818, 運(yùn)行主頻1.4GHz
- 電源管理: 采用一顆ARM® Cortex®-M0單片機(jī)做電源管理, 支持動(dòng)態(tài)調(diào)壓, 軟件關(guān)機(jī)和定時(shí)開機(jī)等功能
- 內(nèi)存: 2GB 32bit DDR3 RAM
- 存儲(chǔ): 1 x microSD 卡槽
- 網(wǎng)絡(luò): Gbit Ethernet(RTL8211E)
- Wireless:802.11 b/g/n
- Bluetooth: 4.0 dual mode
- 天線: Wi-Fi和藍(lán)牙共用, 板載陶瓷天線, 同時(shí)提供IPX接口
- eMMC: 16GB
- 視頻輸入:DVP Camera/MIPI-CSI(雙攝像頭口)
- 視頻輸出:HDMI/LVDS/并行RGB-LCD/MIPI-DSI(四個(gè)視頻輸出接口)
- 音頻:3.5mm耳機(jī)座/Via HDMI
- 麥克風(fēng): 板載麥克風(fēng)
- USB Host: 4 x USB 2.0 Host , 其中三個(gè)是標(biāo)準(zhǔn)A型接口, 另外一個(gè)是2.54mm排母
- Micro USB: 1 x USB 2.0 Client
- LCD接口: 45pin, 0.5mm間距FPC貼片座,支持全彩TFT LCD (RGB:8-8-8)
- HDMI: HDMI 1.4a, Type A型口,1080P高清顯示
- DVP Camera接口: 24pin, 0.5mm間距,F(xiàn)PC貼片豎座
- GPIO擴(kuò)展接口: 30 Pin2.54mm排母, 包含4個(gè)UART, 1路I2C, 1路SPI, 3路PWM,9個(gè)GPIO
- I2S/USB: 2.54mm間距排母
- 調(diào)試串口: 2.54mm間距排針
- 按鍵: 電源按鍵, 復(fù)位按鍵, 啟動(dòng)選擇按鍵各一個(gè)
- LED: 1 x power LED and 1 x system LED
- CPU溫度檢測(cè): CPU內(nèi)部集成溫度傳感器
- RTC: 支持RTC, 板上有備份電池接口
- 散熱片螺絲孔:能加螺絲固定的散熱片
- 供電: DC 5V/3A
- PCB Size:100 x 64mm,八層,沉金工藝
- 溫度工作范圍: -40℃ to 80℃
為避免廣告嫌宜,不過多對(duì)設(shè)備進(jìn)行說明(好象難以避免呵,如有此方面問題,請(qǐng)管理員協(xié)助進(jìn)行和諧呵)
在此給出設(shè)備的wiki地址:http://wiki.friendlyarm.com/wiki/index.php/NanoPC-T3_Plus/zh
支持的系統(tǒng)平臺(tái)
廠家提供的系統(tǒng)映像文件支持以下版本系統(tǒng)
- lubuntu-desktop-xenial-4.4-armhf(基于ubuntu16.04的LUbuntu桌面版,32位arm系統(tǒng))
- friendlycore-xenial-4.4-armhf(基于ubuntu16.04的FriendlyCore系統(tǒng),32位arm系統(tǒng))
- friendlycore-xenial-4.4-arm64(基于ubuntu16.04的FriendlyCore系統(tǒng),64位arm系統(tǒng))
- Android5.1系統(tǒng)
FriendlyCore,是一個(gè)沒有X-windows環(huán)境,基于Ubuntu core構(gòu)建的系統(tǒng),使用Qt-Embedded作為圖形界面的輕量級(jí)系統(tǒng),兼容Ubuntu系統(tǒng)軟件源,非常適合于企業(yè)用戶用作產(chǎn)品的基礎(chǔ)OS。
系統(tǒng)除了保留Ubuntu Core的特性以外,還包括以下特性:
- 支持電容和電阻觸摸屏
- 支持WiFi連接
- 支持以太網(wǎng)連接
- 支持藍(lán)牙,已預(yù)裝bluez等相關(guān)軟件包
- 支持音頻播放
- 支持Qt 5.10.0 EGLES和OpenGL ES1.1/2.0
系統(tǒng)平臺(tái)
.NET Core支持的Linux版本
https://docs.microsoft.com/zh-cn/dotnet/core/linux-prerequisites?tabs=netcore2x
.NET Core 2.x 將 Linux 視為一個(gè)操作系統(tǒng)。 支持的 Linux 分發(fā)都對(duì)應(yīng)有一個(gè) Linux 內(nèi)部版本(根據(jù)芯片體系結(jié)構(gòu))。
以下 Linux 發(fā)行版本/版本支持 NET Core 2.x:
- Red Hat Enterprise Linux 7,6 - 64 位(x86_64 或 amd64)
- CentOS 7 - 64 位(x86_64 或 amd64)
- Oracle Linux 7 - 64 位(x86_64 或 amd64)
- Fedora 28、27 - 64 位(x86_64 或 amd64)
- Debian 9(64 位,arm32)、8.7 或更高版本 - 64 位(x86_64 或 amd64)
- Ubuntu 18.04(64 位,arm32)、16.04、14.04 - 64 位(x86_64 或 amd64)
- Linux Mint 18、17 - 64 位(x86_64 或 amd64)
- openSUSE 42.3 或更高版本 - 64 位(x86_64 或 amd64)
- SUSE Enterprise Linux (SLES) 12 Service Pack 2 或更高版本 - 64 位(x86_64 或 amd64)
- Alpine Linux 3.7 或更高版本 - 64 位(x86_64 或 amd64)
系統(tǒng)平臺(tái)選擇
根據(jù).NET Core 2.x對(duì)Linux系統(tǒng)的支持,選擇friendlycore-xenial-4.4-arm64作為系統(tǒng)運(yùn)行平臺(tái)。
下載廠家提供的系統(tǒng)映像文件,對(duì)NanoPC-T3/Plus進(jìn)行系統(tǒng)燒寫,方法詳見WIKI教程.
燒寫主要步驟:
- 1、下載廠家提供的映像文件和燒寫工具win32diskimager(wiki中提供了下載鏈接)
- 2、準(zhǔn)備一張tf卡,格式化為一個(gè)分區(qū)(FAT32)
- 3、運(yùn)行win32diskimager軟件,選擇映像文件,選擇tf卡對(duì)應(yīng)的分區(qū),點(diǎn)擊寫入
- 4、燒寫完成
- 5、將tf卡插入卡座,按信boot鍵給控制板上電(需外接顯示器和鍵盤、鼠標(biāo))
- 6、根據(jù)屏幕提示,將系統(tǒng)安裝至eMMC閃存。
連接嵌入式Linux系統(tǒng)
FriendlyCore系統(tǒng)默認(rèn)支持多種連接方式,可通過外接輸入、輸出設(shè)備(鍵盤/鼠標(biāo)、顯示器)進(jìn)行連接,也可以通過串口終端進(jìn)行連接,也支持通過網(wǎng)絡(luò),使用ssh終端方式進(jìn)行連接。
FriendlyCore系統(tǒng)默認(rèn)配置了兩個(gè)用戶帳戶
普通用戶:
用戶名: pi
密碼: pi
Root用戶:
用戶名: root
密碼: fa
系統(tǒng)開機(jī)默認(rèn)會(huì)以 pi 用戶自動(dòng)登錄,你可以使用 sudo npi-config 命令取消自動(dòng)登錄。
物理連接
NanoPC具有HDMI、TFT顯示接口和USB接口,可以直接連接顯示器、鍵盤/鼠標(biāo)進(jìn)行操作。
串口連接
NanoPC默認(rèn)支持調(diào)試串口做為終端。
通過USB轉(zhuǎn)TTL串口的串口模塊進(jìn)行連接。默認(rèn)通訊參數(shù):115200,N,8,1
軟件可使用任意串口終端工具,如SecureCRT或Windows系統(tǒng)自帶超級(jí)終端。
網(wǎng)絡(luò)連接
可以通SSH工具進(jìn)行網(wǎng)絡(luò)連接,通過網(wǎng)絡(luò)終端的方式訪問。(Win10系統(tǒng)自帶)
FriendlyCore系統(tǒng)網(wǎng)絡(luò)配置默認(rèn)為自動(dòng)獲取IP地址。通過網(wǎng)絡(luò)連接設(shè)備,需要確定設(shè)備的IP地址。
初始IP地址可以通在串口終端模式下輸入ifconfig命令查看,或通過網(wǎng)絡(luò)掃描確定。
確定設(shè)備的IP地址后,可以通ssh命令進(jìn)行終端連接
本次實(shí)驗(yàn)中,我們?cè)O(shè)備的IP地址為172.16.93.74,通過如下命令進(jìn)行網(wǎng)絡(luò)終端接入:
ssh pi@172.16.93.74
根據(jù)提示輸入密碼后,即可成功登入。
.NET Core跨平臺(tái)驗(yàn)證
由于后期主要需要使用的程序功能為網(wǎng)絡(luò)通訊和串口通訊,我們主要針對(duì)目標(biāo)嵌入式linux系統(tǒng)下的網(wǎng)絡(luò)和串口通訊進(jìn)行驗(yàn)證。
本次實(shí)驗(yàn)中,我們先對(duì)串口通訊進(jìn)行驗(yàn)證。
編寫一個(gè)netcore2.x的控制臺(tái)程序,程序?qū)崿F(xiàn)系統(tǒng)信息顯示,串口資源列舉,串口選擇,串口打開/關(guān)閉,串口接收顯示和串口定時(shí)發(fā)送測(cè)試數(shù)據(jù)功能。
驗(yàn)證程序設(shè)計(jì)
采用SerialPort類進(jìn)行串口測(cè)試功能實(shí)現(xiàn)(netcore項(xiàng)目需通過Nuget安裝SerailPort庫)
實(shí)現(xiàn)以下功能:
- 顯示系統(tǒng)平臺(tái)信息
- 串口資源列舉,
- 串口選擇,
- 串口打開
- 串口關(guān)閉
- 串口接收/數(shù)據(jù)顯示
- 串口定時(shí)發(fā)送測(cè)試數(shù)據(jù)
程序較為簡(jiǎn)單,在此貼出部分功能代碼:
顯示系統(tǒng)平臺(tái)信息
串口資源列舉
串口測(cè)試
編譯程序,在window下測(cè)試程序通過。
跨平臺(tái)發(fā)布
因目標(biāo)平臺(tái)為arm64嵌入式linux系統(tǒng),采用以下方式進(jìn)行程序發(fā)布:
在命令行窗口,切換到項(xiàng)目文件夾,運(yùn)行如下命令:
dotnetpublish-rlinux-arm64-cRelease
通過以上命令,得到生成的目標(biāo)平臺(tái)的發(fā)布包,程序文件及相關(guān).netcore運(yùn)行時(shí)依賴均被發(fā)布到項(xiàng)目release\netcoreapp2.2\linux-arm64\publish文件夾中。
遠(yuǎn)程部署
采用scp命令,將發(fā)布文件復(fù)制到目標(biāo)機(jī)器
在windows(win10)系統(tǒng)中,打開控制臺(tái)窗口,輸入scp命令,命令格式如下:
scp –r d:\ubuntu\publish\ pi@172.16.93.74:/home/pi/.
根據(jù)提示輸入用戶密碼,完成文件夾的復(fù)制。
在ssh終端窗口,切換到程序文件夾
cd /home/pi/publish
設(shè)置程序執(zhí)行權(quán)限:
chmod 777 ./HelloArm # HelloArm為測(cè)試程序文件名
輸入./ HelloArm運(yùn)行程序
Linux環(huán)境運(yùn)行.Net Core程序
在普通用戶pi中運(yùn)行程序
程序顯示了系統(tǒng)環(huán)境信息
由于程序啟動(dòng)后調(diào)用了SerialPort.GetPortNames方法,程序未能按預(yù)期執(zhí)行,出現(xiàn)如下信息:
提示信息表明SerialPort類庫僅支持Windows系統(tǒng)平臺(tái),不支持跨平臺(tái)。
至此,.net core程序跨平臺(tái)在linux系統(tǒng)運(yùn)行成功,但串口類庫不支持跨平臺(tái)。
第三方串口類庫
為解決串口類支持問題,查找資料,發(fā)現(xiàn)github上有一個(gè)開源SerialPortStream類庫支持netcore,能夠支持Linux系統(tǒng)。
https://github.com/jcurl/SerialPortStream
該類庫支持windows系統(tǒng)和Linux系統(tǒng),但在Linux系統(tǒng)下運(yùn)行,需要額外編譯目標(biāo)平臺(tái)支持庫并進(jìn)行相關(guān)環(huán)境配置。
Linux串口類庫編譯
You first need to compile the support library libnserial.so for your platform. To do that, you'll need a compiler (e.g. GCC 4.8 or later) and cmake.
在目標(biāo)系統(tǒng)中(FriendlyCore),安裝GCC編譯器和cmake
首先確定網(wǎng)絡(luò)正常連接,能夠訪問互聯(lián)網(wǎng)(需要良好的網(wǎng)絡(luò)環(huán)境)。
執(zhí)行如下命令:
sudo apt-get update
安裝更新GCC
sudo apt-get install gcc
安裝cmake
sudo apt-get install cmake
確保gcc和cmake安裝正常??刹捎妹畈榭窗惭b情況
gcc --version
cmake --version
After cloning the repository, execute the following:
$ git clone https://github.com/jcurl/serialportstream.git
$ cd serialportstream/dll/serialunix
$ ./build.sh
根據(jù)上面的命令,完成類庫的源碼克隆和編譯。
注:類庫linux依賴庫僅需在同一目標(biāo)平臺(tái)編譯一次,其他相同目標(biāo)平臺(tái),復(fù)制并配置依賴庫到目標(biāo)系統(tǒng)即可。
環(huán)境變量配置
Binaries are built and put in the bin folder from where you ran the build script. You can add a reference to LD_LIBRARY_PATH to the library:
$ export LD_LIBRARY_PATH=`pwd`/bin/usr/local/lib:$LD_LIBRARY_PATH
執(zhí)行上述命令,配置類庫目標(biāo)到環(huán)境變量(上述命令為臨時(shí)環(huán)境變量配置,僅當(dāng)前shell有效)
配置全局環(huán)境變量的方法:
vi /etc/profile
在文件的最后一行,增加環(huán)境變量LD_LIBRARY_PATH的配置
保存退出后,執(zhí)行source /etc/profile 刷新環(huán)境變量
注:vi相關(guān)操作,請(qǐng)自行百度或必應(yīng)。
Linux串口測(cè)試
將測(cè)試驗(yàn)證程序中的SerialPort類更換為SerialPortStream類庫(方法、屬性基本兼容),進(jìn)行適當(dāng)?shù)恼{(diào)整,在windows系統(tǒng)上編譯運(yùn)行,通過。
重新發(fā)布Linux系統(tǒng)運(yùn)行版本,進(jìn)行l(wèi)inux系統(tǒng)部署。
采用普通用戶pi登錄
如環(huán)境變量未有效配置,串口類無法正常執(zhí)行,程序執(zhí)行到串口方法調(diào)用處停止。
按Ctrl+C終止程序。
配置好串口類庫所需環(huán)境變量,重新運(yùn)行程序,程序正常運(yùn)行。
如下圖,程序啟動(dòng),列舉出系統(tǒng)有效串口,如下圖所示:
由于pi用戶帳戶權(quán)限原因,程序只顯示了/dev/ttySAC0一個(gè)串口,此串口為系統(tǒng)調(diào)試終端輸出串口。
切換到系統(tǒng)超級(jí)用戶
su root
根據(jù)提示輸入密碼:fa
切換到程序目錄,執(zhí)行測(cè)試程序 ./publish/HelloArm,出現(xiàn)如下界面:
在超級(jí)用戶下,程序列舉出了5個(gè)串口。
通過操作命令,打開指定的串口,開啟接收事件及定時(shí)周期發(fā)送數(shù)據(jù),連接電腦串口(目前大部分電腦已不再提供串口,本實(shí)驗(yàn)通過USB轉(zhuǎn)串口模塊進(jìn)行連接),通過PC端的串口工具軟件同Linux迷你PC主機(jī)進(jìn)行通訊,收發(fā)通訊正常。
配置程序開機(jī)運(yùn)行
在root用戶下,配置/etc/rc.local文件,將程序添加到系統(tǒng)開機(jī)運(yùn)行
vi /etc/rc.local
在exit 0之前增加一行
/home/pi/publish/HelloArm
保存退出,重啟系統(tǒng)
reboot
重啟系統(tǒng)后,調(diào)試串口終端界面中,可以看到程序運(yùn)行的輸出信息,至此,程序配置完成,開機(jī)自動(dòng)運(yùn)行成功。
結(jié)束語
.net core為微軟推出的跨平臺(tái)托管程序框架,具備在非windows系統(tǒng)部署運(yùn)行的能力,但在實(shí)際應(yīng)用中,不能過于想當(dāng)然,以為支持跨平臺(tái)就萬事大吉,以為凡是.net程序就可以順利移植為.net core跨平臺(tái)程序,在實(shí)際應(yīng)用中,需要小心求證,以避免掉進(jìn)計(jì)劃時(shí)間過于理想的大坑(本實(shí)驗(yàn)耗費(fèi)的時(shí)間,遠(yuǎn)超出計(jì)劃時(shí)間呵。串口類庫問題耗費(fèi)了不少時(shí)間,對(duì)Linux系統(tǒng)相關(guān)操作的熟悉,也耗費(fèi)了較多時(shí)間)。
本文中,驗(yàn)證程序是以指定目標(biāo)平臺(tái),無環(huán)境依賴方式進(jìn)行的發(fā)布部署,.net core程序也支持以跨平臺(tái)方式發(fā)布部署,但相關(guān)目標(biāo)平臺(tái)需安裝.net core運(yùn)行時(shí)以及相關(guān)依賴,微軟官方已有詳細(xì)的說明文檔,本文不再贅述。
注:本實(shí)驗(yàn)中,使用了兩種硬件設(shè)備,故截圖有所不同,但系統(tǒng)相同,不影響實(shí)驗(yàn)效果和結(jié)論。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
asp.net下出現(xiàn)其中的組件“訪問被拒絕”的解決方法
asp.net下出現(xiàn)其中的組件“訪問被拒絕”的解決方法...2007-04-04詳解Asp.net web.config customErrors 如何設(shè)置
這篇文章主要介紹了詳解Asp.net web.config customErrors 如何設(shè)置,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02C#中遍歷各類數(shù)據(jù)集合的方法總結(jié)
C#中遍歷各類數(shù)據(jù)集合的方法,這里自己做下總結(jié):枚舉類型、遍歷ArrayList(Queue、Stack)、Winform窗體中的控件、HashTable哈希表等等,具體祥看下文2013-05-05.NET?Core跨平臺(tái)資源監(jiān)控工具CZGL.SystemInfo用法
這篇文章介紹了.NET?Core跨平臺(tái)資源監(jiān)控工具CZGL.SystemInfo的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02.NET實(shí)現(xiàn)可交互的WINDOWS服務(wù)的實(shí)例代碼
那么來看一下如何才能實(shí)現(xiàn)一個(gè)可交互的服務(wù)呢。步驟與實(shí)現(xiàn)基本的服務(wù)一樣2013-03-03