实用技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > ASP.NET > 实用技巧 > .Net Core跨平台开发串口

.Net Core跨平台应用开发串口篇HelloArm

作者:赫山老妖

这篇文章介绍了.Net Core跨平台应用开发串口篇HelloArm,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

引言

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

硬件环境

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

硬件资源特性

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

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

支持的系统平台

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

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

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

系统平台

.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:

系统平台选择

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

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

烧写主要步骤:

连接嵌入式Linux系统

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

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

普通用户:

用户名: pi

密码: pi

Root用户:

用户名: root

密码: fa

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

物理连接

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

串口连接

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

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

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

网络连接

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

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

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

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

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

ssh pi@172.16.93.74

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

.NET Core跨平台验证

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

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

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

验证程序设计

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

实现以下功能:

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

显示系统平台信息

串口资源列举

串口测试

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

跨平台发布

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

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

dotnetpublish-rlinux-arm64-cRelease

通过以上命令,得到生成的目标平台的发布包,程序文件及相关.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中运行程序

 

程序显示了系统环境信息

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

 

提示信息表明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

安装更新GCC

sudo apt-get install gcc

安装cmake

sudo apt-get install cmake

确保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登录

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

按Ctrl+C终止程序。

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

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

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

切换到系统超级用户

su root

根据提示输入密码:fa

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

在超级用户下,程序列举出了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运行时以及相关依赖,微软官方已有详细的说明文档,本文不再赘述。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文