.Net Core跨平台应用研究-HelloArm(串口篇)

引言

        为了验证采用dotnet core技术开发的物联网设备数据采集接入服务应用是否能在高性价比的linux嵌入式平台运行,针对dotnet core应用程序进行嵌入式linux环境的发布部署运行验证研究。

硬件环境

        硬件系统经过对比筛选,选用了友善之臂出品的NanoPC-T3 Plus。该控制板为掌上型嵌入式Linux系统迷你PC,采用64位三星arm CPU,具有完善的硬件接口和驱动支持,大于1G的内存和8G以上的eMMC闪存,具有较高的性能价格比。 

640?wx_fmt=png

 

  • NanoPC-T3 Plus是友善之臂专门针对企业用户而设计,它采用三星八核Cortex -A53架构的S5P6818处理器,动态运行主频400M-1.4GHz。NanoPC-T3 Plus配备了16GB的eMMC、音频接口、视频输入/输出接口等;并且集成了WiFi和蓝牙,增加千兆以太网和电源管理功能,板载陶瓷天线,带串口调试功能。为适应工业客户需要,NanoPC-T3 Plus加装了标配的散热片,以解决芯片发热问题。

  • NanoPC-T3 Plus带两路视频输入,支持DVP 摄像头及MIPI-CSI摄像头,并且带四路视频输出,分别为HDMI 1.4A接口、LVDS接口、并行RGB-LCD接口、MIPI-DSI接口。并且支持RTC,板载备份电池接口,引出四个USB接口(其中三个是标准A型接口, 另外一个是2.54mm排母)等。

  •  NanoPC-T3 Plus)流畅运行Android5.1、Debian、UbuntuCore+Qt等系统,内核驱动源码完全开源,接口丰富。

硬件资源特性

  • CPU: S5P6818, 运行主频1.4GHz

  • 电源管理: 采用一颗ARM® Cortex®-M0单片机做电源管理, 支持动态调压, 软件关机和定时开机等功能

  • 内存: 2GB 32bit DDR3 RAM

  • 存储: 1 x microSD 卡槽

  • 网络: Gbit Ethernet(RTL8211E)

  • Wireless:802.11 b/g/n

  • Bluetooth: 4.0 dual mode

  • 天线: Wi-Fi和蓝牙共用, 板载陶瓷天线, 同时提供IPX接口

  • eMMC: 16GB

  • 视频输入:DVP Camera/MIPI-CSI(双摄像头口)

  • 视频输出:HDMI/LVDS/并行RGB-LCD/MIPI-DSI(四个视频输出接口)

  • 音频:3.5mm耳机座/Via HDMI

  • 麦克风: 板载麦克风

  • USB Host: 4 x USB 2.0 Host , 其中三个是标准A型接口, 另外一个是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间距,FPC贴片竖座

  • GPIO扩展接口: 30 Pin2.54mm排母, 包含4个UART, 1路I2C, 1路SPI, 3路PWM,9个GPIO

  • I2S/USB: 2.54mm间距排母

  • 调试串口: 2.54mm间距排针

  • 按键: 电源按键, 复位按键, 启动选择按键各一个

  • LED: 1 x power LED and 1 x system LED

  • CPU温度检测: CPU内部集成温度传感器

  • RTC: 支持RTC, 板上有备份电池接口

  • 散热片螺丝孔:能加螺丝固定的散热片

  • 供电: DC 5V/3A

  • PCB Size:100 x 64mm,八层,沉金工艺

  • 温度工作范围: -40℃ to 80℃

 

       为避免广告嫌宜,不过多对设备进行说明(好象难以避免呵,如有此方面问题,请管理员协助进行和谐呵)

       在此给出设备的wiki地址:http://wiki.friendlyarm.com/wiki/index.php/NanoPC-T3_Plus/zh

 

支持的系统平台

       厂家提供的系统映像文件支持以下版本系统

  • lubuntu-desktop-xenial-4.4-armhf(基于ubuntu16.04的LUbuntu桌面版,32位arm系统)

  • friendlycore-xenial-4.4-armhf(基于ubuntu16.04的FriendlyCore系统,32位arm系统)

  • friendlycore-xenial-4.4-arm64(基于ubuntu16.04的FriendlyCore系统,64位arm系统)

  • Android5.1系统

       FriendlyCore,是一个没有X-windows环境,基于Ubuntu core构建的系统,使用Qt-Embedded作为图形界面的轻量级系统,兼容Ubuntu系统软件源,非常适合于企业用户用作产品的基础OS。

       系统除了保留Ubuntu Core的特性以外,还包括以下特性:

  • 支持电容和电阻触摸屏

  • 支持WiFi连接

  • 支持以太网连接

  • 支持蓝牙,已预装bluez等相关软件包

  • 支持音频播放

  • 支持Qt 5.10.0 EGLES和OpenGL ES1.1/2.0

