C#SerialPort实现串口控制继电器
最近做了一个小系统,麻雀虽小五脏俱全呀,用到各种线程控制,串口控制等技术。其中串口控制最麻烦,因为继电器的响应很快,根据不同的转接口,返回的数据质量是不一样的,所以不能直接wirte,然后马上read,这样经常得到的效应状态是错误的。因此需要用到backgroundworker不停地read,校验数据成功后再设置成功状态标志,最后让timer定时获取改标志,成功后立即控制程序界面上的按钮等控件。
public void openSerial()
{
try
{
foreach (GlobaConfig config in GlobaConfigInstance.Instance)
{
if ((!config.SerialPort.IsOpen))
{
config.SerialPort.Open();
config.SerialPort.DiscardInBuffer();
config.SerialPort.DiscardOutBuffer();
}
}
}
catch(Exception ex)
{
//MessageBox.Show("打开失败!" + ex.Message);
NotificationManager.Show(this, "打开失败!" + ex.Message,
Color.Gold, );
return;
}
} private void SendOpenDemand(byte port)
{
byte[] buffer = new byte[];
byte[] buffer2 = new byte[];
buffer[] = GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].Addr;
buffer[] = ;
buffer[] = ;
buffer[] = port;
buffer[] = 0xff;
buffer[] = ;
A101.GetCRC(buffer, , buffer2);
buffer[] = buffer2[];
buffer[] = buffer2[];
if (GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.IsOpen)
{
this.SerialSendFrame(buffer, , );
}
else
{
//MessageBox.Show("亲,你要先打开串口哦!");
}
} private void SendCloseDemand(byte port)
{
byte[] buffer = new byte[];
byte[] buffer2 = new byte[];
buffer[] = GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].Addr;
buffer[] = ;
buffer[] = ;
buffer[] = port;
buffer[] = ;
buffer[] = ;
A101.GetCRC(buffer, , buffer2);
buffer[] = buffer2[];
buffer[] = buffer2[];
if (GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.IsOpen)
{
this.SerialSendFrame(buffer, , );
}
else
{
//MessageBox.Show("亲,你要先打开串口哦!");
}
} private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
byte[] buffer;
while (true)
{
try
{ if (GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.IsOpen)
{
int bytesToRead = GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.BytesToRead;
buffer = new byte[0xff];
if (bytesToRead > )
{
int num2;
bytesToRead = 0x45;
GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.Read(buffer, , bytesToRead);
bool isValid = A101.ValidCRC(buffer, (byte)bytesToRead);
System.Diagnostics.Debug.WriteLine("isValid: " + isValid);
if (isValid)
{
for (num2 = ; num2 < bytesToRead; num2++)
{
this.SerialRecBuf[num2] = buffer[num2];
} this.SerialRecFlag = true;
}
else
this.SerialRecFlag = false; }
}
}
catch (Exception ex)
{ Console.WriteLine(ex);
}
Thread.Sleep();
}
} private void timer1_Tick(object sender, EventArgs e)
{
if (this.SerialRecFlag)
{
this.SerialRecFlag = false;
if (((this.SerialRecBuf[] == GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].Addr) && (this.SerialRecBuf[] == )) && (this.SerialRecBuf[] == ))
{
this.BtnSendFlag = false;
if (GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.IsOpen)
{
Control[] controls = this.kryptonNavigator1.SelectedPage.Controls.Find("btnRelay" + kryptonNavigator1.SelectedIndex + this.SerialRecBuf[], true);
if (controls.Length > )
{
KryptonCheckButton button = controls[] as KryptonCheckButton;
button.Checked = false;
button.Tag = "断开";
button.Enabled = true;
}
}
}
else if (((this.SerialRecBuf[] == GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].Addr) && (this.SerialRecBuf[] == )) && (this.SerialRecBuf[] == 0xff))
{
this.BtnSendFlag = false; if (GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.IsOpen)
{
Control[] controls = this.kryptonNavigator1.SelectedPage.Controls.Find("btnRelay" + kryptonNavigator1.SelectedIndex + this.SerialRecBuf[], true);
if (controls.Length > )
{
KryptonCheckButton button = controls[] as KryptonCheckButton;
button.Checked = true;
button.Tag = "闭合";
button.Enabled = true;
}
}
}
else if (((this.SerialRecBuf[] == GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].Addr) && (this.SerialRecBuf[] == )) && (this.SerialRecBuf[] == ))
{
uint[] numArray = new uint[];
uint resource = ;
numArray[] = this.SerialRecBuf[];
numArray[] = this.SerialRecBuf[];
numArray[] = this.SerialRecBuf[];
numArray[] = this.SerialRecBuf[];
resource = (((numArray[] << 0x18) | (numArray[] << 0x10)) | (numArray[] << )) | numArray[]; if (GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.IsOpen)
{
foreach (Control control in this.kryptonNavigator1.SelectedPage.Controls[].Controls)
{
KryptonCheckButton button = control as KryptonCheckButton;
if (this.GetRegBit(resource, (byte)control.TabIndex) == )
{
button.Checked = false;
button.Tag = "断开";
}
else
{
button.Checked = true;
button.Tag = "闭合";
}
button.Enabled = true;
}
}
} }
} private void timer2_Tick(object sender, EventArgs e)
{
if (!this.BtnSendFlag)
{
byte[] buffer = new byte[];
byte[] buffer2 = new byte[];
buffer[] = GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].Addr;
buffer[] = ;
buffer[] = ;
buffer[] = ;
buffer[] = ;
buffer[] = 0x1c;
A101.GetCRC(buffer, , buffer2);
buffer[] = buffer2[];
buffer[] = buffer2[];
System.Diagnostics.Debug.WriteLine(kryptonNavigator1.SelectedIndex + ":" + GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.IsOpen);
if (GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.IsOpen)
{
this.SerialSendFrame(buffer, , );
this.timer1.Start();
}
else
{
if (GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].IsValid == true)
{
GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].IsValid = false;
try
{
GlobaConfigInstance.Instance[kryptonNavigator1.SelectedIndex].SerialPort.Open();
//修復退出的線程
//this.timer1 = new System.Windows.Forms.Timer();
this.timer1.Start();
}
catch (Exception ex)
{
NotificationManager.Show(this, "主机" + (kryptonNavigator1.SelectedIndex + ) + "出现异常:" + ex.Message,
Color.Gold, );
//MessageBox.Show("主机" + (kryptonNavigator1.SelectedIndex + 1) + "出现异常:" + ex.Message);
}
}
}
}
}
C#SerialPort实现串口控制继电器的更多相关文章
- C# SerialPort自定义串口DCB
C# SerialPort自定义串口DCBChange DCB fields from SerialPort instance CPS:中文DCB结构详解表 译自Change DCB fields f ...
- C#用SerialPort实现串口通讯
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Nodejs 使用 SerialPort 调用串口
工作经常使用串口读写数据,electron 想要替代原来的客户端,串口成了必须要突破的障碍. get --> https://github.com/EmergingTechnologyAdvi ...
- C#SerialPort如何读取串口数据并显示在TextBox上
SerialPort中串口数据的读取与写入有较大的不同.由于串口不知道数据何时到达,因此有两种方法可以实现串口数据的读取.一.线程实时读串口:二.事件触发方式实现. 由于线程实时读串口的效率不是十分高 ...
- c#实现串口操作 SerialPort
命名空间:using System.IO.Ports;该类提供了同步 I/O 和事件驱动的 I/O.对管脚和中断状态的访问以及对串行驱动程序属性的访问. 操作类声明: SerialPort sp = ...
- System.IO.Ports.SerialPort串口通信接收完整数据
C#中使用System.IO.Ports.SerialPort进行串口通信网上资料也很多,但都没有提及一些细节: 比如 串口有时候并不会一次性把你想要的数据全部传输给你,可能会分为1次,2次,3次分别 ...
- 树莓派4B 串口通信
提前下载安装Glade图形编辑器 参考 树莓派4B安装netcore 环境部署.发布.执行操作 准备串口设备本文使用串口控制继电器设备 如图 1.发现串口 void GetSerialPort() { ...
- C#上位机制作之串口接受数据(利用接受事件)
前面设计好了界面,现在就开始写代码了,首先定义一个串口对象.. SerialPort serialport = new SerialPort();//定义串口对象 添加串口扫描函数,扫描出来所有可用串 ...
- C#串口通讯实例
本文参考<C#网络通信程序设计>(张晓明 编著) 程序界面如下图: 参数设置界面代码如下: using System; using System.Collections.Generic; ...
随机推荐
- nodejs npm insttall 带不带-g这个参数的区别
-g 中的g是global的意思所以带-g这个参数是全局安装,不带-g这个参数是本地安装. 在windows系统中全局安装的目录在:C:\Users\linsenq\AppData\Roaming\n ...
- bzoj 5094 [Lydsy1711月赛]硬盘检测 概率dp
[Lydsy1711月赛]硬盘检测 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 273 Solved: 75[Submit][Status][Dis ...
- 知问前端——工具提示UI
工具提示(tooltip),是一个非常实用的UI.它彻底扩展了HTML中的title属性,让提示更加丰富,更加可控制,全面提升了用户体验. 调用tooltip()方法 在调用tooltip()方法之前 ...
- loj6087 毒瘤题
传送门:https://loj.ac/problem/6087 [题解] 这垃圾题目卡空间啊... k=1相信大家都会,把所有数异或起来就是答案了. 考虑k=2,把所有数异或起来得到两个答案数的异或值 ...
- 【51NOD】1717 好数
[算法]数学 [题意]a数组初始为0,t=1~n,每次01翻转t的倍数,最终为0的数字定义为好数,求好数个数 [题解]一个数字为好数的条件是翻转偶数次,也即一个数是好数当且仅当有偶数个因子时. 因子都 ...
- 02-更改窗口的根控制器
Demo示例程序源代码
源代码下载链接:02-更改窗口的根控制器.zip18.0 KB // MJAppDelegate.h // // MJAppDelegate.h // 02-更改窗口的根控制器 // // ...
- bzoj 1066 最大流
将每个石柱拆成两个点,分别是进入的和出去的,两个点之间连石柱的高度 然后每个出去的点连别的石柱的进去的点, 源点连所有蜥蜴所在柱子,每个能跳出去的连汇点,然后最大流就行了 /************* ...
- shell命令行混合进制计算器smartbc
需要简单的计算的时候,不想用GUI的计算器,能在shell下直接计算就最好了 查了下,有个东西叫 bc, 具体的使用就不赘述了,可以运行bc,然后进去计算,也可以echo传递过去,大概是像这样 ec ...
- python基础===正则表达式,常用函数re.split和re.sub
sub的用法: >>> rs = r'c..t' >>> re.sub(rs,'python','scvt dsss cvrt pocdst') 'scvt dss ...
- PL/SQL 09 包 package
--定义包头 create or replace package 包名as 变量.常量声明; 函数声明; 过程声明;end; --定义包体 create or replace package b ...