Csharp 多串口通信

  顾名思义,多串口通信,普通的PC机一般只有一个串口,现在很多家用的PC都没有串口,那么问题来了,如何保证多串口呢?

  有一种神器,MOXA CP-168U Series PCI bus

  

  需要PCI插槽支持,现在市面上要找大主板才会有PCI。

  OK,硬件准备妥当。当然我这个项目中还需要另外一件神器,红外感应器,暂且不表。

  插入设备,装好驱动,你会在设备管理器中发现 serial board拓展出的8个port。Csharp有针对串口的控件:serialPort,每添加一个物理串口,就需要添加一个控件,操作如下:

  1>.实例化串口并打开

  

   serialPort.PortName = item;  //串口名称
     serialPort.BaudRate = 2400;   //波特率
     serialPort.DataBits = 8;    //数据位
     serialPort.Parity = Parity.Even; //校验位
     serialPort.StopBits = StopBits.One; //停止位
     serialPort.ReadTimeout = 3000;   //读写超时控制在3秒内
     serialPort.WriteTimeout = 3000;      //设置数据流控制;数据传输的握手协议
     serialPort.Handshake = Handshake.None;
     serialPort.ReceivedBytesThreshold = 1;
     serialPort.RtsEnable = true;      if (!serialPort.IsOpen)
     {
        serialPort.Open();
     }

  2>.发送数据(byte)

  

byte[] ReadData = (byte)Function you need did
serialPort.Write(ReadData, , ReadData.Length);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
//此处需要特别说明的是,很多人在debug的时候,串口接受回应的事件(serialPort1_DataReceived)没有被触发
//此时可使用串口调试工具,检查发送的值是否正确,一般情况都是因为命令错误,没有回应,导致DataReceived没有被触发

  3>.接受回应并处理

  

public void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//结束符后,接收返回值
int by = serialPort.BytesToRead;
byte[] rece = new byte[by];
serialPort.Read(rece, , by); //解析返回值
//dosomething
}

  如上所述,你只有一个串口需要操作是这样做可以,但是如果你有5个 8头的serial board需要处理时,你就不得不考虑这样做的效率了。那应该怎样呢??

  针对多个串口,可以通过读取注册表获取PC的所有被激活的串口,然后遍历实例化,由于没有使用多线程,不用考虑线程之间的冲突,即使资源被释放,也会在3秒后触发下一个周期

  

     /// <summary>
/// 打开并设置所有的串口
/// </summary>
private void OpenSettingAllSerialPort()
{
try
{
Microsoft.Win32.RegistryKey reg = Microsoft.Win32.Registry.LocalMachine;
Microsoft.Win32.RegistryKey hardware = reg.OpenSubKey("HARDWARE");
Microsoft.Win32.RegistryKey dev = reg.OpenSubKey("DEVICEMAP");
Microsoft.Win32.RegistryKey siteKey = reg.OpenSubKey("SERIALCOMM"); //获取所有串口
string[] strPort = System.IO.Ports.SerialPort.GetPortNames(); //siteKey.GetValueNames(); if (ExcuteNum < )
{
foreach (string item in strPort)
{
serialPort.PortName = item; //串口名称
serialPort.BaudRate = ; //波特率
serialPort.DataBits = ; //数据位
serialPort.Parity = Parity.Even; //校验位
serialPort.StopBits = StopBits.One; //停止位
serialPort.ReadTimeout = ; //读写超时控制在3秒内
serialPort.WriteTimeout = ; //设置数据流控制;数据传输的握手协议
serialPort.Handshake = Handshake.None;
serialPort.ReceivedBytesThreshold = ;
serialPort.RtsEnable = true; if (!serialPort.IsOpen)
{
serialPort.Open();
} byte[] ReadData = devOpreation.Broadst_Addr();
serialPort.Write(ReadData, , ReadData.Length);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived); ExcuteNum++;
}
}
else
{
byte[] ReadData = devOpreation.Broadst_Addr();
serialPort.Write(ReadData, , ReadData.Length);
serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
}
}
catch (Exception ex)
{
MessageBox.Show( "串口未找到或被占用. " + ex.Message);
} }

  至此,你用很少的代码实现了多串口的实例化并打开,然后发送和接受处理利用同样的场景,问题得到解决。

  到最后这样就是你看到的真实样子。

  

  2015/03/17  TymonYang

Csharp Winfrom 多串口通信的更多相关文章

  1. C#初入串口通信(串行通信)总结

    使用WinFrom来实现: 首先要知道串口通信协议以及原理 原理大概提一下:要自己翻阅看.(http://book.51cto.com/art/200911/162532.htm或者http://hi ...

  2. .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...

  3. BluetoothChat用于蓝牙串口通信的修改方法

    本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...

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

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

  5. 使用Java实现简单串口通信

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...

  6. Java 串口通信

    在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...

  7. .NET 串口通信中断接收,包含0X1A(作为EOF)

    .NET串口通信中将`0X1A`当做EOF处理,.NET接收到EOF会触发一次接收中断,此时事件形参`SerialDataReceivedEventArgs`值为枚举 `Eof`,其他为`Chars` ...

  8. STC12C5A60S2 双串口通信

    STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同:特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器, ...

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

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

随机推荐

  1. java 拦截器和过滤器区别(转载)

    1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的 ...

  2. Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FileUtils

    1.错误叙述性说明 警告: Could not create JarEntryRevision for [jar:file:/D:/MyEclipse/apache-tomcat-7.0.53/web ...

  3. INSERT DELAYED 句法

    INSERT 语句的 DELAYED 选项是一个 MySQL 特有的选项,如果你的客户端不能等待 INSERT 的完成,这将会是很有用的.This is a common problem when y ...

  4. MVC - 布局

    布局类似于APSX视图的母版页 用的是Razor的语法 创建布局 布局页面默认放在Shared目录 有几个自动生成的cshtml文件 删除它们 然后创建一个视图 命名为MyLayOut 取消勾选使用母 ...

  5. Linux新手入门:通过chmod改变文件权限--转

    前面介绍过在Linux中如何查看文件的属性,在Linux文件权限详解中我们介绍了Linux文件的三种身份和四种权限,三种身份分别为: u:文件的拥有者 g:文件所属的群组 o:其他用户 对于每个身份, ...

  6. Java基础知识强化之IO流笔记36:InputStreamReader/OutputStreamWriter 复制文本文件案例

    1. 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中. 数据源:  a.txt -- 读取数据 -- 字符转换流 -- InputStreamReader 目的地:  b.t ...

  7. Clean Code(三):注释

    在工作中经常在刚开始写代码的时候,写下类与方法的注释,时间久了,CR多了,也不可能一直去修改注释了.加班都累成dog.注释才不改呢,就是这么任性,哈哈. 项目久了,注释会欺骗阅读者,本人被骗过,也骗过 ...

  8. ZooKeeper 分布式锁实现

    1 场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问. 2 ...

  9. win8 64位操作系统 Microsoft Visual Studio 2010在IIS上调试 “此任务要求应用程序具有提升的权限”等问题

    很少在IIS上调试程序,因系统原因,所以不得不在IIS上预览项目和调试项目(因为只能在IIS上预览项目才能看到项目里的数据). 1.附加到进程(注意附加到进程前必须预览项目) 2.选择调试项 需要注意 ...

  10. html-01

    1.HTML:超文本标记语言,由浏览器解析成页面.html文件是以.html或者 .htm 2.HTML的作用   |- 控制页面的外观.   |- 发布帮助文档 3.常见的浏览器    |-IE:微 ...