系统平台

.NET Core支持的Linux版本

https://docs.microsoft.com/zh-cn/dotnet/core/linux-prerequisites?tabs=netcore2x

.NET Core 2.x 将 Linux 视为一个操作系统。 支持的 Linux 分发都对应有一个 Linux 内部版本(根据芯片体系结构)。

 

以下 Linux 发行版本/版本支持 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)

系统平台选择

根据.NET Core 2.x对Linux系统的支持,选择friendlycore-xenial-4.4-arm64作为系统运行平台。

下载厂家提供的系统映像文件,对NanoPC-T3/Plus进行系统烧写,方法详见WIKI教程.

烧写主要步骤:

1、下载厂家提供的映像文件和烧写工具win32diskimager(wiki中提供了下载链接)

2、准备一张tf卡,格式化为一个分区(FAT32)

3、运行win32diskimager软件,选择映像文件,选择tf卡对应的分区,点击写入

4、烧写完成

5、将tf卡插入卡座,按信boot键给控制板上电(需外接显示器和键盘、鼠标)

6、根据屏幕提示,将系统安装至eMMC闪存。

 

连接嵌入式Linux系统

FriendlyCore系统默认支持多种连接方式,可通过外接输入、输出设备(键盘/鼠标、显示器)进行连接,也可以通过串口终端进行连接,也支持通过网络,使用ssh终端方式进行连接。

FriendlyCore系统默认配置了两个用户帐户

普通用户:

   用户名: pi

   密码: pi

Root用户:

   用户名: root

   密码: fa

系统开机默认会以 pi 用户自动登录,你可以使用 sudo npi-config 命令取消自动登录。

 

 

物理连接

NanoPC具有HDMI、TFT显示接口和USB接口,可以直接连接显示器、键盘/鼠标进行操作。

 640?wx_fmt=jpeg

 

串口连接

NanoPC默认支持调试串口做为终端。

 640?wx_fmt=png

 

通过USB转TTL串口的串口模块进行连接。默认通讯参数:115200,N,8,1

软件可使用任意串口终端工具,如SecureCRT或Windows系统自带超级终端。

640?wx_fmt=png

 

640?wx_fmt=png

 

 

 

网络连接

可以通SSH工具进行网络连接,通过网络终端的方式访问。(Win10系统自带)

FriendlyCore系统网络配置默认为自动获取IP地址。通过网络连接设备,需要确定设备的IP地址。

初始IP地址可以通在串口终端模式下输入ifconfig命令查看,或通过网络扫描确定。

确定设备的IP地址后,可以通ssh命令进行终端连接

本次实验中,我们设备的IP地址为172.16.93.74,通过如下命令进行网络终端接入:

ssh pi@172.16.93.74

根据提示输入密码后,即可成功登入。

 640?wx_fmt=png

 

.NET Core跨平台验证

由于后期主要需要使用的程序功能为网络通讯和串口通讯,我们主要针对目标嵌入式linux系统下的网络和串口通讯进行验证。

本次实验中,我们先对串口通讯进行验证。

编写一个netcore2.x的控制台程序,程序实现系统信息显示,串口资源列举,串口选择,串口打开/关闭,串口接收显示和串口定时发送测试数据功能。

验证程序设计

采用SerialPort类进行串口测试功能实现(netcore项目需通过Nuget安装SerailPort库)

实现以下功能:

  • 显示系统平台信息

  • 串口资源列举,

  • 串口选择,

  • 串口打开

  • 串口关闭

  • 串口接收/数据显示

  • 串口定时发送测试数据

程序较为简单,在此贴出部分功能代码:

显示系统平台信息

 640?wx_fmt=jpeg

串口资源列举

 640?wx_fmt=jpeg

串口测试

 640?wx_fmt=png

编译程序,在window下测试程序通过。

 640?wx_fmt=png

 

跨平台发布

因目标平台为arm64嵌入式linux系统,采用以下方式进行程序发布:

在命令行窗口,切换到项目文件夹,运行如下命令:

dotnet publish -r linux-arm64 -c Release

