栏目分类:
子分类:
返回
终身学习网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
终身学习网 > IT > 软件开发 > 后端开发 > .Net

.Net Core 开发跨平台Linux下串口通讯

.Net 更新时间:发布时间: 百科书网 趣学号
.Net Core 开发Linux下串口通讯

功能要求:向锁控板发送开锁命令。


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
    • .Net Core 开发Linux下串口通讯
  • 前言:你需要在你的Linux上安装对应的.net core版本,我安装的是3.1.16
  • 一、Linux下使用 “SerialPortStream”一系列准备工作
    • 1.NuGet加载包:
    • 2.生成Linux下该包调用的方法所依赖的OS文件。库的作者说明如下:
      • 2.1:我是直接去git上下载的ZIP文件(地址:[https://github.com/jcurl/SerialPortStream](https://github.com/jcurl/SerialPortStream)),首先现将下载好的ZIP文件移动到Linux系统内。
      • 2.2:运行命令 unzip -o -d /root/netcore/n2.3 SerialPortStream-release-2.3.1.0.zip 将SerialPortStream-release-2.3.1.0.zip解压至/root/netcore/n2.3下。
      • 2.3:然后输入命令进入目录 serialunix:CD /root/netcore/n2.3/SerialPortStream-release-2.3.1.0/dll/serialunix
      • 2.4:编译对应的OS文件。输入./build.sh
      • 2.5:编译成功之后。在**/root/netcore/n2.3/SerialPortStream-release-2.3.1.0/dll/serialunix/bin/usr/local/lib64**目录下多出三个文件(在编译过程中可能会有问题,如GCC,CMAKE版本比较低,可以升级,或者没有安装,则直接安装。具体可以参考https://www.cnblogs.com/whuanle/p/10499498.html#t4
      • 2.6.OK到此为止可以将这三个文件待会拷贝到对应的Visual Studio解决方案下。
  • 二、编写代码
    • 1.初始化SerialPortStream对象:
    • 2.写入串口的数据
    • 3.接收返回数据的委托函数:
    • 三、生成发布文件
      • 3.1 选择正确的目标运行时。以及配置
      • 拷贝到Linux下,然后进入对应的目录,再运行。
  • 总结


前言:你需要在你的Linux上安装对应的.net core版本,我安装的是3.1.16

在windows平台下可以使用System.IO.Ports.SerialPort类来进行串口通讯开发。但是到了Linux下就不行了,提示缺少Kernel.dll。借鉴前面几位大佬的文章使用NuGet包加载“SerialPortStream”来进行.Net Core跨平台下的串口通讯
.Net Core 版本:3.1.16
WorkerService 项目工程
借鉴地址:
1.https://www.cnblogs.com/flyfire-cn/p/10434171.html
2.https://www.cnblogs.com/flyfire-cn/p/10356991.html
3.https://www.cnblogs.com/whuanle/p/10499597.html
4.https://www.cnblogs.com/whuanle/p/10499498.html#t4


一、Linux下使用 “SerialPortStream”一系列准备工作 1.NuGet加载包:

2.生成Linux下该包调用的方法所依赖的OS文件。库的作者说明如下:

2.1:我是直接去git上下载的ZIP文件(地址:https://github.com/jcurl/SerialPortStream),首先现将下载好的ZIP文件移动到Linux系统内。

2.2:运行命令 unzip -o -d /root/netcore/n2.3 SerialPortStream-release-2.3.1.0.zip 将SerialPortStream-release-2.3.1.0.zip解压至/root/netcore/n2.3下。

2.3:然后输入命令进入目录 serialunix:CD /root/netcore/n2.3/SerialPortStream-release-2.3.1.0/dll/serialunix 2.4:编译对应的OS文件。输入./build.sh

2.5:编译成功之后。在**/root/netcore/n2.3/SerialPortStream-release-2.3.1.0/dll/serialunix/bin/usr/local/lib64**目录下多出三个文件(在编译过程中可能会有问题,如GCC,CMAKE版本比较低,可以升级,或者没有安装,则直接安装。具体可以参考https://www.cnblogs.com/whuanle/p/10499498.html#t4


2.6.OK到此为止可以将这三个文件待会拷贝到对应的Visual Studio解决方案下。


并且选中三个,然后右键,选择属性(R)。将“复制到输出目录”下拉框选择为“始终复制”

二、编写代码 1.初始化SerialPortStream对象:

代码如下(示例):

 /// 
 /// 运行操作系统
 /// 
 static string OS = ConfigurationManager.AppSettings["OS"];

 public static SerialPortStream serialPortLockLinux  ;
 public override async Task StartAsync(CancellationToken cancellationToken)
        {
            if (OS == "Linux")
            {
                serialPortLockLinux = new SerialPortStream("/dev/ttyUSB0", 9600, 8, RJCP.IO.Ports.Parity.None, RJCP.IO.Ports.StopBits.One);
            }
            else
            {
                serialPortLockLinux = new SerialPortStream("COM5", 9600, 8, RJCP.IO.Ports.Parity.None, RJCP.IO.Ports.StopBits.One);
            }
            	//在适当的位置给事件添加
 				serialPortLockLinux.DataReceived += new EventHandler(this.serialPortLockLinux_DataReceived);
       }
       
2.写入串口的数据

代码如下(示例):

  private static int singleOpenLock(string Box, string Door, out string msg, string CheckCode = "11")
        {
			//首先打开串口
			serialPortLockLinux.Open();
			//写入16进制数据
			byte[] bcmd = new byte[5];

            //8A 01 00 11 9A


            bcmd[0] = 0x8A;

            bcmd[1] = Convert.ToByte(Box);//控制板编号;

            bcmd[2] = Convert.ToByte(Door);//门编号

            bcmd[3] = 0x11;




            bcmd[4] = Convert.ToByte(bcmd[0] ^ bcmd[1] ^ bcmd[2] ^ bcmd[3]);


            string postCarbinet = BitConverter.ToString(bcmd);

            resultCarbinet = string.Empty;

            //写入
            serialPortLockLinux.Write(bcmd);
        }
3.接收返回数据的委托函数:
         private void serialPortLockLinux_DataReceived(object? sender, SerialDataReceivedEventArgs e)
        {

            try
            {
                System.Threading.Thread.Sleep(50);
                int ibtr = serialPortLockLinux.BytesToRead;
                byte[] bget = new byte[ibtr];
                serialPortLockLinux.Read(bget, 0, ibtr);
                

                //读取的数据
                resultCarbinet = resultCarbinet + BitConverter.ToString(bget);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                var ddd = ex.Message;
            }
        }

三、生成发布文件 3.1 选择正确的目标运行时。以及配置

拷贝到Linux下,然后进入对应的目录,再运行。


在Linux命令窗口中输入 "./WorkerService1"即可运行起来程序了。

总结 1.在Linux下可以查看已经连接的串口命令:ls /dev/tty* 一般都是为/dev/ttyUSB0 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20210622155807535.png) 在代码里面的串口名是“/dev/ttyUSB0”不是ttyUSB0,最前面的"/"也不能少。

2.Linux下运行文件没有.exe等一系列后缀。
3.在初始化串口的时候,如果在Linux下传入的是从配置文件中获取的,则会打开串口失败,于是在那里手动写入“/dev/ttyUSB0”就可以成功打开。

转载请注明:文章转载自 www.051e.com
本文地址:http://www.051e.com/it/985099.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 ©2023-2025 051e.com

ICP备案号:京ICP备12030808号