上位机串口数据卡死 #-上位机串口数据卡死 C# PID调试工具

问题描述

上位机串口数据卡死 C# PID调试工具

自己用VS2013 C#编了一个类似串口助手的上位机现在出现以下问题
1.调试时未出现卡死任何问题,生成后点击传送数据没问题,但是不断发送就会直接卡死

自己分析:1.我每次传送36个字节,波特率9600
数据量太大
2.程序没有及时释放存储空间,导致卡死
3.程序处理的时间太长,导致处理不够及时
我大致搜了一下,他们说需要用一个线程。具体没学过C#,只是照着,查着学的。请高手帮我想想方法

        以下是部分程序

        串口接收事件:

           private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
        if (!radioButton3.Checked)
        {
            textBox1.AppendText(serialPort1.ReadExisting());                                //串口类会自动处理汉字,所以不需要特别转换
        }
        else
        {
            try
            {
                byte[] data = new byte[serialPort1.BytesToRead];                                //定义缓冲区,因为串口事件触发时有可能收到不止一个字节
                serialPort1.Read(data, 0, data.Length);
                if (Displayer != null)
                    Displayer.AddData(data);    //!!!!!
                foreach (byte Member in data)                                                   //遍历用法
                {
                    string str = Convert.ToString(Member, 16).ToUpper();
                    textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");
                }
            }
            catch { }
        }
    }

            以下是数据处理:
              public void AddData(byte[] Data)
    {
        if (Flag == 1)
        {
            for (int i = 0; i < Data.Length; i++)
             DataList.Add(Data[i]);//链表尾部添加数据

    if (DataList.Count - 1 >= (this.ClientRectangle.Width - StartPrint - 240) / DrawStep)//如果数据量大于可容纳的数据量,即删除最左数据
    {
        DataList.RemoveRange(0, 35);
    }
            data_get();
        }
            Invalidate();//刷新显示

    }

    public void data_get()
    {
    for (int i = DataList.Count -36  ; i < DataList.Count - 1; i++)    //数据包分配
            {

                if( DataList[i] == 0x50 )
                {
                    switch(DataList[i+1])
                   {
                       case 0x56:
                           {

                               for (int j = 0; j < 4; j++)
                               {
                                   Now_Data[j] = DataList[i + 2 + j];     //实时值数组

                               }

                               break;
                           }

                       case 0x51:
                           {

                               for (int j = 0; j < 4; j++)
                               {
                                   fData[j] = DataList[i + 2 + j];      //目标值数据
                               }
                               break;
                           }

                       case 0x52:
                           {
                               for (int j = 0; j < 4; j++)
                               {
                                   P_Data[j] = DataList[i + 2 + j];   //P数据
                               }
                               break;
                           }

                       case 0x53:
                           {
                               for (int j = 0; j < 4; j++)
                               {
                                   I_Data[j] = DataList[i + 2 + j];
                               }
                               break;
                           }

                       case 0x54:
                           {
                               for (int j = 0; j < 4; j++)
                               {
                                   D_Data[j] = DataList[i + 2 + j];
                               }
                               break;
                           }

                       case 0x55:
                           {
                               for (int j = 0; j < 4; j++)
                               {
                                   PWM_Data[j] = DataList[i + 2 + j];
                               }
                               break;
                           }

                    }
                }

            }

    N_val[0]= BitConverter.ToSingle(Now_Data, 0);   //以下为byte转化为float类型
    Goal_val = BitConverter.ToSingle(fData, 0);
    P_val = BitConverter.ToSingle(P_Data, 0);
    I_val = BitConverter.ToSingle(I_Data, 0);
    D_val = BitConverter.ToSingle(D_Data, 0);
    PWM_val = BitConverter.ToSingle(PWM_Data, 0);

    if (N_Data.Count - 1 >= (this.ClientRectangle.Width - StartPrint - 240) / DrawStep)//如果数据量大于可容纳的数据量,即删除最左数据
    {
        N_Data.RemoveRange(0, 5);
    }
    N_Data.Add(N_val[0]);
    textBox10.Text = (N_val[0]).ToString();        //以下为文本显示
    textBox11.Text = Goal_val.ToString();
    textBox12.Text = PWM_val.ToString();
    textBox16.Text = P_val.ToString();
    textBox17.Text = I_val.ToString();
    textBox15.Text = D_val.ToString();
    }
时间: 2025-01-20 18:50:37

上位机串口数据卡死 #-上位机串口数据卡死 C# PID调试工具的相关文章

数据帧-c#串口通信中上位机测试数据组帧

