精华内容
下载资源
问答
  • C#通过串口读取和发送数据,简单的串口读取发送数据例子,简单易懂,适合初学者,欢迎下载
  • C#读写串口数据Demo

    2018-07-07 10:38:22
    C#实现读写串口数据。用于自动化界面和板卡、PLC等通讯
  • C#读取串口数据封装, RS485、232 MODBUS通讯协议,亲测可用
  • C#串口通信时丢失数据的一种解决方法,刘凯,周云耀,C # 串行类( SerialPort )为串口通信提供了简便方法,且具有功能强大、通信快速、实时性好等特点。但在实际应用中,在串口高波特率大信
  • 串口通信,电子称数据读取。程序详细易懂,可以扩展到其他应用。 串口通信,电子称数据读取。程序详细易懂,可以扩展到其他应用。
  • 一、可能需要的软件: 1、虚拟串口vspd(Virtual Serial Port Driver,用来在电脑上虚拟出一对串口,模拟通讯。 2、友善串口调试助手,用来发送...5、通过串口读取数据,处理数据 6、关闭当前窗口时,将串口一并关...

    一、可能需要的软件:

    1、虚拟串口vspd(Virtual Serial Port Driver,用来在电脑上虚拟出一对串口,模拟通讯。

    2、友善串口调试助手,用来发送、读取数据。

    二、思路

    1、查询本机所有的串口

    2、判断需要的串口是否存在本机的串口中

    3、设置串口的参数,如波特率、奇偶校验等。

    4、打开串口,

    5、通过串口读取数据,处理数据

    6、关闭当前窗口时,将串口一并关闭。

    7、可以写一个定时器,来循环执行1、2两步,并判断串口是否打开,以保持串口通讯正常。

    三,代码

    1、查询本机所有的串口

             /// <summary>
            /// 获取本机串口列表
            /// </summary>
            /// <param name="isUseReg"></param>
            /// <returns></returns>
            private List<string> GetComlist(bool isUseReg)
            {
                List<string> list = new List<string>();
                try
                {
                    if (isUseReg)
                    {
                        RegistryKey RootKey = Registry.LocalMachine;
                        RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM");
    
                        String[] ComNames = Comkey.GetValueNames();
    
                        foreach (String ComNamekey in ComNames)
                        {
                            string TemS = Comkey.GetValue(ComNamekey).ToString();
                            list.Add(TemS);
                        }
                    }
                    else
                    {
                        foreach (string com in SerialPort.GetPortNames())  //自动获取串行口名称  
                            list.Add(com);
                    }
                }
                catch
                {
                    MessageBox.Show("串行端口检查异常!", "提示信息");
                    // System.Environment.Exit(0); //彻底退出应用程序   
                }
                return list;
            }

     

    2、判断需要的串口是否存在本机的串口中

             /// <summary>
            /// 判断是否存在当前串口
            /// </summary>
            private void StartSerialPortMonitor()
            {
                List<string> comList = GetComlist(false); //首先获取本机关联的串行端口列表     
                if (comList.Count == 0)
                {
                    MessageBox.Show("当前设备不存在串行端口!", "提示信息");
                    // System.Environment.Exit(0); //彻底退出应用程序   
                }
                else
                {
                    string targetCOMPort = "COM8";
                    //判断串口列表中是否存在目标串行端口
                    if (!comList.Contains(targetCOMPort))
                    {
                        MessageBox.Show("提示信息", "当前设备不存在配置的串行端口!");
                        //System.Environment.Exit(0); //彻底退出应用程序   
                    }
                }
            }

    3、设置串口的参数,如波特率、奇偶校验等。

    首先定义字段:

    private SerialPort serialPort;

             /// <summary>
            /// 设置通讯串口
            /// </summary>
            public void setcom()
            {
                try
                {
                    StartSerialPortMonitor();
                    serialPort.PortName = "COM8"; //通信端口
                    serialPort.BaudRate = 9600; //串行波特率
                    serialPort.DataBits = 8; //每个字节的标准数据位长度
                    serialPort.StopBits = StopBits.Two; //设置每个字节的标准停止位数
                    serialPort.Parity = Parity.None; //设置奇偶校验检查协议
                    //下面这句是当信息中有汉字时,能正确传输,不然会出现问号。
                    serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312");
                    //串口控件成员变量,字面意思为接收字节阀值,
                    //串口对象在收到这样长度的数据之后会触发事件处理函数
                    //一般都设为1
                    serialPort.ReceivedBytesThreshold = 1;
                    serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听)
    
                    serialPort.Open(); //打开串口
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
    
            }

    4、打开串口,

    5、通过串口读取数据,处理数据

             /// <summary>
            /// 通讯有数据进执行
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
            {
                getcom();
            }
            public void getcom()
            {
                try
                {
                    //定义一个字段,来保存串口传来的信息。
                    string str = "";
    
                    int len = serialPort.BytesToRead;
                    Byte[] readBuffer = new Byte[len];
                    serialPort.Read(readBuffer, 0, len);
                    str = Encoding.Default.GetString(readBuffer);
                          
    
                    //如果需要和界面上的控件交互显示数据,使用下面的方法。其中ttt是控件的名称。
                     //this.tttt.Dispatcher.Invoke(new Action(() =>
                    //{
                    //    tttt.Text = str ;
                    //}));
    
    
                    serialPort.DiscardInBuffer();  //清空接收缓冲区     
                    }
                      catch (Exception ex)
                {
                    serialPort.Close();
                    MessageBox.Show(ex.Message);
                }
           }
                

     

    6、关闭当前窗口时,将串口一并关闭。

    
            private void MainWindow1_Closed(object sender, EventArgs e)
            {
                if (serialPort.IsOpen)
                {
                    serialPort.Close();
                }
            }

     

    7、可以写一个定时器,来循环执行1、2两步,保持串口通讯正常。

    如果电脑不存在串口,提示警告

    如果目标串口不在电脑的串口列表里,提示警告,

    如果目标串口当前是关闭的状态,将其打开。

    如果串口已经打开,再次打开会报错,无法正常工作。一定要注意。

                 if (!serialPort.IsOpen)
                {
                    serialPort.Open();
                }

     

     

     

     

     

     

     

    展开全文
  • C#串口读取数字温湿度传感器数据,数据库保存历史数据,并虚线显示读取的温湿度信息,数据库保存历史数据,并虚线显示读取的温湿度信息,
  • 简单明了的利用SerialPort类读取和发送串口数据
  • visual studio 2012 c# wpf 开发串口收发数据demo,仅供学习测试使用,已测,可正常收发数据
  • C#读取串口数据画图

    2018-11-12 15:50:43
    同学在用FPGA做读卡器,上位机准备用labview做,因为不熟悉所以让我用C#做个备份,备不时之需。 菜鸟级别就跑去给人家帮忙,越帮越忙。...1、串口读取数据 2、读取的串口数据存储到txt中 3、在winform中画图
  • C# SerialPort连接串口读写串口数据

    千次阅读 2020-09-23 09:07:55
    C# SerialPort连接串口读写串口数据 一、起始 最近在公司做上位机,上位机要求是能够读取一款支持串口通信的传感器并且把传感器的数据用图表显示出来,且上位机能对传感器发送指令,需求有涉及到串口通信和绘制图表...

    C# SerialPort连接串口,读写串口数据

    一、起始

    最近在公司做上位机,上位机要求是能够读取一款支持串口通信的传感器并且把传感器的数据用图表显示出来,且上位机能对传感器发送指令,需求有涉及到串口通信和绘制图表。

    那么首先要解决的问题就是能够让电脑上的程序进行串口通信,有串口通信的编程语言有很多,C++,C#,JAVA,Python等语言都是支持串口通信的。我选择了使用C#,因为上位机主要是在Windows操作系统上运行,而C#对于winodws桌面应用的开发支持是比较方便的,功能也比较强大,尤其是WPF程序,做出来的UI页面比较好看

    那么本篇内容就介绍c#程序怎么实现串口通信

    二、工具准备

    开发工具:Visual Studio 2019 Community
    开发工具下载:免费的 IDE 和开发人员工具 | Visual Studio Community
    维特智能姿态角度传感器JY901模块1
    USB-TLL模块
    1、杜邦线*1
    在这里插入图片描述

    三、新建项目

    1.新建项目,选择WPF应用程序,你可能会发现两个 WPF 桌面模板,一个用于 .NET Framework,另一个用于 .NET Core。 .NET Core 模板在 Visual Studio 2019 16.3 及更高版本中可用。 你可以在本教程中使用任何一个,但建议使用 .NET Core 进行新的开发。
    在这里插入图片描述
    2.在下一屏幕中指定“项目名称”和选择“项目路径”,然后点击“创建”
    在这里插入图片描述

    四、添加串口通信引用

    1.右击项目解决方案“管理NuGet程序包”,搜索“Ports”关键字,添加System.IO.Ports引用。System.IO.Ports包是.Net 2.0以来集成的免费的串口通信包,
    在这里插入图片描述

    五、建立串口通信工具类

    创建SerialPortUtils工具类,为了后面能够方便的操作串口我们先实现一个串口操作的工具类,串口通信中用到最多的操作就是“搜索串口”,”打开/关闭串口“,”接收数据“,“发送数据”,我们可以先实现以上操作的方法。
    在这里插入图片描述

    搜索串口实现,搜索串口可以直接调用SerialPort类的GetPortNames方法,该方法会返回一个串口名称的string数组。
    在这里插入图片描述

    打开关闭串口实现,这里传入“串口名称”和“波特率”参数打开串口,如果有需要其他参数可以修改方法参数。打开串口后把ReceiveData做为接收事件的委托。
    在这里插入图片描述

    接收串口数据的委托方法实现,sender对象为串口对象,接收数据后直接向控制台打印数据
    在这里插入图片描述
    发送数据实现,检查串口是否打开,然后向串口发送数据并且打印到控制台,这样一个简单的串口通信工具类就实现了
    在这里插入图片描述

    六、SerialPortUtils工具类完整代码

    public class SerialPortUtils
        {
    
            public static string[] GetPortNames() {
                return SerialPort.GetPortNames();
            }
    
    
            public static SerialPort SerialPort = null; 
            public static SerialPort OpenClosePort(string comName,int baud)
            {
                //串口未打开
                if (SerialPort == null|| !SerialPort.IsOpen)
                {
                    SerialPort = new SerialPort();
                    //串口名称
                    SerialPort.PortName = comName;
                    //波特率
                    SerialPort.BaudRate = baud;
                    //数据位
                    SerialPort.DataBits = 8;
                    //停止位
                    SerialPort.StopBits = StopBits.One;
                    //校验位
                    SerialPort.Parity = Parity.None;
                    //打开串口
                    SerialPort.Open();
                    //串口数据接收事件实现
                    SerialPort.DataReceived += new SerialDataReceivedEventHandler(ReceiveData);
    
                    return SerialPort;
                }
                //串口已经打开
                else 
                {
                    SerialPort.Close();
                    return SerialPort;
                }
            }
    
            public static void ReceiveData(object sender, SerialDataReceivedEventArgs e) {
                SerialPort _SerialPort = (SerialPort)sender;
    
                int _bytesToRead = _SerialPort.BytesToRead;
                byte[] recvData = new byte[_bytesToRead];
    
                _SerialPort.Read(recvData, 0, _bytesToRead);
    
                //向控制台打印数据
                Debug.WriteLine("收到数据:"+ recvData);
            }
    
            public static bool SendData(byte[] data)
            {
                if (SerialPort != null && SerialPort.IsOpen)
                {
                    SerialPort.Write(data, 0, data.Length);
                    Debug.WriteLine("发送数据:" + data);
                    return true;
                }
                else {
                    return false;
                }
            }
    
        }
    

    七、工具类收发数据演示

    JY901连接我的电脑是COM3

    测试方法,在MainWindow创建testSerialPortUtils方法,testSerialPortUtils方法先搜索一遍串口,打印所有串口的名称;然后打开COM3,向COM3发送一条指令

    调试输出结果

    COM3
    发送数据:System.Byte[]
    收到数据:System.Byte[]
    收到数据:System.Byte[]
    收到数据:System.Byte[]
    收到数据:System.Byte[]
    收到数据:System.Byte[]
    

    调试后发现输出的数据是一个Byte数组,是的在串口开发中收到的数据都是byte形式的,在串口开发过程中经常会遇到byte数据和二进制、十进制、十六进制的数据。下一篇“C#十六进制、十进制、二进制、字符串数据互转”将详细介绍串口开发中用到的数据装换
    八、结语

    再为大家介绍一个优秀的C#开源串口助手项目

    码云OSDA开源串口助手项目地址:Leven/OSDA

    感谢阅读本篇“C# SerialPort连接串口,读取串口数据”,本篇到此结束,下一篇“C#十六进制、十进制、二进制、字符串数据互转”

    展开全文
  • C#实现打开串口,关闭串口,利用串口接收和发送数据,并且能把数据实时显示在屏幕上,实现世博功能!
  • C#接收串口数据

    2016-12-29 13:01:51
    基于C# winform,建立监听线程,读取串口数据
  • C#串口接收数据保存到数据库
  • C# 串口数据采集小DEMO

    2015-06-29 11:57:47
    C# 串口数据采集小DEMO
  • 文章目录原方案代码基本思路串口通信基本原理采集数据流程问题重构问题复盘重构过程ReadTo函数多线程代码 原方案 欢迎大家访问我的个人网站 www.joezhouman.com 查看原文 首先说明一下,我对串口通信的理解不深,...

    原方案

    欢迎大家访问我的个人网站 www.joezhouman.com 查看原文
    首先说明一下,我对串口通信的理解不深,所有关于这方面的说明会有很多纰漏,有时会词不达意,各位图一乐就好。

    代码

    private char _start; // 起始位标志
    private char _end;   // 结束位标志
    private string recvstr;         // 用于存储一组数据的全局变量
    
    public void sendMsg(){
        Thread thread;
        thread = new Thread(() =>//新开线程,执行接收数据操作
        {
            while (enablescan)//如果标识为true
            {
                Thread.Sleep(1);
                try
                {
                    serialPort1.WriteLine(":READ?");
                    Thread.Sleep(AppCfg.devicepara.Scan_interval);
                }
                catch (Exception ex){;}
            }
        });
        thread.Start();//启动线程
        thread.IsBackground = true;
    }
    
    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                string str = serialPort1.ReadExisting();
                if (str.IndexOf(_start) != -1)//当前数据存在起始位
                {
                    str = str.Substring(str.IndexOf(_start), str.Length - str.IndexOf(_start);//截取起始位到字符串末尾
                }
                if(str.IndexOf(_end==-1)//当前数据不存在结束位
                    recvstr += str;
                else{//当前数据存在起始位
                    str = str.Substring(0, str.IndexOf(_end);
                    recvstr = recvstr + str;
                    DoSomething(recvstr)//对一组串口数据进行其他处理
                    recvstr = "";//清空数据
                }
                
            }
    

    基本思路

    串口通信基本原理

    说先说明一下采集仪发送数据的方式。一组数据一般由一个起始位标识开始,由一个结束位标识结束,中间为实际数据字符。
    我们以S表示起始位,E表示结束位,D表示有效数据,那么一组数据是这样的

    SDDDDDDDDDDDDDDE

    而且,一组数据一般不是一次完整发送过来的,而是分段发送, 如:

    SDDD
    DDDD
    DDDD
    DDDE

    发送过来的数据会放在串口通信的缓存区里。

    采集数据流程

    1. 开始采集, enablescanfalse 变为 true
    2. 开启新线程,若检测到enablescantrue,则每个一段时间向采集仪发送采集信号
    3. 采集仪向串口发送数据,将数据放入缓冲区
    4. 串口接收到数据后触发serialPort_DataRecived事件,取走当前缓冲区的所有数据,进行处理(详细处理的方式见代码)
    5. 数据处理完后,退出serialPort_DataRecived函数,等待事件的下一次触发
    6. 停止采集,enablescantrue 变为 false
    7. 发送数据的线程检测到enablescanfalse,结束工作,销毁线程。

    问题

    在实际使用中,接受到的数据经常会缺失一部分,DoSomething时经常会抛出异常,造成了很大的困扰。

    最开始的思路是用try...catch捕获异常,丢掉有问题的数据,但有时不赶巧,一组正常的数据都没有,而且这一问题出现的频率不低。
    痛定思痛,决定重构这一祖传代码,真是前人拉屎总不冲,后人难忍终清洁

    重构

    问题复盘

    我们首先复盘一下问题发生的过程
    正常的过程应该是这样的

    采集仪动作接收事件当前缓存区strrecvstr
    开始待命中nullnullnull
    发送数据触发事件SDDDSDDDSDDD
    发送数据-处理中-DDDDSDDDSDDD
    -发送间隔-处理完成DDDDSDDDSDDD
    发送数据触发事件DDDDDDDEDDDDDDDESDDDDDDDDDDE
    开始休息处理完成nullnullnull

    产生错误时:

    采集仪动作接收事件当前缓存区strrecvstr
    开始待命中nullnullnull
    发送数据触发事件SDDDSDDDSDDD
    发送数据-处理中-DDDDSDDDSDDD
    发送数据-处理中-DDDDDDDESDDDSDDD
    -待机-处理完成DDDDDDDESDDDSDDD
    -待机--待命中-DDDDDDDESDDDSDDD
    发送数据触发事件DDDDDDDESDDDSDDDSDDDSDDD

    看,原本应该接收到SDDDDDDDDDDESDDD...,现在真正这组收到的是SDDDSDDD...,部分数据丢失。

    对源代码进行修改太麻烦,故而选择直接重构该部分功能。

    重构过程

    ReadTo函数

    首先想到的是,难到不能读到一组完整的数据再进行处理吗?

    其实是可以的。C#内置了ReadTo方法 查看MSDN

    一直读到结束位标识后,再这一组数据放到指定的参数中,底层肯定有一些细节,总而言之,可以保证每次读到一组完整的数据。

    其用法为

        string endStr = ((char)13).ToString
        string targetStr = SerialPort.ReadTo("endStr");
    

    多线程

    ReadTo解决了数据读取的问题,然而当该方法在读取数据时,整个一直在等待,等读取成功后,再执行之后的操作,在这个等待过程中,
    其他任何的触发事件都无法完成,呈现出的效果就是软件“卡住了”。

    未解决这一问题,我们可以采用多线程的方法。一个线程专门负责读取数据,一个线程处理数据。
    为了几个线程之间的通信,我们设计一个
    读到的数据不断放入中,另一个线程不断从中提取数据。除此之外,我们还要保证先放入池中的数据先被处理。

    根据以上特点,我们自然而然的想到了一种先入先出的数据结构–队列


    说句题外话,老有人说小学时的问题一个池子,一边注水,一边放水这种问题很傻,没有现实意义。。。其实现实中处处都有。
    不一定是真实的,也可以是抽象的


    话不多说,上代码。

    代码

    private char _start; // 起始位标志
    private char _end ;   // 结束位标志
    private private Queue<string> _serialPortData; // 数据池
    
    ///<summary>
    ///向测试仪发送读取信号及接受测试仪发回数据的线程。根据之前所说ReadTo的性质,正好保证读完一组数据后,再发送指令让测试仪测试下一组数据
    ///<summary>
    public void ReadDataThread() {
        _enableScan = true;
        Thread thread = new Thread(() => //新开线程,执行接收数据操作
        {
             while (_enableScan) //如果标识为true
            {
                Thread.Sleep(1);
                try {
                    serialPort1.WriteLine(":READ?");
                    Thread.Sleep(10);
                    if (serialPort1.BytesToRead != 0) _serialPortData.Enqueue(serialPort1.ReadTo(_end));//将读到的数据放入池中
                    Thread.Sleep(100);
                }
                catch (Exception ex) {//其他的改进
                    HandleException(ex);//加上异常处理,是系统更稳健
                    Log.Error(ex);//打logger,记录异常原因,为修改bug提供依据
                }
            }
        });
        thread.Start(); //启动线程
        thread.IsBackground = true;//线程在后台运行
    }
    
    public void SolveDataThread(){
        Thread thread = new Thread(() => //新开线程,执行接收数据操作
        {
            while (_enableScan) //如果标识为true
            {
                if (_serialPortData.Count == 0)continue; 
                try{
                    string str = _serialPortData.Dequeue();//从池中读取数据
                    DoSomething(str);
                    thread.Sleep(100);
                }
                catch (Exception ex) {//其他的改进
                    HandleException(ex);//加上异常处理,是系统更稳健
                    Log.Error(ex);//打logger,记录异常原因,为修改bug提供依据
                }
            }
    }
    
    
    

    信息说明都在代码注释里。

    展开全文
  • 这是个人做的一个实用小项目,主要用于与下位机设备通信,将下位机采集的数据实时显示并记录,界面设计参考Windows任务管理器 这是个人做的一个实用小项目,主要用于与下位机设备通信,将下位机采集的数据实时显示...
  • 以网上某位大虾的源码为版本,沿用了其可用的代码部分。对其余欠妥部分进行了改造。不要资源分,是大家不用为积分而烦恼。出来混都不容易,希望大家相互照应!
  • 自己学习C#开发时候练习写的串口传输程序,并将接受文本框的文本按空格分开存档到数据库中供查询的想修改,其中DataReceived事件我没有定义太复杂,而是将数据转存到一个list中缓存,之后再供主线程处理,不知这种...
  • c#(winform)通过串口读取并解析数据

    千次阅读 多人点赞 2020-02-03 09:38:42
    在开发过程中,有时会遇到通过串口读取地磅等数据,但是在真实的环境测试也不方便,这时使用虚拟串口工具就显得非常方便了,虚拟出两个串口,一个模拟发送数据,一个模拟接收数据。 虚拟串口工具:Configure ...

    1、工具选择

    在开发过程中,有时会遇到通过串口读取地磅等数据,但是在真实的环境测试也不方便,这时使用虚拟串口工具就显得非常方便了,虚拟出两个串口,一个模拟发送数据,一个模拟接收数据。

    虚拟串口工具:Configure Virtual Serial Port Driver 

    串口调试工具:Serial Port Utility

    2、程序编写

    2.1 winform 中使用串口就需要在左侧工具箱里拖入一个serialPort,如下图所示

                                                    

    2.2 初始化串口

    public SerialPort serialPort;
    private bool Listening = false;//是否没有执行完invoke相关操作   
    private bool Closing = false;//是否正在关闭串口,执行Application.DoEvents,并阻止再次invoke   
    #region 初始化串口
            private void InitPort()
            {
                try
                {
                    serialPort1.PortName = "COM1";
                    serialPort1.BaudRate = 4800;
                    serialPort1.DataBits = 8;
                    serialPort1.Parity = Parity.None;
                    serialPort1.StopBits = StopBits.One;
                    serialPort1.WriteTimeout = 3000;
                    serialPort1.ReadTimeout = 3000;
                    serialPort1.ReceivedBytesThreshold = 1;
                    serialPort1.DtrEnable = true;
                    serialPort1.RtsEnable = true;
                    updateText = new UpdateTextEventHandler(UpdateTextBox);  //实例化委托对象
                    serialPort1.Handshake = Handshake.RequestToSend;
                    serialPort1.Open();
                    //MessageBox.Show("开始");
                    button3.Text = "关闭串口";
                    serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            #endregion

    2.3 串口获取数据

    我解析这个吊钩秤是通过称一直向外发送数据,程序解析数据,通过截取字符串,获取两个空白之间的数据并显示在文本框上

    #region  串口获取数据
            public void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
                try
                {
                    Listening = true;//设置标记,说明我已经开始处理数据,一会儿要使用系统UI的。
                    Thread.Sleep(600);
    
                    string SDateTemp = "";
                    int len = serialPort1.BytesToRead;
    
                    Byte[] readBuffer = new Byte[len];
                    serialPort1.Read(readBuffer, 0, len);
    
                    SDateTemp = Encoding.Default.GetString(readBuffer);
                    //MessageBox.Show(SDateTemp);
    
    
                    int L = SDateTemp.IndexOf(" ");
                    int length = SDateTemp.Length;
                    string str1 = SDateTemp.Substring(L, length - L).Trim();
    
                    int L2 = str1.IndexOf(" ");
                    int length2 = str1.Length;
                    str2 = str1.Substring(0, L2).Trim();
    
                    if (!string.IsNullOrEmpty(str2))
                    {
                        this.BeginInvoke(new UpdateTextEventHandler(UpdateTextBox), new string[] { str2 });
                        //SDateTemp = GetValue(SDateTemp, "@G002", "kg").Trim(); //多少kg
                    }
    
                    //this.Invoke(new UpdateTextEventHandler(UpdateTextBox), new string[] { SDateTemp });
                    
                }
                finally
                {
                    Listening = false;//我用完了,ui可以关闭串口了。   
                }
            }
            #endregion

    2.4 到文本框进行显示

    private void UpdateTextBox(string text)
            {
                if (!string.IsNullOrEmpty(text))
                {
                    textBox6.Text = text;
                }
            }

    3、正则解析

    如果串口发送的数据时规范的并且可以用正则解析的话,可以使用下边的方法。

    #region 获得字符串中开始和结束字符串之间的值
            /// <summary>
            /// 获得字符串中开始和结束字符串之间的值
            /// </summary>
            /// <param name="str">字符串</param>
            /// <param name="A">开始</param>
            /// <param name="B">结束</param>
            /// <returns></returns> 
    public static string GetValue(string str, string A, string B)
            {
                Regex rg = new Regex("(?<=(" + A + "))[.\\s\\S]*?(?=(" + B + "))", RegexOptions.Multiline | RegexOptions.Singleline);
                //Regex rg = new Regex("(?<=(" + A + "))[.\\d]*?(?=(" + B + "))", RegexOptions.Multiline | RegexOptions.Singleline);
    
                return rg.Match(str).Value;
            }
            #endregion

    如果采用了上边GetValue方法的话,在serialPort1_DataReceived 方法中,带注释的两行就需要取消注释使用。

    展开全文
  • C# 串口读取中文数据

    千次阅读 2019-07-12 19:16:12
    一开始是用str方式从串口读取数据。然后在网上找了一堆utf8转gb2312的代码.并没有什么用。 然后就像是不是不应该以string的方式读取。果然,解决了问题。 串口接收中文数据代码: /******************接收...
  • //延时100ms等待接收完数据 // this.Invoke就是跨线程访问ui的方法 this.Invoke((EventHandler) (delegate { if (isHex == false) { tbxRecvData.Text += sp.ReadLine(); } else { Byte...
  • c# 打开本机串口接收发送 程序 以及MODBUS 数据CRC校验适用于初级通讯,如有其它需要可以联系我
  • c# 串口获取数据

    千次阅读 2019-03-06 17:00:52
    有很多场景应用到串口操作,比如:地磅、超市收银(串口扫码)、工业机械控制(和PLC的交互、和普通硬件的交互),今天分享一下基础版的串口操作。 using System; using System.Collections.Generic; using System...
  • c#串口接收数据之后同时发送另外两个虚拟串口,虚拟串口供另外两个程序使用,解决一个串口数据库多个程序同时读取问题
  • C# SerialPort 串口读写

    万次阅读 多人点赞 2016-10-16 22:09:48
    串口发送接收数据,支持大量数据交互
  • C#串口接发数据测试源码,vs2010开发,winfrom程序,源码简单易懂,适合初学者参考开发
  • C#编写的串口数据接收保存

    热门讨论 2014-12-08 15:19:50
    本压缩文件是一个完整的C#编写的串口采集软件,可以实时接收串口数据并显示在文本框内,以Excel表格的形式实时记录储存数据,含有全部代码和界面设计等,也可直接使用.本人采用的是vs2010,若有下载后不能使用的请给我...
  • 在工业嘈杂的生产环境中,可能发生各种意外...c#读写串口缓冲区,发送比较简单。 接收包格式:起始头+标志位+数据位+结束尾,先收到缓冲区里暂存,然后从缓冲区里检查起始位、结束尾。无效串口数据丢弃,有效数据处理。
  • c# 串口类 纯异步接收

    2018-01-14 17:54:20
    系统自用 ,通过事件触发接收数据,需要的人可以拿走。。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,097
精华内容 2,438
关键字:

c#串口读取数据

c# 订阅