Csharp Winfrom 多串口通信

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, 0, 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, 0, 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 < 1)
                {
                    foreach (string item in strPort)
                    {
                        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();
                        }

                        byte[] ReadData = devOpreation.Broadst_Addr();
                        serialPort.Write(ReadData, 0, ReadData.Length);
                        serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);

                        ExcuteNum++;
                    }
                }
                else
                {
                    byte[] ReadData = devOpreation.Broadst_Addr();
                    serialPort.Write(ReadData, 0, ReadData.Length);
                    serialPort.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show( "串口未找到或被占用. " + ex.Message);
            }          

        }

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

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

  

  2015/03/17  TymonYang

时间: 2024-08-28 22:06:00

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

(转)用C#一步步写串口通信

最近在公司让用C#写一个串口调试的工具,要求向串口中输入16进制数据或字符串.因为我刚到公司,并且对C#也不是很熟悉,针对硬件编程更是从来没接触过,确实耗掉了一些时间.好在一切都可以慢慢来,通过网上查资料,几天工作下来,还是小有成就.下面我就将这次遇到的问题和解决方法奉献出来,目的是和同行交流,回馈网友们提供的帮助,也是为了自己对知识加深一下巩固.      说了一大通废话之后,我们来看具体的实现步骤. 公司要求实现以下几个功能:1):实现两台计算机之前的串口通信,以16进制形式和字符串两种形式

51单片机之串口通信(三)

51单片机之串口通信(三) 已有 47 次阅读2015-12-29 00:21 |个人分类:51单片机| 单片机, 通信 用串口实现发送和接收同时可操作: 电脑显示结果如图: 源程序: /*项目名称:串口发送接收实验项目内容:串口发送接收同时进行,计算机发送数据给单片机控制P0口,从而控制LED灯的亮灭,单片机发送数据到计算机,计算机显示出来时间:2015年12月23日项目负责人:YUAN*/#include <reg52.h>typedef unsigned char uChar8;type

(转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目comm 注意:点击ok,然后next,这时候要将application type改成dialog base.接着next到最后一个对话框是将generated dasses改成CcommDlg,然后finish 4, 将新生成的项目的对话框默认dialog edit删去,如图 5,在对话框中加入两个st

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

51单片机之串口通信(一)

一.基础知识 1.串行通信和并行通信:目前用的比较多的是串行通信.串行通信优点是连接简单,传输距离远:缺点是传输速度慢. 2.串行通信:分为同步通信和异步通信:异步通信是指发送和接收设备利用各自的时钟控制数据的发送和接收. 3.串行通信的传输方向:单工,半双工,全双工. 4.波特率:每秒钟传输2进制代码的位数,如1个字节为10位,每秒传输240个字节,则波特率为10*240=2400bps,单位是bps: 5.RS-232C:25个管脚,我们用到的是PGND(保护接地).TXD(发送数据),RX

转:Qt编写串口通信程序全程图文讲解

转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qextser

C#串口通信—向串口发送数据,同步接收返回数据

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

LabVIEW上位机与串口通信

渊源 大一的时候,学校开了门公共选修课,叫LabVIEW编程,当时的我当然还不知道LabVIEW是啥东东,但还是选了.上课的老师是机械学院的一个副教授,他给我们展示了好几个用LabVIEW做的项目,譬如油箱监控上位机等,已经不太记得了.后来随着学习单片机.ARM等的串口操作,有时候一个漂亮的上位机(尤其是能显示波形的上位机)在项目中给用户展示非常的有用.过了这么多年,虽然曾经也用LabVIEW写过简单的温度监控上位机,但这次再拿起LabVIEW又好像从头开始一样,语法几已忘记殆尽! 定义通信格式

Qt 串口通信

在Qt5之前,串口通信基本依赖于第三方库,下面是我曾接触过的串口通信类库: 名称 语言 平台   QextSerialPort QT C++ Win/Linux http://sourceforge.net/projects/qextserialport/files/ QSerialPort QT C++ QT5已经集成 libserial C++ Linux http://files.cnblogs.com/kyyblabla/libserial-0.5.2.gz.7z 以上串口通信类库通信过