问题描述 c#串口通信中上位机测试数据组帧 测试 发送数据的参数,设置温度频率时延输出功率,,这些数据组成一帧并且发送,然后接收,,, 解决方案 参考:http://www.360doc.com/content/13/0829/09/7531335_310657574.shtml 解决方案二: 可以在串口使用modbus协议通讯. 或者根据modbus的思想自己弄一套协议. modbus有应答和校验机制,能够保证串口通讯的可靠性. 解决方案三: 上位机-串口通信-C#

串口通信内存泄露-C#串口通信高速向下位机发送数据出现内存不断增加

问题描述 C#串口通信高速向下位机发送数据出现内存不断增加 using System; using System.Linq; using System.Collections.Generic; using System.Text; using System.IO.Ports; using System.Windows.Forms; namespace MSPCS { /// /// 通讯端口,用于和上位机通讯 /// 上行与下行使用同一种格式: /// /* 同步头 6 Byte EB90EB9

bms-编写一个上位机来处理modbus协议过来的数据,需要用什么平台,学习什么知识

问题描述 编写一个上位机来处理modbus协议过来的数据,需要用什么平台,学习什么知识 化学转行过来的,这算是第一个任务.这两个星期学了C语言和C++,以及一些简单的计算机原理.下面是电池保护板,要提取出温度,电压,电流这几种数据.身边没有人教,学习起来没有方向.希望大家解惑一下. 解决方案 你是想知道处理modbus协议过来的数据,还是提取出温度,电压,电流这几种数据呢?modbus协议的处理还是比较简单的,可参考:Modbus通讯协议 Modbus协议中文版[完整版] 提取出温度,电压,电流

用c#写的上位机 通过socket从下位机得到数据汇成折线图

问题描述 我打算用c#写上位机通过socket接收下位机传来的温度湿度光照强度的数据需要接收这些数据然后分别绘制成温度曲线图湿度曲线图光照强度曲线图我想问问各位大神socket接收的数据格式是怎么样的能把接收的这些数据区分开哪个是温度的数据哪个湿度数据然后采用什么样的方法能分别接收数据同时绘制成三张曲线图 解决方案 解决方案二:socket接收的数据格式是怎么样的取决于你和下位机开发者的约定.解决方案三:那对不同数据怎么区分像温度和光照解决方案四:不同的传感器会有不同的地址码,比如温度地址是00

c#上位机与单片机通信,上位机接收不到单片机返回的数据

问题描述 c#上位机与单片机通信,上位机接收不到单片机返回的数据 我遇到的问题是: 1上位机给单片机发送数据,单片机能接收到,但是单片机返回的数据上位机收不到 2我不用单片机,直接把数据线上的TX.RX短接,再用上位机发送数据,这时 上位机显示区就能显示上位机发送的数据: 3我用串口调试助手调试单片机程序,调试助手能正常接收单片机返回的数据: 以上3个问题,很是矛盾,不知道哪里出问题了,请高手帮助一下! 解决方案 asc码接收,十六进制接收不行,上位机编码 解决方案二: 曾经写过的一个,接收函数

监听 c# 数据-c#监听串口是怎么监听不到

问题描述 c#监听串口是怎么监听不到 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;//添加的引用using System.IO.Ports;using System.Threading;usi

用单片机写一个接受串口发过来的程序,由于串口可能发的不止一个数据,

问题描述 用单片机写一个接受串口发过来的程序,由于串口可能发的不止一个数据, 肯定要把所有数据都接受,然后显示出来,怎么写才能把所有数据都接受呢 解决方案 http://blog.163.com/zhangmwen@126/blog/static/1134375022014423103449480/ 解决方案二: 考虑单片机显示就收的数据,那你就要考虑通讯报文的问题,因为单片机接受的时候是一个字节一个字节的收,它没有一串数据的概念.如果是上位机,那你配置好串口的波特率,字节之间的最大延时时间,,

link环境下制作一款《订餐软件》,本机单库连本库实现数据的传送,请问怎么实现呢?

问题描述 link环境下制作一款<订餐软件>,本机单库连本库实现数据的传送,请问怎么实现呢? link环境下制作一款<订餐软件>,本机单库连本库实现数据的传送,请问怎么实现呢? 解决方案 本机的话,直接在数据库端共享数据,两个程序各种把数据放进去就可以了.

51单片机串口通信时,接收到数据后为什么在while语句中将EA置1

问题描述 51单片机串口通信时,接收到数据后为什么在while语句中将EA置1 刚进入while语句时为什么要将EA置1??程序如下: #include #define uchar unsigned char uchar numaflagbenum; sbit beep=P2^3; void init(); void main() { init(); while(1) { if(flag==1) { EA=0; flag=0; TR0=1; if(a==1) { benum=4; } if(a=