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