通过以上命令,得到生成的目标平台的发布包,程序文件及相关.netcore运行时依赖均被发布到项目release\netcoreapp2.2\linux-arm64\publish文件夹中。

 

远程部署

采用scp命令,将发布文件复制到目标机器

在windows(win10)系统中,打开控制台窗口,输入scp命令,命令格式如下:

scp –r d:\ubuntu\publish\ pi@172.16.93.74:/home/pi/.

根据提示输入用户密码,完成文件夹的复制。

 

在ssh终端窗口,切换到程序文件夹

cd /home/pi/publish

设置程序执行权限:

chmod 777 ./HelloArm           # HelloArm为测试程序文件名

 

输入./ HelloArm运行程序

 

Linux环境运行.Net Core程序

在普通用户pi中运行程序

 640?wx_fmt=png

 

程序显示了系统环境信息

由于程序启动后调用了SerialPort.GetPortNames方法,程序未能按预期执行,出现如下信息:

 640?wx_fmt=png

 

提示信息表明SerialPort类库仅支持Windows系统平台,不支持跨平台。

至此,.net core程序跨平台在linux系统运行成功,但串口类库不支持跨平台。

第三方串口类库

为解决串口类支持问题,查找资料,发现github上有一个开源SerialPortStream类库支持netcore,能够支持Linux系统。

https://github.com/jcurl/SerialPortStream

 

该类库支持windows系统和Linux系统,但在Linux系统下运行,需要额外编译目标平台支持库并进行相关环境配置。

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.

在目标系统中(FriendlyCore),安装GCC编译器和cmake

 

首先确定网络正常连接,能够访问互联网(需要良好的网络环境)。

执行如下命令:

sudo apt-get update

 640?wx_fmt=png

 

 

安装更新GCC

sudo apt-get install gcc

 

安装cmake

sudo apt-get install cmake

 640?wx_fmt=png

 

确保gcc和cmake安装正常。可采用命令查看安装情况

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

根据上面的命令,完成类库的源码克隆和编译。

注:类库linux依赖库仅需在同一目标平台编译一次,其他相同目标平台,复制并配置依赖库到目标系统即可。

环境变量配置

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

 

执行上述命令,配置类库目标到环境变量(上述命令为临时环境变量配置,仅当前shell有效)

配置全局环境变量的方法:

vi /etc/profile

在文件的最后一行,增加环境变量LD_LIBRARY_PATH的配置

保存退出后,执行source /etc/profile 刷新环境变量

注:vi相关操作,请自行百度或必应。

Linux串口测试

将测试验证程序中的SerialPort类更换为SerialPortStream类库(方法、属性基本兼容),进行适当的调整,在windows系统上编译运行,通过。

重新发布Linux系统运行版本,进行linux系统部署。

 

采用普通用户pi登录

如环境变量未有效配置,串口类无法正常执行,程序执行到串口方法调用处停止。

640?wx_fmt=png

 

 

按Ctrl+C终止程序。

 

配置好串口类库所需环境变量,重新运行程序,程序正常运行。

如下图,程序启动,列举出系统有效串口,如下图所示:

 640?wx_fmt=png

由于pi用户帐户权限原因,程序只显示了/dev/ttySAC0一个串口,此串口为系统调试终端输出串口。

 

切换到系统超级用户

su root

根据提示输入密码:fa

 

切换到程序目录,执行测试程序 ./publish/HelloArm,出现如下界面:

640?wx_fmt=png

在超级用户下,程序列举出了5个串口。

通过操作命令,打开指定的串口,开启接收事件及定时周期发送数据,连接电脑串口(目前大部分电脑已不再提供串口,本实验通过USB转串口模块进行连接),通过PC端的串口工具软件同Linux迷你PC主机进行通讯,收发通讯正常。

 

配置程序开机运行

在root用户下,配置/etc/rc.local文件,将程序添加到系统开机运行

 

vi /etc/rc.local

 

在exit 0之前增加一行

/home/pi/publish/HelloArm

 

保存退出,重启系统

reboot 

重启系统后,调试串口终端界面中,可以看到程序运行的输出信息,至此,程序配置完成,开机自动运行成功。 

