精华内容
下载资源
问答
  •  //接收数据并显示函数:可用:测试的接收数据为: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);//清除第一个字节,继续检测下一个。
                    }
                }


                }           


            }

    展开全文
  • 首先我们得先知道串口发来的数据是什么样子的: 例如: 55 AA 02 04 01 02 03 04 05 0F 我们看一下上面的例子  数据头: 55 AA 02  有效数据位:04 有效数据位的意思是,从这个字符往后数多少位。是他的有效...

    首先我们得先知道串口发来的数据是什么样子的:

    例如:

    55 AA 02 04 01 02 03 04 05 0F

    我们看一下上面的例子

            数据头: 55 AA 02

            有效数据位:04        有效数据位的意思是,从这个字符往后数多少位。是他的有效数据

            代表数值:01 02 03 04 05

            代表校验码:0F

     

    首先我们需要准备一个串口对象

    // 我们需要有一个串口
        SerialPort ser = new SerIalPort();
    // 设置端口基本信息
        PortName = "COM2";  
        BaudRate = 57600;
        DataBits = 8;
        Handshake = Handshake.None;
        StopBits = StopBits.One;
        ReadTimeout = -1;
        ser.DtrEnable = true;
        ser.Parity = Parity.None;
    // 打开串口端口
        ser.open(); // 这里只做一个比较   该有try/catch还是要加上
    
    
    

     

    给串口发送信息,接下来。串口会给上位机发送一些指令

    public int sendMsg(String str){
        // 判断一下端口是否被关闭
        if (!ser.IsOpen) {    
            return 0; // 代表端口已被开启
        }
    
        // 去除传输来的String字符串
        str = str.Replace(" ", "");
    
        // 保证字符串能够整除2    
        if(str.Length % 2 != 0) {
            str += " ";
        }
        
        // 准备数组
        byte[] value = new byte[str.Length / 2];
    
        // 为数组赋值
        for (int i = 0; i < value.Length; i++){
            value[i] = Convert.ToByte(str.Substring(i * 2, 2).Replace(" ", ""),16);
        }
    
        // 发送数据
        ser.Write(value, 0, value.Length);
        
        return 1;
    }
    
    
    

    发送完命令以后。串口设备会给上位机发送一连串的他的命令

    // 在接收数据之前。我们需要绑定串口读取事件
    // 例如我在load事件中接收
    private void Form1_Load(object sender, EventArgs e){
        // 刚刚在上面定义了一个打开端口的方法
        this.openPort(); // 假设他开启成功
        
        ser.DataReceived += GetData;  // 在后面生成一个接收事件方法
        
    }
    
    // 准备一个队列(作为缓冲数据)
    Queue<byte> resultBytes = new Queue<byte>();
    
    // 接收事件方法
    private void GetData(object sender, SerialDataReceivedEventArgs e){
        // 读取他准备接收的条目数
        byte[] result = new byte[ser.BytesToRead];
        
        // 开始读取数据
        ser.Read(result, 0, result.Length);
    
        // 把数据存入队列
        for (int i = 0; i < result.Length; i++){
            resultBytes.Enqueue(result[i]);
        }
    
        // 解析步骤
        while(resultBytes.Count >= 10){   // 这里的10.意思是你接收到的完整数据
        
        // 开始解析数据头
            if(resultBytes.Dequeue() == 0x55
                && resultBytes.Dequeue() == 0xAA
                && resultBytes.Dequeue() == 0x02){
                
                // 最后的结果
                byte[] resultArray = new byte[resultBytes.Dequeue()];
    
                for(int i = 0 ; i < resultArray.Length;i++){
                    // 没拿到一个数据就存入结果集中
                    resultArray[i] = resultBytes.Dequeue();
                }
    
            
                // 数据读取完了。 ResultArray就是最后的值集合
            }  
        }
    }
    
    

    本人小菜。本篇博客只是作为个人记录。。如果对各位有帮助。那最好。。。如果无用。轻喷。谢谢

    展开全文
  • C#编写的串口数据接收保存

    热门讨论 2014-12-08 15:19:50
    本压缩文件是一个完整的C#编写的串口采集软件,可以实时接收串口数据并显示在文本框内,以Excel表格的形式实时记录储存数据,含有全部代码和界面设计等,也可直接使用.本人采用的是vs2010,若有下载后不能使用的请给我...
  • 本程序vs2013平台用c#开发,包含北斗部分通信应用协议的串口数据解析,其中协议为北斗协议为4.0通用版,大家可放心下载使用。
  • C#串口数据收发

    万次阅读 多人点赞 2018-06-13 12:55:14
    https://blog.csdn.net/u010307521/article/details/502389971.起始最近在公司做上位机... 主要功能包括:打开串口、关闭串口,向串口发送数据以及从串口读取数据。在发送和接收的文本框里面,我加上了切换16进制的...

    多个线程的创建和管理


    https://blog.csdn.net/u010307521/article/details/50238997

    1.起始

    最近在公司做上位机和设备进行串口通信的项目,自己就写了个串口通信工具,今天是第三天,刚刚实现串口的双向通信。

    2.软件的界面

    先进行界面设计,将需要的功能放上来。 
    界面设计 
    主要功能包括:打开串口、关闭串口,向串口发送数据以及从串口读取数据。在发送和接收的文本框里面,我加上了切换16进制的功能,方便调试。 
    在主窗体中需要一些变量用于存储串口名、串口缓冲区数据等相关信息。

    private string[] portNames = null;
    private List<SerialPort> serialPorts;
    private byte[] portBuffer;
    
    • 1
    • 2
    • 3
    • 4

    串口号的选择采用下拉菜单式,需要在初始化Form的时候扫描所有可用串口并显示在comboBox中。初始化之后需要加上以下代码:

    this.serialPorts = new List<SerialPort>();
    this.portNames = SerialPort.GetPortNames();
    this.portBuffer = new byte[1000];   
    
    • 1
    • 2
    • 3
    • 4

    其中第二行将扫描到的各串口名以字符串存入this.portNames数组。之后需要将扫描到的串口读取到comboBox中。

    //Assign the value of port names to serial ports display
    if (this.portNames.Length > 1)
    {         
        for(int i = 0;i<this.portNames.Length;i++)
        {
            this.serialPorts.Add(new SerialPort(this.portNames[i]));
        }                
    }
                this.portNumberComboBox1.Items.AddRange(this.portNames);             this.portNumberComboBox2.Items.AddRange(this.portNames); 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    以上的代码完成了这些操作。到这里软件界面初始化及初步扫描串口号就完成了,接下来需要完成按钮的响应函数。

    3.对串口的操作功能

    打开串口和关闭串口都很简单,直接调用对应API即可。

    private void openButton_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < this.portNames.Length; i++)
            {
                try
                {
                    if (this.portNames.ElementAt(i) == this.portNumberComboBox1.Text.ToString())
                    {
                        if (!this.serialPorts.ElementAt(i).IsOpen)
                        {
                            this.serialPorts.ElementAt(i).Open();
                            MessageBox.Show("已打开串口!");
                        }
                        //this.serialPorts.ElementAt(i).
                    }
                }
                catch (IOException eio)
                {
                    MessageBox.Show("打开串口异常:" + eio);
                }
    
            }
        }
    
        private void closeButton_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < this.portNames.Length; i++)
            {
                try
                {
                    if (this.portNames.ElementAt(i) == this.portNumberComboBox1.Text.ToString())
                    {
                        if (this.serialPorts.ElementAt(i).IsOpen)
                        {
                            this.serialPorts.ElementAt(i).Close();
                            MessageBox.Show("已关闭串口!");
                        }
    
                    }
                }
                catch (IOException eio)
                {
                    MessageBox.Show("关闭串口异常:" + eio);
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    通过某个串口发送数据的时候,需要先读取文本框中需要发送的内容,再调用write函数。

    private void sendButton_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < this.portNames.Length; i++)
            {
                try
                {
                    if (this.portNames.ElementAt(i) == this.portNumberComboBox1.Text.ToString())
                    {
                        if (this.serialPorts.ElementAt(i).IsOpen)
                        {
                            string sendContent = this.sendTextBox.Text.ToString();
                            this.serialPorts.ElementAt(i).Write(sendContent);                            
                            MessageBox.Show("已发送数据!");
                        }
    
                    }
                }
                catch (IOException eio)
                {
                    MessageBox.Show("串口发送异常:" + eio);
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    对于读操作,由于串口有dataReceived事件可以监听,这里选择不用线程,而是监听事件。建立一个timer用来扫描第二个comboBox,当第二个comboBox中有选中的时候,事件会被监听到。

    private void timer1_Tick(object sender, EventArgs e)
    {
        this.AddEventHandlerForResponse();
    }
    
    private void AddEventHandlerForResponse()
        {
            for (int i = 0; i < this.portNames.Length; i++)
            {
                try
                {
                    if (this.portNames.ElementAt(i) == this.portNumberComboBox2.Text.ToString())
                    {
                        if ((this.serialPorts.ElementAt(i).IsOpen)&&(this.serialPorts.ElementAt(i).BytesToRead > 0))
                        {
                            this.serialPorts.ElementAt(i).Read(this.portBuffer, 0, this.serialPorts.ElementAt(i).BytesToRead);
                            this.serialPorts.ElementAt(i).DataReceived += new SerialDataReceivedEventHandler(this.DataReceiveEventHandler);
                        }
    
                    }
                }
                catch (IOException eio)
                {
                    MessageBox.Show("串口异常:" + eio);
                }
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    上面的代码中出现了处理DataReceived事件的函数this.DataReceiveEventHandler 
    这里由于串口的读操作相对特殊,串口读取缓冲区数据通过辅助线程进行,进行读操作的时候不能直接修改UI中的内容,所以文本框中的接收内容要通过invoke来实现。

    private void DataReceiveEventHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        this.receiveTextBox.Invoke(
            new MethodInvoker(
                delegate 
            {
                    this.receiveTextBox.AppendText(sp.ReadExisting());
                    this.receiveTextBox.Text += " ";
    
            }
                            )
                                );
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    至此,实现了串口通信的基本功能,包括打开串口、关闭串口以及读写操作。

    展开全文
  • VS2010C#工程,接收单片机系统串口传输的4字节温度数据并显示,附带数据库查询指令参考 (本科生时期项目,没有数据表,谨慎下载)
  • 使用Modbus协议,解析串口接收数据并显示,整个项目使用C#开发
  • 这是个人做的一个实用小项目,主要用于与下位机设备通信,将下位机采集的数据实时显示并记录,界面设计参考Windows任务管理器 这是个人做的一个实用小项目,主要用于与下位机设备通信,将下位机采集的数据实时显示...
  • 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 方法中,带注释的两行就需要取消注释使用。

    展开全文
  • // 存储数据的集合 public void PortDataReceived(object sender, SerialDataReceivedEventArgs e) { if (null == _port || !_port.IsOpen || isClosing) { return; } int n = _port.BytesToRead;//先记录下来,避免...
  • 串口通信,电子称数据读取。程序详细易懂,可以扩展到其他应用。 串口通信,电子称数据读取。程序详细易懂,可以扩展到其他应用。
  • 在简单的认识及使用串口通信之后,在实际应用中应该是配合硬件,和负责硬件通信的同事沟通好通信协议,来进行设备的控制及数据获取。 常用的串行通信协议有TTL电平(普通MCU芯片输出的串口电平)、RS232(工业上常用...
  • 文本方式的数据比较容易分析。如果数据缓存,可以考虑用StringBuilder。或是不缓存也可以。文本格式数据大多有换行结尾。稍微修改即可。例如分析常见的NMEA 0183格式的卫星坐标数据GGA。 $GPGGA,121252.000,3937....
  • 通过C#实现串口通信,里面的代码展示了如何监听计算机中的串口解析数据或者发送数据,做串口开发的可以参考
  • 最近笔者使用C#编程时,经常用到串口通信功能。所以总结记录一下串口通信功能的使用方法。 串口组件 在工具箱中找到SerialPort组件,将其添加到设计中。 串口端口和波特率设置 属性名称 含义 (Name) 指示...
  • C#串口读取数字温湿度传感器数据,数据库保存历史数据,并虚线显示读取的温湿度信息,数据库保存历史数据,并虚线显示读取的温湿度信息,
  • //输出数据 } private void ProcessRev(byte[] reDatas) { Dispatcher.Invoke(() => { this.tbRevData.Text += "接收:" + new UTF8Encoding().GetString(reDatas) + Environment.NewLine; }); } private void ...
  • 这个代码支持3个串口,能同时接收3个串口过来的数据,截取出数据之后,用postMessage发送给主程序,这样主程序就不用考虑串口通信了,提高了主程序的稳定性可靠性,不容易崩溃。postMessage的消息id可以自定义,用wm...
  • 本程序是用串口工具读取一个电流表的通讯程序的源代码,要求将返回的4位字节数据()16进制)转浮点型实时输出到窗体上
  • C#串口文本协议解析

    千次阅读 2018-06-12 16:39:39
    https://blog.csdn.net/LSGO_MYP/article/details/60964974本文介绍了利用C#接收串口数据(文本)并进行分析的标准过程。 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...
  • 最近在软件调试中,发现数据一长...对于我的数据,最长为1237字节,波特率选择9600,则需要耗时123710/9600=1.28854…,基本为1.3秒,所以我设置了串口的超时时间为3秒。发送后如果3秒没接收数据,就算超时,直接发下
  • 在双机通讯中,第九位一般是奇偶校验位。 可以发9位数据,8个数据为,第九位是校验位,校验位有4个状态可设置,基校验,偶校验,总为1,总为0。
  • C#——串口接收JSON数据处理 待处理的json数据 { "altogether_time": "32", "measure_deep": "5", "measure_speed": "7", "origin_distance": "9", "relative_value": "0.2", "signal_num": "8", "water_...
  • C# 串口操作系列(3) -- 协议篇,二进制协议数据解析 标签: c#bufferobject通讯byte硬件驱动 2010-05-27 09:54 51565人阅读 评论(215) 收藏 举报  分类:   通讯类库设计(4)  ...
  • C#如何开启线程处理串口接收数据

    千次阅读 2020-04-22 22:28:10
    } catch { if (serialPort1.IsOpen) { MessageBox.Show("打开串口错误"); } MessageBox.Show("打开串口错误","提示"); } } private void serial_rec() { while (true) { if (read_mode_char.Checked == true) { try...
  • 学习记录之基于C#串口助手以及GPS数据解析和保存一.声明二.功能介绍三.串口助手界面四. 代码实现 一.声明 这是一篇学习记录,可能与很多大牛的代码相似,因为我的代码也是copy加各种整合,存在很多不严谨的地方,...
  • c# 串口获取数据

    千次阅读 2019-03-06 17:00:52
    有很多场景应用到串口操作,比如:地磅、超市收银(串口扫码)、工业机械控制(和PLC的交互、和普通硬件的交互),今天分享一下基础版的串口操作。 using System; using System.Collections.Generic; using System...
  • C#串口数据接收的处理

    万次阅读 2016-04-08 19:07:24
    个人的意见与思路: 1.先获取足够的数据信息。 2.判断帧头,获取需要的数据信息 3.帧尾结束,执行下一次判断 4.移除处理过的数据 ...用来存放所有的数据,在接收函数里,通过buffer.AddRange()方
  • 本文介绍了利用C#接收串口数据(二进制)并进行分析的常规过程。
  • C#_读取串口信息并解析信息(字符串)

    千次阅读 2020-05-06 13:03:31
    } public bool StartComputes()//开始解析 { if (ALLMessage == "") return false; int charTag=0; char char_Inspector = ALLMessage[charTag]; while (true) { if (char_Inspector=='#')//遇到控制信息LOG头 { ...

空空如也

空空如也

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

c#串口接收数据解析

c# 订阅