精华内容
下载资源
问答
  • C#串口数据接收

    2013-12-29 10:28:08
    本源代码是在win7下利用vs2010开发的C#串口接收数据界面,类似于串口助手。上传的是完整的工程文件。
  • C# 数据更新是在Timer,分析:可能是在进行time任务时,不能进行invoke接收任务。之后我打算开个多线程试试或把接收中处理精简看看能不能收到。 private void Form1_Load(object sender, EventArgs e)  { …….. ...
  •  //接收数据并显示函数:可用:测试的接收数据为:0x01 0x02(镇头) 0x02(长度) 0x03(帧尾、即校验位) 0x34 0x05(数据):这是硬件发送过来的测试数据  private void DataReceivedHandler(object sender, ...
    
    

      
     string strs3 = null;
    


            //接收数据并显示函数:可用:测试的接收数据为:0x01 0x02(镇头) 0x02(长度)  0x03(帧尾、即校验位) 0x34 0x05(数据):这是硬件发送过来的测试数据
            private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件
            {

                int n = mySerialPort.BytesToRead;//获取接收缓冲区读取的字节数;
                byte[] buf = new byte[n];//创建n个字节的缓存;
                mySerialPort.Read(buf, 0, n);//读取数据存储到buffer.
                byte[] ReceiveByte = new byte[256];//建立接收数据处理的buffer。
                buffer.AddRange(buf);//缓存数据
                //完整性判断
                while (buffer.Count >= 4)
                {
                    if (buffer[0] == 0x01)//检测针头
                    {
                        int len = buffer[2];//拿到接收数据的长度
                        if (buffer.Count < len + 4)
                        {
                            break;
                        }
                        buffer.CopyTo(0, ReceiveByte, 0, len + 4);//将接受的数据存储到ReceiveByte字节数组里面
                        byte jiaoyan;
                        jiaoyan = 0x03;//设置校验位
                        if (jiaoyan != ReceiveByte[3])
                        {
                            buffer.RemoveRange(0,len + 4);
                            continue;
                        }
                        buffer.RemoveRange(0, len + 4);跳出循环了
                        //开始处理数据

    DataProcess()

    {                  strs3 = ReceiveByte[4].ToString();
                        this.Dispatcher.BeginInvoke(new Action(() => txtBox1.Text = strs3));
    }


                     
                    }
                    else //帧头不正确时,记得清除
                    {
                        buffer.RemoveAt(0);//清除第一个字节,继续检测下一个。
                    }
                }


                }           


            }

    展开全文
  • c#中创建串口接收串口发送来的数据,存在以下两种情况会出现异常,第一 当使用串口模拟软件进行串口通信过程数据可以正常接收和显示,而在接收设备发送的数据的时候存在显示的遗漏和缺失的问题。如果遇到这种...

    在c#中创建串口并接收串口发送来的数据,存在以下两种情况会出现异常,第一 当使用串口模拟软件进行串口通信过程数据可以正常接收和显示,而在接收设备发送的数据的时候存在显示的遗漏和缺失的问题。如果遇到这种问题请检测串口的波特率是否正常。

    9600bps
    == 9600 bits per second
    == 9600 比特每秒
    == 1200 bytes per second
    == 1200 字节每秒
    == 72000 bytes per minute
    == 72000 字节每分钟
    == 72000 ASCII 字符每分钟

    一般情况下串口的波特率位9600bps通过比特率计算接收该数据需要的时间。

    切记 串口数据的获取一定要等到数据全部接收以后再进行处理。

    展开全文
  • 方法一是:port_DataReceived(SerialPort控件的数据接收方法,当有数据来临时会触发)会创建一个线程,因此当串口在等待数据时,不影响主窗体或主线程的操作。方法二是:使用缓存机制(参考:...

    项目需要实现下位机和上位机的数据传输,看了网上的很多上位机的处理方法主要有两种。方法一是:port_DataReceived(SerialPort控件的数据接收方法,当有数据来临时会触发)会创建一个线程,因此当串口在等待数据时,不影响主窗体或主线程的操作。方法二是:使用缓存机制(参考:http://blog.csdn.net/jiqiang_paul/article/details/6914619)。首先通过定义一个成员变量List ReceBuf  new List(4096);用来存放所有的数据,在接收函数里,通过RecBuf.AddRange()方法不断地将接收到的数据加入到ReceBuf中,并同时对Recebuf中的数据进行检验,如果达到一定的长度并且校验结果正确(校验方法在发送方和接收方一致),再进行处理。

    经过测试发现这两种方法在数据包发送间隔小于200ms时,会出现数据丢包的问题,现在将这两种方法结合起来,同时将方法二改进为双缓存机制,经过测试发现可以解决数据的丢包的问题。
    一、在 public MainForm()中定义串口数据接收事件
      public MainForm()
            {
                InitializeComponent();
                serialPort_port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//串口接收事件
                System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;//关闭夸线程检查
            }
    二、MainForm类下定义接收事件的委托并编写接收程序
     
      public delegate void PortDelegate();
            private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                PortDelegate proc_PORTGETDATA = new PortDelegate(getComData);
                IAsyncResult async_PORTGETDATA = proc_PORTGETDATA.BeginInvoke(null, null);
            }
    private List ReceBuffer = new List(4096);//串口接收一级缓存,默认分配一页内存并始终不超过 
     private byte[] DataTemp = new byte[10];//从一级缓存拷贝到二级缓存 
     private List DataBuf = new List(1000);//串口接收二级缓存,默认分配1000并始终不超过
     private byte[] DataTemp2 = new byte[10];//从二级缓存拷贝出来分析
     private byte[] DataAnalyBuf = new byte[8]; 
     public void getComData()
     { 
     try
     { 
     int n = serialPort_port.BytesToRead; 
     byte[] Receive = new byte[n]; 
     serialPort_port.Read(Receive, 0, Receive.Length); 
     bool DataCatched = false;//数据可以分析的标志
     //缓存数据 
     ReceBuffer.AddRange(Receive); 
     //完整性判断 
     while(ReceBuffer.Count >= 10)
     { 
     查看帧首和尾数据,判断准确性 
    //这里可以写成对数据的校验如CRC
    if (ReceBuffer[0] == 0x50 && ReceBuffer[9] == 0x42) 
     { 
     ReceBuffer.CopyTo(0, DataTemp, 0, 10); 
     DataBuf.AddRange(DataTemp); 
    DataCatched = true; 
     ReceBuffer.RemoveRange(0, 10);//获得一条正确的数据,删除缓存
     }
     else
     { 
     ReceBuffer.RemoveAt(0);//不是数据头,删除数据
     }
     }
     //分析数据 
     if (DataCatched == true) 
     { 
     while (DataBuf.Count > 0)
     {
     DataBuf.CopyTo(0,DataTemp2,0,10); 
    在这里写自己的数据分析
    DataBuf.RemoveRange(0, 10);
     } 
     }
     } catch { } 
     }

    转载于:https://www.cnblogs.com/cmblogs/p/11129313.html

    展开全文
  • C# 串口接收数据处理时遇到队列有值,但报错InvalidOperationException,队列为空的问题。 代码如下:private void dataProcessing() { byte[] data = new byte[2] {0,0}; float sensor_data = 0f;//用来记录...
  • C# SerialPort IO操作 支持大数据收发

    热门讨论 2016-10-16 22:05:44
    支持串口大量数据读写操作,能一次性读取数据,通过设置超时大小控制一次读取串口所有数据。支持事件触发,异步发送接收数据。附件有demo,可下载Virtual Serial Port Driver模拟串口测试。
  • private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件 { if (!checkBox2.Checked)//如果接收模式为字符模式 { string str = serialPort1.ReadExisting();//字符...

     主要程序来自洋桃电子。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    using System.IO.Ports;
    
    namespace ck
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                CheckForIllegalCrossThreadCalls = false;
    
            }
    
           
    
            private void TextBox1_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void Button1_Click(object sender, EventArgs e)
            {
    
                try
                {
                    serialPort1.PortName = comboBox1.Text;
                    serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);//十进制数据转换
                    serialPort1.Open();
                    button1.Enabled = false;//打开串口按钮不可用
                    button2.Enabled = true;//关闭串口
                }
                catch
                {
                    // MessageBox.Show("端口错误,请检查串口", "错误");
                    MessageBox.Show("端口错误,请检查串口", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    
                }
            }
    
            private void TextBox2_TextChanged(object sender, EventArgs e)
            {
    
            }
    
            private void Button2_Click(object sender, EventArgs e)
            {
                try
                {
                    serialPort1.Close();//关闭串口
                    button1.Enabled = true;//打开串口按钮可用
                    button2.Enabled = false;//关闭串口按钮不可用
                }
                catch (Exception err)//一般情况下关闭串口不会出错,所以不需要加处理程序
                {
    
                }
            }
    
            private void Button3_Click(object sender, EventArgs e)
            {
                byte[] Data = new byte[1];//只存储一个字节,跟新一下,发送下一个字节
                if (serialPort1.IsOpen)//判断串口是否打开,如果打开执行下一步操作
                {
                    if (textBox2.Text != "")
                    {
                        if (!checkBox1.Checked)//如果发送模式是字符模式
                        {
                            try
                            {
                                serialPort1.WriteLine(textBox2.Text);//写数据
                            }
                            catch (Exception err)
                            {
                                MessageBox.Show("串口数据写入错误", "错误");//出错提示
                                serialPort1.Close();
                                button1.Enabled = true;//打开串口按钮可用
    
                                button2.Enabled = false;//关闭串口按钮不可用
                            }
                        }
                        else
                        {
                            for (int i = 0; i < (textBox2.Text.Length - textBox2.Text.Length % 2) / 2; i++)//取余3运算作用是防止用户输入的字符为奇数个
                            {
                                Data[0] = Convert.ToByte(textBox2.Text.Substring(i * 2, 2), 16);
                                serialPort1.Write(Data, 0, 1);//循环发送(如果输入字符为0A0BB,则只发送0A,0B)
                            }
                            if (textBox2.Text.Length % 2 != 0)//剩下一位单独处理
                            {
                                Data[0] = Convert.ToByte(textBox2.Text.Substring(textBox2.Text.Length - 1, 1), 16);//单独发送B(0B)
                                serialPort1.Write(Data, 0, 1);//发送
                            }
                        }
                    }
                }
            }
    
            private void ComboBox1_SelectedIndexChanged(object sender, EventArgs e)
            {
    
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                for (int i = 1; i < 13; i++)
                {
                    comboBox1.Items.Add("COM" + i.ToString());
                }
                comboBox1.Text = "COM1";//串口号多额默认值
                comboBox2.Text = "9600";//波特率默认值
    
                /*****************非常重要************************/
    
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//必须手动添加事件处理程序
    
            }
            private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)//串口数据接收事件
            {
                if (!checkBox2.Checked)//如果接收模式为字符模式
                {
                  
                    string str = serialPort1.ReadExisting();//字符串方式读
                    textBox1.AppendText(str);//添加内容
                  
                }
                else
                { //如果接收模式为数值接收
                    byte data;
             
                    data = (byte)serialPort1.ReadByte();//此处需要强制类型转换,将(int)类型数据转换为(byte类型数据,不必考虑是否会丢失数据
                    string str = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串
                    textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位补“0”   
                    //上一句等同为:if(str.Length == 1)
                    //                  str = "0" + str;
                    //              else 
                    //                  str = str;
                    //              textBox1.AppendText("0x" + str);
                }
            }
            private void RadioButton3_CheckedChanged(object sender, EventArgs e)
            {
    
            }
    
            private void RadioButton1_CheckedChanged(object sender, EventArgs e)
            {
    
            }
    
        
            private void ComboBox2_SelectedIndexChanged(object sender, EventArgs e)
            {
    
            }
    
            private void Button4_Click(object sender, EventArgs e)
            {
                SearchAndAddSerialToComboBox(serialPort1, comboBox1);
            }
            private void SearchAndAddSerialToComboBox(SerialPort MyPort, ComboBox MyBox)
            {                                                               //将可用端口号添加到ComboBox
                string[] MyString = new string[20];                         //最多容纳20个,太多会影响调试效率
                string Buffer;                                              //缓存
                MyBox.Items.Clear();                                        //清空ComboBox内容
                for (int i = 1; i < 20; i++)                                //循环
                {
                    try                                                     //核心原理是依靠try和catch完成遍历
                    {
                        Buffer = "COM" + i.ToString();
                        MyPort.PortName = Buffer;
                        MyPort.Open();                                      //如果失败,后面的代码不会执行
                        MyString[i - 1] = Buffer;
                        MyBox.Items.Add(Buffer);                            //打开成功,添加至下俩列表
                        MyPort.Close();                                     //关闭
                    }
                    catch
                    {
    
                    }
                }
                MyBox.Text = MyString[0];                                   //初始化
            }
    
            private void Button5_Click(object sender, EventArgs e)
            {
                textBox1.Clear();
            }
    
            private void RadioButton2_CheckedChanged(object sender, EventArgs e)
            {
    
            }
    
            private void RadioButton4_CheckedChanged(object sender, EventArgs e)
            {
    
            }
    
            private void Label1_Click(object sender, EventArgs e)
            {
    
            }
    
            private void Button6_Click(object sender, EventArgs e)
            {
                textBox2.Clear();
            
            }
    
            private void CheckBox1_CheckedChanged(object sender, EventArgs e)
            {
    
            }
    
            private void CheckBox2_CheckedChanged(object sender, EventArgs e)
            {
    
            }
        }
    }
    

     

    展开全文
  • 这是一个C#串口编程的入门级程序,可以实现简单的数据发送和接收,大家可以下载下来之后学习一下,因为主要是为了演示串口编程,所以程序中很多可能发生异常的地方没有添加try和catch语句。
  • 文本方式的数据比较容易分析。如果数据缓存,可以考虑用StringBuilder。或是不缓存也可以。文本格式数据大多有换行结尾。稍微修改即可。例如分析常见的NMEA 0183格式的卫星坐标数据GGA。 $GPGGA,121252.000,3937....
  • C#串口SerialPort常用属性方法

    千次阅读 2021-03-07 16:42:51
    得到 接收数据的字节数.BytesToWrites;得到送往串口的字节数.DataBits;获取或设置数据位.IsOpen;获取一个值,判断串口是否打开.Pariy;获取或设置校验位.PortName;串口名称.ReadBufferSize;获取或设置读取数据的...
  • 问题描述# 前几天用SerialPort类写一个串口的测试程序,关闭串口的时候会让界面卡死。...参考文章C# 串口操作系列(2) – 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?文章的解决方法和网上的大部分
  • 在简单的认识及使用串口通信之后,在实际应用中应该是配合硬件,和负责硬件通信的同事沟通好通信协议,来进行设备的控制及数据获取。 常用的串行通信协议有TTL电平(普通MCU芯片输出的串口电平)、RS232(工业上常用...
  • 广泛应用于单片机控制领域的数据监控、数据采集、数据分析等工作,可以帮助串口应用设计、开发、测试人员检查所开发的串口应用软硬件的数据收发状况,提高开发的速度,成为您的串口应用的开发助手。
  • C# 串口工具开发

    2021-09-07 17:00:38
    在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形、温度等)、用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的: USB转串口 —— ...
  • c#串口通讯架构类

    2012-01-11 17:38:58
    这个类是上位机串口编程的框架类,用单例模式多线程实现了串口数据接收和发送及错误处理,每个命令都对应有相应的命令事件,发送命令后在注册的事件种可以分析和处理相应的数据,协议的命令可以自行修改您所需的...
  • 串口接收4通道数据,传输格式为7F F7 D1 D2 D3 D4,格式为这样的可以直接使用,数据有转化,可以按照自己的要求自定义转化公式。数据可以保存为txt文档,一建分析频谱,注意设置采样频率。
  • C# 串口SerialPort控件

    2021-12-31 21:53:39
    串口对于工控领域应用较为广泛
  • 本人最近做一个项目时需要把串口接收到的数据进行分析数据量较大,比如5秒钟保存一次,连续工作一天,本人刚接触c#,串口通讯协议已写好,现在的问题是怎么把数据保存在Excel表格中以便分析?各位大神有没有用C#做...
  • C#串口上位机工具,接收到发过来的一串16进制数据,格式如下: FA AF 00 08 FF 31 32 33 34 FA AF 00 07 FF 35 36 后面可能还会有FA AF开头的 这串数据分析如下:识别FA AF为固定开始的头,紧接着后面的两个00 08为...
  • c# 运用serialport与PLC串口通讯程序,小白看不太懂下的程序,求大神帮忙分析下,主要想知道程序中的tebox1、textbox4、textbox5、textbox6、textbox7分别对应图中哪个空,对应的空应填写什么,例如想读取三菱F3X系列...
  • 这两天由于项目需要,调试了一下C#串口通讯,参考了以前做的Android项目所用的设计模式: 父类DataTransport设计成单例模式,程序始终保持只有一种通讯链路,DataTransport中的方法都由子类实现。 由于对C#不是...
  • c#编写串口通讯代码 多线程实现.rar

    热门讨论 2011-07-30 12:18:09
    c#编写串口通讯代码 多线程实现.rarc#编写串口通讯代码 多线程实现.rarc#编写串口通讯代码 多线程实现.rar
  • C# 串口开发填坑记

    2020-12-30 13:23:46
    因为,串口接收和界面显示更新不属于同一线程,如果在接收到串口数据后就直接更新到UI,报错: 解决方案: this.BeginInvoke((EventHandler)(delegate { //在这里给控件赋值 })); 2. 关闭串口界面卡死 之前的...
  • c#串口编程(转)

    2020-12-18 21:42:54
    在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形、温度等)、用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的:USB转串口 —— 上位机和下位...
  • 最近做了一个项目,上位机向单片机要205个字节的报文。...C#中,使用的是serialPort.DataReceived来接收数据。一开始,上位机向单片机发送轮询指令后,单片机按照modbus协议上传205个字节数据。但是每次
  • C# 串口操作系列(3) -- 协议篇,二进制协议数据解析 标签: c#bufferobject通讯byte硬件驱动 2010-05-27 09:54 51565人阅读 评论(215) 收藏 举报  分类:   通讯类库设计(4)  ...
  • c#串口通信之adc数据采集

    千次阅读 2016-10-10 22:50:50
    使用c#直接拖串口控件serialPort1 设置属性即可。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System....
  • 刘凯 周云耀 武汉理工大学信息工程学院 武汉市...但在实际串口通信的应用中,在串口高波特率大信息量的数据通信时,会出现丢失数据的问题。此时如果只是增加串口类的缓存容量是不能根本解决问题的。本文就

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,157
精华内容 462
关键字:

c#串口接收数据分析

c# 订阅