结束语

       .net core为微软推出的跨平台托管程序框架,具备在非windows系统部署运行的能力,但在实际应用中,不能过于想当然,以为支持跨平台就万事大吉,以为凡是.net程序就可以顺利移植为.net core跨平台程序,在实际应用中,需要小心求证,以避免掉进计划时间过于理想的大坑(本实验耗费的时间,远超出计划时间呵。串口类库问题耗费了不少时间,对Linux系统相关操作的熟悉,也耗费了较多时间)。

       本文中,验证程序是以指定目标平台,无环境依赖方式进行的发布部署,.net core程序也支持以跨平台方式发布部署,但相关目标平台需安装.net core运行时以及相关依赖,微软官方已有详细的说明文档,本文不再赘述。

       注:本实验中,使用了两种硬件设备,故截图有所不同,但系统相同,不影响实验效果和结论。

原文地址:https://www.cnblogs.com/flyfire-cn/p/10356991.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

H - Message Bomb Gym - 102798H

H - Message Bomb Gym - 102798H 题意: 有n个团队,m个人,s个操作 操作1:学生x加入y团队 操作2:学生x推出y团队 操作3:学生x在团队y发送一个信号,在团队y内的所有成员(除了x&#x…

Loj#3005-「JOISC 2015 Day 4」Limited Memory【交互题】

正题 题目链接:https://loj.ac/p/3005 题目大意 有一个长度为nnn的括号串SSS&#xff0c;其中包括[]和<>两种括号类型&#xff0c;一个合法的括号串要求同类型的括号一一对应。 你每次可以询问SSS中的一个字符并且传递一个[0,222)[0,2^{22})[0,222)的数字到下一次。 …

[数论系列一]C Looooops,跳跳棋,The Luckiest number,CF906D Power Tower,Minimal Power of Prime,仪仗队,LCMSUM

文章目录C Looooopsdescriptionsolutioncode跳跳棋descriptionsolutioncodeThe Luckiest numberdescriptionsolutioncodeCF906D Power TowerdescriptionsolutioncodeMinimal Power of Primedescriptionsolutioncode[SDOI2008]仪仗队descriptionsolutioncodeLCMSUMdescriptionso…

P4299 首都(LCT、重心)

解析 动态维护树的重心 关键性质&#xff1a;两棵树合并时&#xff0c;新的重心一定在两个原重心之间的路径上 把两个重心之间的路径提出来&#xff0c;利用splay本身的二叉结构二分即可 注意虚子树信息的处理 不要忘记pushdown 代码 #include<bits/stdc.h> using nam…

.NET Core使用微软AI认知服务识别文字语言

点击上方蓝字关注“汪宇杰博客”识别一段文字的语言有多种途径&#xff0c;在这个以AI为热点的时代&#xff0c;我们也可以给自己的应用强行加上AI&#xff0c;然后就能加上“智慧”的名字“自主研发成功”后去吹牛逼。今天我带大家来看看如何使用微软智慧云Azure提供的AI认知服…

2020CCPC威海

2020CCPC威海 2020CCPC威海榜单 题号题目知识点难度AGolden Spirit思维&#xff0c;推导题签到题BLabyrinthdfs思维金牌题CRencontreDABC Conjecture数论&#xff0c;推导签到题ESo Many Possibilities…FSkeleton DynamizationGCaesar Cipher线段树hash银牌题HMessage Bomb贪…

P6118-[JOI 2019 Final]珍しい都市【树的直径】

正题 题目链接:https://www.luogu.com.cn/problem/P6118 题目大意 给出一棵nnn个点的树&#xff0c;对于一个点xxx来说&#xff0c;独特的点y(y≠x)y(y\neq x)y(y​x)是指不存在zzz使得dis(y,x)dis(z,x)dis(y,x)dis(z,x)dis(y,x)dis(z,x)&#xff0c;其中x≠z,y≠zx\neq z,…

[NOI2021 day1]轻重边(树链剖分),路径交点(矩阵行列式)

NOI 2021 day1轻重边descriptionsolutioncode路径交点descriptionsolutioncode轻重边 description solution case1~6 把父亲和儿子的边转化为储存在儿子上的点 建树&#xff0c;暴力爬lcalcalca&#xff0c;暴力修改&#xff0c;O(n2)O(n^2)O(n2) caseA 对于一条链的情况&am…

模板:CDQ分治

文章目录前言upd例题P3810 【模板】三维偏序&#xff08;陌上花开&#xff09;P2487 [SDOI2011]拦截导弹所谓CDQ分治&#xff0c;就是和由Conprour、Doctorjellyfish、QE添一同发明的分治算法 &#xff08;逃&#xff09; 前言 神奇的乱搞黑科技 CDQ分治能够通过更小的时间常…

【NET CORE微服务一条龙应用】第二章 配置中心使用

背景系列目录&#xff1a;【NET CORE微服务一条龙应用】开始篇与目录在分布式或者微服务系统里&#xff0c;通过配置文件来管理配置内容&#xff0c;是一件比较令人痛苦的事情&#xff0c;再谨慎也有湿鞋的时候&#xff0c;这就是在项目架构发展的过程中&#xff0c;配置中心存…

D - ABC Conjecture Gym - 102798D

D - ABC Conjecture Gym - 102798D 题意&#xff1a; 规定rad(n)n的所有质因子的乘积 给你一个c&#xff0c;问能否构造a和b使得abc且rad(abc)<c 题解&#xff1a; 先说结论&#xff0c;如果c可以拆分出两个一样的质因子&#xff0c;则能构造a和b 即 np1a1 * p2a2 . . .…

P7560-[JOISC 2021 Day1]フードコート【吉司机线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P7560 题目大意 有nnn个队列&#xff0c;要求支持操作&#xff1a; 往[L,R][L,R][L,R]的队列中插入kkk个ccc。出队[L,R][L,R][L,R]中的kkk个元素。&#xff08;如果不足kkk个就全部出队&#xff09;求第aaa个队列中的第bbb个…

“幕后英雄”之Backing Fields【Microsoft Entity Framework Core随笔】

刘德华 有一首歌叫《马桶》&#xff0c;其中有一句歌词是&#xff1a;每一个马桶都是英雄。EFCore也有一个英雄&#xff0c;在幕后默默地任劳任怨。它就叫 "支持字段" (Backing Fields):中文版&#xff1a;https://docs.microsoft.com/zh-cn/ef/core/modeling/backin…

P4169 [Violet]天使玩偶/SJY摆棋子(CDQ分治、暴力)

解析 之前用KDtree做的一道题 由于懒不想再码一遍了 考虑CDQ分治 关键就是如何拿掉绝对值 如果只维护左下角的&#xff0c;显然就是一个经典的三维偏序问题了 但是本题不一定在左下角&#xff0c;也可能在左上、右下、右上 怎么办&#xff1f; 把坐标翻转翻转直接暴力做四遍即…

数论练习二之BSGS算法——随机数生成器,Matrix,Lunar New Year and a Recursive Sequence,Fermat‘s Last Theorem

[SDOI2013] 随机数生成器 description solution 肯定是非常想找一个通项公式来表示第nnn个数的 依据形式&#xff0c;考虑化成等比数列 xi1ka(xik)a⋅xibt⇒kba−1x_{i1}ka(x_ik)ax_ibt\Rightarrow k\frac{b}{a-1}xi1​ka(xi​k)a⋅xi​bt⇒ka−1b​ ⇒xiba−1ai−1(x1ba−…

L - Clock Master Gym - 102798L

L - Clock Master Gym - 102798L 题意&#xff1a; 给定一个数字n&#xff0c;令na1a2a3…求lcm(a1,a2,a3,…)的最大值,以loge(x)的形式输出 题解&#xff1a; lcm要求尽可能大&#xff0c;我们就要保证a1,a2,a3…尽可能为质数或质数的整数次幂&#xff0c;我们假设a1是p1x…

P7739-[NOI2021]密码箱【Splay,矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P7739 题目描述 懒得概括&#xff0c;摸了。 Yelekastee 是 U 国著名的考古学家。在最近的一次考古行动中&#xff0c;他发掘出了一个远古时期的密码箱。经过周密而严谨的考证&#xff0c;Yelekastee 得知密码箱的密码和某一…

NetCore下模拟和使用Modbus工业通信协议

Tips&#xff1a;1、目前NetCore下与Modbus通信的框架主要选择了 Modbus.Net https://github.com/parallelbgls/Modbus.Net2、modbus是常用的工业通信协议&#xff0c;在软件调试时可以通过modbus pollslave模拟通信通过达到调试目的&#xff0c;下图是我使用软件1&#xff09…

codeforces:65

文章目录前言CF65A Harry Potter and Three SpellsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF65B Harry Potter and the History of MagicDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\…

C - Rencontre Gym - 102798C

C - Rencontre Gym - 102798C 参考题解&#xff1a; 参考一 参考二 题意&#xff1a; 有一棵树&#xff0c;树上的点分为三种&#xff0c;&#xff08;一个点可以为多种&#xff09;&#xff0c;现在分别在三种点中随机选一点a&#xff0c;b&#xff0c;c&#xff0c;然后找到…