功能要求:向锁控板发送开锁命令。
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录- .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
并且选中三个,然后右键,选择属性(R)。将“复制到输出目录”下拉框选择为“始终复制”
代码如下(示例):
///2.写入串口的数据/// 运行操作系统 /// 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); }
代码如下(示例):
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"即可运行起来程序了。
2.Linux下运行文件没有.exe等一系列后缀。
3.在初始化串口的时候,如果在Linux下传入的是从配置文件中获取的,则会打开串口失败,于是在那里手动写入“/dev/ttyUSB0”就可以成功打开。



