上次说到了协议的大致结构,这次我们来说说怎么去实现制动连接串口(当你把设备连上来之后,怎么去让软件自动去识别是否为目标设备,当然这需要上位机与下位机共同完成,这里我们只讨论上位机部分)
先上协议:

帧头(3)+设备号(1)+指令类型(2)+数据长度(2)+载荷+CRC(2)
需要在下位机上实现的部分:
接收到一帧数据(帧头为53 5A 59,设备号01,类型为02,载荷无)53 59 A2 01 02 00 00 00 CRC后,会返回(帧头为53 5A 59,设备号01,类型为02,载荷为"6F 6B")53 5A 59 01 02 00 02 00 6F 6B CRC则表示指令接收成功。
下面说我的思路,在软件界面打开后,开一个自动连接线程处理连接部分。具体步骤是:

获取计算机所有串口。
    尝试发送指定数据到每个可用串口。
    尝试从串口接收数据并检查是否为约定数据,若是则绑定该端口,完成连接。不是则换到下一个。循环。

好了,让我们简单点,下面直接上代码:

bool IsConnected = false; private void AutoConcted()
{
while (true)//循环
{
while (!IsConnected)//未连接
{
string[] strPorNnames = SerialPort.GetPortNames();//获取所有可用串口名
foreach (string portName in strPorNnames)//遍历串口
{
try
{
SPort.PortName = portName; SPort.Open(); SPort.DiscardOutBuffer(); byte[] bytSend = new byte[] { 0x53, 0x59, 0xA2, 0x01, 0x02, 0x00, 0x00, 0x00, CRC };//自行去CRC去
SPort.Write(bytSend, , bytSend.Length);
Thread.Sleep();//确保数据发送及解析时间
int n = SPort.BytesToRead; byte[] bytRec = new byte[n]; SPort.Read(bytRec, , n);
if (IsHertJump(bytRec))//判断返回是否为指定数据
{
IsConnected = true; break;//是则跳出循环
}
else
{ SPort.Close(); }
}
catch (Exception) { SPort.Close(); }
}
Thread.Sleep();
}
}
}

是的,自动连接应该可以实现了,然而又有了新问题,这种自动连接貌似只能连一次,中途拔掉一下就不行了,因为连接上之后进程就自己销毁了。而且拔掉之后(串口断开)软件并不会有任何的状态提示,之后你所有的数据都会往一个不知道的地方去了。所以,我们还要加一个检测断开的机制。由于两者不会同时需要,所以可以写到一个线程里去,没连上就自动去连,连上了就检测是否断开。
修改后的代码:(完善后的自动连接线程)

private void AutoConcted()
{
while (true)
{
while (!IsConnected)
{
string[] strPorNnames = SerialPort.GetPortNames(); foreach (string portName in strPorNnames)
{
try
{
SPort.PortName = portName; SPort.Open(); SPort.DiscardOutBuffer();
byte[] bytSend = new byte[] { 0x53, 0x59, 0xA2, 0x01, 0x02, 0x00, 0x00, 0x00, CRC };//自行去CRC去
SPort.Write(bytSend, , bytSend.Length); Thread.Sleep(); int n = SPort.BytesToRead; byte[] bytRec = new byte[n]; SPort.Read(bytRec, , n); if (IsHertJump(bytRec)) { IsConnected = true; break; } else { SPort.Close(); }
}
catch (Exception) { SPort.Close(); }
}
Thread.Sleep();
} while (IsConnected)
{
if (!SPort.IsOpen)//检查是否断开
{ SPort.Close(); IsConnected = false; }
Thread.Sleep();
}
}
}

C#串口通信:2自动连接的更多相关文章

  1. [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)

    星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...

  2. Win10 IoT C#开发 4 - UART 串口通信

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug ...

  3. mfc 调用Windows的API函数实现同步异步串口通信(源码)

    在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半 ...

  4. C语言dsPIC / PIC24 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新dsPIC/PIC2 ...

  5. C语言PIC18 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC18 Boot ...

  6. C语言PIC16 serial bootloader和C#语言bootloader PC端串口通信程序

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC16 Boot ...

  7. linux下串口通信与管理

    linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get ...

  8. Linux与Windows串口通信

    串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和 ...

  9. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

随机推荐

  1. Java——scoket通讯

    Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket是TCP/IP协议通信的抽象层,所以我们还需要了解TCP协议 传输层协议 TCP: ...

  2. python之路--类与类之间的关系

    类和类之间的关系 在我们的世界中事物和事物之间总会有一些联系. 在面向对象中. 类和类之间也可以产生相关的关系 1. 依赖关系 执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的关系是最轻 ...

  3. 将大数组里面的小数组平行展开的实现(Making a flat list out of list of lists in Python)

    今天在生成数据的时候遇到了这个需求,其实写一个for循环可以很容易解决这个问题,但是无论是性能还是酷炫程度上都不行 所以顺手搜索了一下. 例子是将 l = [[1, 2, 3], [4, 5, 6], ...

  4. chrome版本下载

    chrome 下载:https://www.chromedownloads.net/chrome64win/ chromedriver下载:http://chromedriver.storage.go ...

  5. Java多线程之synchronized线程锁

    package org.study2.javabase.ThreadsDemo.sync; /** * @Auther:GongXingRui * @Date:2018/9/18 * @Descrip ...

  6. 学习 Spring (八) 注解之 Bean 的定义及作用域

    Spring入门篇 学习笔记 Classpath 扫描与组件管理 从 Spring 3.0 开始,Spring JavaConfig 项目提供了很多特性,包括使用 java 而不是 XML 定义 be ...

  7. John the Ripper-弱口令检测

    简介 John the Ripper免费的开源软件,是一个快速的密码破解工具,用于在已知密文的情况下尝试破解出明文的破解密码软件,支持目前大多数的加密算法,如DES.MD4.MD5等.它支持多种不同类 ...

  8. oracle总结--增删改查

    oracle的执行计划SQL> EXPLAIN PLAN FOR SELECT * FROM emp;已解释.SQL> SELECT plan_table_output FROM TABL ...

  9. BZOJ1565[NOI2009]植物大战僵尸——最大权闭合子图+拓扑排序

    题目描述 Plants vs. Zombies(PVZ)是最近十分风靡的一款小游戏.Plants(植物)和Zombies(僵尸)是游戏的主角,其中Plants防守,而Zombies进攻.该款游戏包含多 ...

  10. Codeforces Round #415 Div. 1

    A:考虑每对最大值最小值的贡献即可. #include<iostream> #include<cstdio> #include<cmath> #include< ...