上位机串口数据卡死 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();
    }
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c#上位机串口程序发送数据出错

![图片说明](https://img-ask.csdn.net/upload/201805/13/1526186560_199315.jpg) 麻烦帮忙看一下,最近在做一个上位机的程序,通过串口把数据发到下位机 8个字串,串口协议rs232,通过pl2303连接,可是发送0x11,下位机接受到的是0x77, 而且第一次发送总是先接到一个0x00,除了图片的方法,网上的很多方法都试过, 可是搞不明白错在哪,下位机程序测试后没问题,也不是波特率的问题,请高人指点 感激不尽。

c#winform编写上位机串口接受到数据如何分开使用

首先已经编写完了上位机接收数据的程序也实现了在textbox控件中实时显示但是传上来的数据是一组xy坐标值我想如何可以在两个textbox控件中分别显示xy也就是把一组数据分开。因为后面还要利用xy值作图。目前我只能把xy一组数据放在一个textbox控件中达到实时更新数据或者使用Split、正则表达式对数据进行分割只能显示第一组分割后的数据但无法实时更新数据。![图片说明](https://img-ask.csdn.net/upload/201705/18/1495096956_858492.png) ![图片说明](https://img-ask.csdn.net/upload/201705/18/1495096701_157934.png)![图片说明](https://img-ask.csdn.net/upload/201705/18/1495097241_53003.png)代码如下: private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] ReceivedData = new byte[sp.BytesToRead];//创建接收字节数组 sp.Read(ReceivedData, 0, ReceivedData.Length);//读取所接收到的数据 receivedDatas.AddRange(ReceivedData); textBox3.Text = (Convert.ToInt32(textBox3.Text) + ReceivedData.Length).ToString(); if (checkBox2.Checked) { textBox1.Text = Class1.ByteTo16Str(receivedDatas.ToArray()); } else { textBox1.Text = Encoding.Default.GetString(receivedDatas.ToArray()); //让文本框获取焦点 string a = Encoding.Default.GetString(receivedDatas.ToArray()); **string[] sArray = a.Split(','); //这里是进行分割数据,去掉这部分直接把a赋值给textbox就会实时显示但是在一个框里显示xy一组数据而不是一个数据x或者y textBox15.Text = sArray[0]; textBox16.Text = sArray[1];** this.textBox15.Focus(); //设置光标的位置到文本尾 this.textBox15.Select(this.textBox1.TextLength, 0); //滚动到控件光标处 this.textBox15.ScrollToCaret(); this.textBox1.Focus(); //设置光标的位置到文本尾 this.textBox1.Select(this.textBox1.TextLength, 0); //滚动到控件光标处 this.textBox1.ScrollToCaret(); } // sp.DiscardInBuffer();//丢弃接收缓冲区数据

关于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; namespace WindowsFormsApplication1 { public partial class Form1 : Form { string data; SolidBrush bush1 = new SolidBrush(Color.Red); SolidBrush bush2 = new SolidBrush(Color.Green); public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { axMSComm1.PortOpen = false; Close(); } private void Form1_Load(object sender, EventArgs e) { axMSComm1.CommPort = 1; //'设置通信端口号为COM1 axMSComm1.Settings = "9600,e,7,1"; //'设置串口参数 axMSComm1.InputMode = 0;//'接收文本型数据 axMSComm1.PortOpen = true;//'打开通信端口1 axMSComm1.RThreshold = 1; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { axMSComm1.PortOpen = false; } private void timer1_Tick(object sender, EventArgs e) { //向PLC发送指令:02 30 30 30 38 30 30 34 03 35 46,功能是从PLC的X0~X37读取4个字节数据,反映X0~X37的状态信息。 //向PLC发送指令:02 30 30 30 38 30 30 3 03 35 45,功能是从PLC的X0~X27读取3个字节数据,反映X0~X27的状态信息。 //向PLC发送指令:02 30 30 30 38 30 30 32 03 35 44,功能是从PLC的X0~X17读取2个字节数据,反映X0~X17的状态信息。 //向PLC发送指令:02 30 30 30 38 30 30 31 03 35 43,功能是从PLC的X0~X7读取1个字节数据,反映X0~X7的状态信息。 // byte[] bs = { 2, 48, 48, 48, 56, 48, 48, 52, 3, 53, 70 }; //byte[] bs = { 2, 48, 48, 48, 56, 48, 48, 51, 3, 53, 69 }; byte[] bs = { 2, 48, 48, 48, 56, 48, 48, 50, 3, 53, 68 }; //byte[] bs = { 2, 48, 48, 48, 56, 48,48,49,3,53,67 }; string ss = System.Text.Encoding.ASCII.GetString(bs); axMSComm1.Output = (ss); } private void axMSComm1_OnComm(object sender, EventArgs e) { data = axMSComm1.Input.ToString(); textBox1.Text = data.Substring(1, 1); textBox2.Text = data.Substring(2, 1); textBox3.Text = data.Substring(3, 1); textBox4.Text = data.Substring(4, 1); //textBox5.Text = data.Substring(5, 1); //textBox6.Text = data.Substring(6, 1); // textBox7.Text = data.Substring(7, 1); // textBox8.Text = data.Substring(8, 1); Graphics g1 = this.pictureBox1.CreateGraphics(); Graphics g2 = this.pictureBox2.CreateGraphics(); Graphics g3 = this.pictureBox3.CreateGraphics(); Graphics g4 = this.pictureBox4.CreateGraphics(); Graphics g5 = this.pictureBox5.CreateGraphics(); Graphics g6 = this.pictureBox6.CreateGraphics(); Graphics g7 = this.pictureBox7.CreateGraphics(); Graphics g8 = this.pictureBox8.CreateGraphics(); Graphics g9 = this.pictureBox9.CreateGraphics(); Graphics g10 = this.pictureBox10.CreateGraphics(); Graphics g11 = this.pictureBox11.CreateGraphics(); Graphics g12 = this.pictureBox12.CreateGraphics(); Graphics g13 = this.pictureBox13.CreateGraphics(); Graphics g14 = this.pictureBox14.CreateGraphics(); Graphics g15 = this.pictureBox15.CreateGraphics(); Graphics g16 = this.pictureBox16.CreateGraphics(); //Graphics g17 = this.pictureBox17.CreateGraphics(); //Graphics g18 = this.pictureBox18.CreateGraphics(); //Graphics g19 = this.pictureBox19.CreateGraphics(); //Graphics g20 = this.pictureBox20.CreateGraphics(); //Graphics g21 = this.pictureBox21.CreateGraphics(); //Graphics g22 = this.pictureBox22.CreateGraphics(); //Graphics g23 = this.pictureBox23.CreateGraphics(); //Graphics g24 = this.pictureBox24.CreateGraphics(); int b = int.Parse(data.Substring(1, 1), System.Globalization.NumberStyles.HexNumber);//十六进制转十进制 string aa = Convert.ToString(b, 2);//十进制转二进制 while (aa.Length < 4)//补零 { aa = "0" + aa; } int b2 = int.Parse(data.Substring(2, 1), System.Globalization.NumberStyles.HexNumber); string aa2 = Convert.ToString(b2, 2); while (aa2.Length < 4) { aa2 = "0" + aa2; } if (aa.Substring(0, 1) == "1") g8.FillEllipse(bush1, 0, 0, 20, 20); else g8.FillEllipse(bush2, 0, 0, 20, 20); if (aa.Substring(1, 1) == "1") g7.FillEllipse(bush1, 0, 0, 20, 20); else g7.FillEllipse(bush2, 0, 0, 20, 20); if (aa.Substring(2, 1) == "1") g6.FillEllipse(bush1, 0, 0, 20, 20); else g6.FillEllipse(bush2, 0, 0, 20, 20); if (aa.Substring(3, 1) == "1") g5.FillEllipse(bush1, 0, 0, 20, 20); else g5.FillEllipse(bush2, 0, 0, 20, 20); if (aa2.Substring(0, 1) == "1") g4.FillEllipse(bush1, 0, 0, 20, 20); else g4.FillEllipse(bush2, 0, 0, 20, 20); if (aa2.Substring(1, 1) == "1") g3.FillEllipse(bush1, 0, 0, 20, 20); else g3.FillEllipse(bush2, 0, 0, 20, 20); if (aa2.Substring(2, 1) == "1") g2.FillEllipse(bush1, 0, 0, 20, 20); else g2.FillEllipse(bush2, 0, 0, 20, 20); if (aa2.Substring(3, 1) == "1") g1.FillEllipse(bush1, 0, 0, 20, 20); else g1.FillEllipse(bush2, 0, 0, 20, 20); int b3 = int.Parse(data.Substring(3, 1), System.Globalization.NumberStyles.HexNumber);//十六进制转十进制 string aa3 = Convert.ToString(b3, 2);//十进制转二进制 while (aa3.Length < 4)//补零 { aa3 = "0" + aa3; } int b4 = int.Parse(data.Substring(4, 1), System.Globalization.NumberStyles.HexNumber); string aa4 = Convert.ToString(b4, 2); while (aa4.Length < 4) { aa4 = "0" + aa4; } if (aa3.Substring(0, 1) == "1") g16.FillEllipse(bush1, 0, 0, 20, 20); else g16.FillEllipse(bush2, 0, 0, 20, 20); if (aa3.Substring(1, 1) == "1") g15.FillEllipse(bush1, 0, 0, 20, 20); else g15.FillEllipse(bush2, 0, 0, 20, 20); if (aa3.Substring(2, 1) == "1") g14.FillEllipse(bush1, 0, 0, 20, 20); else g14.FillEllipse(bush2, 0, 0, 20, 20); if (aa3.Substring(3, 1) == "1") g13.FillEllipse(bush1, 0, 0, 20, 20); else g13.FillEllipse(bush2, 0, 0, 20, 20); if (aa4.Substring(0, 1) == "1") g12.FillEllipse(bush1, 0, 0, 20, 20); else g12.FillEllipse(bush2, 0, 0, 20, 20); if (aa4.Substring(1, 1) == "1") g11.FillEllipse(bush1, 0, 0, 20, 20); else g11.FillEllipse(bush2, 0, 0, 20, 20); if (aa4.Substring(2, 1) == "1") g10.FillEllipse(bush1, 0, 0, 20, 20); else g10.FillEllipse(bush2, 0, 0, 20, 20); if (aa4.Substring(3, 1) == "1") g9.FillEllipse(bush1, 0, 0, 20, 20); else g9.FillEllipse(bush2, 0, 0, 20, 20); //int b5 = int.Parse(data.Substring(5, 1), System.Globalization.NumberStyles.HexNumber);//十六进制转十进制 //string aa5 = Convert.ToString(b5, 2);//十进制转二进制 //while (aa5.Length < 4)//补零 //{ // aa5 = "0" + aa5; //} //int b6 = int.Parse(data.Substring(6, 1), System.Globalization.NumberStyles.HexNumber); //string aa6 = Convert.ToString(b6, 2); //while (aa6.Length < 4) //{ // aa6 = "0" + aa; //} //if (aa5.Substring(0, 1) == "1") // g24.FillEllipse(bush1, 0, 0, 20, 20); //else // g24.FillEllipse(bush2, 0, 0, 20, 20); //if (aa5.Substring(1, 1) == "1") // g23.FillEllipse(bush1, 0, 0, 20, 20); //else // g23.FillEllipse(bush2, 0, 0, 20, 20); //if (aa5.Substring(2, 1) == "1") // g22.FillEllipse(bush1, 0, 0, 20, 20); //else // g22.FillEllipse(bush2, 0, 0, 20, 20); //if (aa5.Substring(3, 1) == "1") // g21.FillEllipse(bush1, 0, 0, 20, 20); //else // g21.FillEllipse(bush2, 0, 0, 20, 20); //if (aa6.Substring(0, 1) == "1") // g20.FillEllipse(bush1, 0, 0, 20, 20); //else // g20.FillEllipse(bush2, 0, 0, 20, 20); //if (aa6.Substring(1, 1) == "1") // g19.FillEllipse(bush1, 0, 0, 20, 20); //else // g19.FillEllipse(bush2, 0, 0, 20, 20); //if (aa6.Substring(2, 1) == "1") // g18.FillEllipse(bush1, 0, 0, 20, 20); //else // g18.FillEllipse(bush2, 0, 0, 20, 20); //if (aa6.Substring(3, 1) == "1") // g17.FillEllipse(bush1, 0, 0, 20, 20); //else // g17.FillEllipse(bush2, 0, 0, 20, 20); } } }[![图片说明](https://img-ask.csdn.net/upload/201703/20/1489995695_709935.png)图片说明](https://img-ask.csdn.net/upload/201703/20/1489995677_523469.png)

c#写一个上位机程序,用串口助手调试不出结果

![图片说明](https://img-ask.csdn.net/upload/201904/22/1555917610_948435.png)![图片说明](https://img-ask.csdn.net/upload/201904/22/1555917619_448897.png) 我用了论坛里搜到的代码,但是不全 ``` using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.IO.Ports; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()); } private string[] portNames = null; private List<SerialPort> serialPorts; private byte[] portBuffer; private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { this.serialPorts = new List<SerialPort>(); this.portNames = SerialPort.GetPortNames(); this.portBuffer = new byte[1000]; //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.comboBox1.Items.AddRange(this.portNames); this.comboBox2.Items.AddRange(this.portNames); } private void button1_Click(object sender, EventArgs e) { for (int i = 0; i < this.portNames.Length; i++) { try { if (this.portNames.ElementAt(i) == this.comboBox1.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 button2_Click(object sender, EventArgs e) { for (int i = 0; i < this.portNames.Length; i++) { try { if (this.portNames.ElementAt(i) == this.comboBox1.Text.ToString()) { if (this.serialPorts.ElementAt(i).IsOpen) { this.serialPorts.ElementAt(i).Close(); MessageBox.Show("已关闭串口!"); } } } catch (IOException eio) { MessageBox.Show("关闭串口异常:" + eio); } } } private void button3_Click(object sender, EventArgs e) { for (int i = 0; i < this.portNames.Length; i++) { try { if (this.portNames.ElementAt(i) == this.comboBox1.Text.ToString()) { if (this.serialPorts.ElementAt(i).IsOpen) { string sendContent = this.textBox1.Text.ToString(); this.serialPorts.ElementAt(i).Write(sendContent); MessageBox.Show("已发送数据!"); } } } catch (IOException eio) { MessageBox.Show("串口发送异常:" + eio); } } } 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.comboBox2.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); } } } private void DataReceiveEventHandler(object sender, SerialDataReceivedEventArgs e) { SerialPort sp = (SerialPort)sender; this.textBox2.Invoke( new MethodInvoker( delegate { this.textBox2.AppendText(sp.ReadExisting()); this.textBox2.Text += " "; } ) ); } private void button4_Click(object sender, EventArgs e) { } } } ``` 运行出来的结果,根本接收不到,求解哪里错了啊

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

测试 发送数据的参数,设置温度频率时延输出功率,,这些数据组成一帧并且发送,然后接收,,,

c#做上位机串口发送接收问题,求指点!

过程:c# 上位机发送指令,称重显示控制器(XK3190-A9+)会返回数据,收到数据即可。 问题:上位机发送指令无反应。可能是我发送的数据格式不对。 byte[] cmd = new byte[6] { 0x02,0x41,0x44,0x30,0x35,0x03};//1 byte[] tcmd = new byte[6] {2, 65,68,48,53,3};//2 string kk = System.Text.Encoding.ASCII.GetString(cmd);//3 char[] ssh = Encoding.ASCII.GetChars(cmd);//4 string sshstr = new string(ssh);//5 serialPort1.Write(cmd,0,6); //serialPort1.Write(kk); 上面12345我都试了,不好使,串口设置没问题,我用串口调试助手好使,在Hex String下发送 024144303503 ,会有反馈。

C#上位机编程时,怎么特定地读取采集到的数据

![图片说明](https://img-ask.csdn.net/upload/201905/01/1556711896_749700.jpg) 如图所示,第一行数字代表下位机发送的数据,第二行是标注,也就是我想单独读取的数据。 下位机会循环的发送第一行的数据,CH1,CH2,CH3,CH4会随着相关的操作发生变化,现在我想把CH1,CH2,CH3,CH4分别读取为int型,储存到相应的变量中,请问应该如何写代码?上位机是C#写的。初学小白,万分感谢

关于上位机串口通信接收数据的问题

为什么我用mfc写的上位机串口通讯程序每次打开只能接收一次数据,想要接收下一次的数据只能重新打开串口,小白求问大神们,用的是microsoft communications control 6.0控件。

问个C#上位机数数据接收的问题

目前用C#编写了一个Winform上位机界面,其中用到SerialPort接收数据 具体流程如下: this.BeginInvoke(new EventHandler(delegate//调用控件的invoke方法,由主线程UI执行委托 //这里说一下:Begininvoke为"唤醒",异步执行EventHandler类的delegate委托 { int lenth = serialPort1.BytesToRead;//定义字节数组的长度:每接收一次接收数据读取的字符串长度 if (lenth != 0) { Byte[] BYTE = new Byte[lenth];//建立字节数组对象 serialPort1.Read(BYTE, 0, lenth);//读取接收的字节 builder.Clear();//接收数据时清除之前的残余字符串 foreach (byte str in BYTE) { builder.Append(str.ToString("X2")); } richReceiveText1.AppendText(builder.ToString().Replace(" ", "")); count += lenth; if (richReceiveText1.Text.Substring(0, 2) != "88") { richReceiveText1.Clear(); count = 0; } else { if (richReceiveText1.TextLength == 10) { list1.Add(richReceiveText1.Text); SetDSPReceive(); richReceiveText1.Clear(); } } receiveDataCount.Text = "接收数据:" + count.ToString() + "字节"; } else { ; } })); 这里我是先用richBox接收协议字符串,然后根据报头报位把协议存入到一个List<String>中,然后用SetDSPReceive()方法将list的内容通过协议规定先将字符串转换为十六进制然后再转换成十进制并给窗口的参数值进行赋值。 其中SetDSPReceive()为将接收的十六进制字节转换为界面上的参数的协议(比如 88 03 04 01 07 08,88 08是报头报尾巴,01决定了是什么参数,03,04,07决定了参数值是多少,数据一个100多条) 。 但问题来了:由于公司的控制器的数据发送间隔为10ms。而控制器发送数据时上位机winform会出现卡壳、数据不动的情况。之前用串口调试助手尝试了,单个发送一个协议没有问题,发完一个再手动单个发第二个也完全没有问题,间隔100ms以上连续发送数据也没出现卡壳,我想是不是因为发送的间隔比将接收的数据转换为需求的参数短了导致接收数据不全发生卡壳?? 还有一个问题:本应该接收到的字符串协议是88 03 04 01 07 08,但有时候接收到的协议是00 00 00 0D 88。。。。。,如何过滤掉表头之前的数据呢? 是不是:if (richBox1.Text.Substring(0, 2) != "88") { richBox1.Clear(); count = 0; } ?????????????????

小白用c#做上位机,求大神指点

请问大神们有没有思路,帮帮忙。用c#做上位机,串口通信,显示电机波型和转速。

C#winform串口接收数据不能换行

![串口数据发送程序](https://img-ask.csdn.net/upload/201705/27/1495894317_580025.png) 下位机发送的是字符串数组;一共发送三个数组,间隔10ms左右,每个数组发送完成后添加"\r\n"换行; ![上位机接收显示程序](https://img-ask.csdn.net/upload/201705/27/1495894387_353263.png) C#winform上位机接收串口数据后显示到textbox控件中; ![上位机显示情况](https://img-ask.csdn.net/upload/201705/27/1495894251_237664.png) 理想的情况是要数据单列显示,便于保存到excel。但是在下位机添加"\r\n"后,依旧不能保证每次接收到的数据都自成一行。 请问这是什么原因?具体能怎么解决呢? (PS:利用开发板商的工具能够稳定的单列显示)

上位机怎么解析上传上来的浮点数,是串口的数据?

请问单片机上传采集器的模拟量,单片机可以读取浮点数,上位机怎么解析上传上来的浮点数,是串口的数据?

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

我遇到的问题是: 1上位机给单片机发送数据,单片机能接收到,但是单片机返回的数据上位机收不到 2我不用单片机,直接把数据线上的TX、RX短接,再用上位机发送数据,这时 上位机显示区就能显示上位机发送的数据; 3我用串口调试助手调试单片机程序,调试助手能正常接收单片机返回的数据; 以上3个问题,很是矛盾,不知道哪里出问题了,请高手帮助一下!

小白用c#做上位机,求指点啊

public void sp1_DataReceived(object sender, SerialDataReceivedEventArgs e)//数据接收函数 { if (sp1.IsOpen) //此处可能没有必要判断是否打开串口,但为了严谨性,我还是加上了 { byte[] byteRead = new byte[sp1.BytesToRead]; //BytesToRead:sp1接收的字符个数 if (rbRcv16.Checked) //'接收16进制按钮' { try { Byte[] receivedData = new Byte[sp1.BytesToRead]; //创建接收字节数组 sp1.Read(receivedData, 0, receivedData.Length); //读取数据 sp1.DiscardInBuffer(); //清空SerialPort控件的Buffer string strRcv = null; for (int i = 0; i < receivedData.Length; i++) //窗体显示 { strRcv = receivedData[i].ToString("X2"); //16进制显示 mydata[i] = receivedData[i]; richTextBox1.Text += strRcv; //显示在16进制数据栏 richTextBox1.Text += ","; //让每个数据都隔开 } } catch (System.Exception ex) { MessageBox.Show(ex.Message, "出错提示"); // txtSend.Text = ""; } } } else { MessageBox.Show("请打开某个串口或者没有选中16进制接收", "错误提示"); } } 请问这个函数就这么摆在form1.cs中有用吗?? 我想要没过一段时间接收到一个来自串口的数据,然后得到数据来绘图,我真的不懂啊,我做到现在,接着该干什么了? ![![图片说明](https://img-ask.csdn.net/upload/201609/28/1475058528_152554.png)图片说明](https://img-ask.csdn.net/upload/201609/28/1475058511_129833.png) 请问是不是还需要线程什么的?我没接触这个多久,只是会用一些控件,但是被要求突然做个上位机,也是蒙逼的,求大神指点!!!

C# 串口发送卡死 求大神解决

上位机和底层的通信方式是同步的,上位机第一次发送可以完成。 串口接收到返回的信息进行判断,然后直接在接收函数中再次发送。 设置断点可以完成整个过程,但是直接运行,就卡死。 目前发现是接收到返回的信息后再次发送的时候,卡死。 请问如何解决? ``` //串口接收事件 private void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) { while (comm.BytesToRead > 0) { rx_Buf[rx_Cnt++] = (byte)comm.ReadByte(); } if (rx_Cnt == 8) { //8个字节 接收完成 rx_Cnt = 0; } else { return; } Console.WriteLine("-----接收发回帧-----"); if (rx_Buf[0] == 0xFF && rx_Buf[1] == 0xFE && rx_Buf[6] == 0xFE && rx_Buf[7] == 0xFF) { switch (rx_Buf[4]) { case 0x01: if (rx_Buf[5] == 0xAA) { flag_State = FLAG_STATUS.STATE_WRITE; send_file = true; Console.WriteLine("-----验证成功 开始发送文件-----"); } else { MessageBox.Show("0x01 失败"); } break; case 0x02: if (rx_Buf[5] == 0xAA) send_file = true; else MessageBox.Show("0x02 失败"); break; default: MessageBox.Show("失败"); break; } //验证通过,发送文件 if (send_file) { if (transLen < fileLenth) { int len = fs.Read(sendBuf, 5, 1024); Console.WriteLine("len:" + len.ToString()); if (len > 0) { uint crcValue = Fn_GetCRC32(sendBuf, 5, 1024); byte[] crcBytes = new byte[4]; for (int i = 4; i > 0; i--) { crcBytes[4 - i] = (byte)(crcValue & 0xFF); crcValue >>= 8; } for (int i = 0; i < 4; i++) { sendBuf[1029 + i] = crcBytes[i]; } transLen += len; comm.DiscardOutBuffer(); Console.WriteLine("-----清空发送缓冲区-----"); comm.Write(sendBuf, 0, sendBuf.Length); Console.WriteLine("transLen:" + transLen.ToString()); Console.WriteLine("------------------------------------"); } } else { MessageBox.Show("烧写完成"); try { fs.Close(); comm.Close(); } catch (Exception) { } } send_file = false; } } } ```

上位机串口与stm32连接,如何编写上位机代码

想要实现在pc上用串口传递信息给stm32板子,不想用串口调试助手,想直接在dev c++或者vc,vs上运行程序,然后 直接把想要传递的字符串串口传递给板子。希望大神可以帮忙指导,不胜感激,如果能很快解决的话悬赏增加,学生党,求大神指导。也可以发邮箱a4507408789@163.com

C# USB转串口程序问题

现在是这样,我正在学C#,想先学学上位机程序,决定从串口通讯开始学习; 我手上有个施耐德和ABB的PLC,我准备用电脑走MODBUS/RTU通讯来控制PLC; 但是现在我发现我的电脑上没有串口,即在设备管理器里面看不到端口这个栏目,没有COM口; 我记得我以前调试MODBUS/RTU通讯的时候,有用到一个USB转串口的线,然后用一个串口调试助手来实现数据截取;我很疑惑这个程序是不是从USB端口里面拿的数据,即数据经过USB转串口线,然后程序读取USB内的数据,在展现出来; 那么问题来了,我现在是继续寻找发掘现在电脑的串口在哪里,继续走开发串口的路子; 还是用USB转串口这样,从USB口走数据,然后自己写一个串口调试工具这样

请问各位大神,在c#串口通讯中,怎么把接收到的数据保存在Excel表格中?

本人最近做一个项目时需要把串口接收到的数据进行分析,数据量较大,比如5秒钟保存一次,连续工作一天,本人刚接触c#,串口通讯协议已写好,现在的问题是怎么把数据保存在Excel表格中以便分析?各位大神有没有用C#做过项目,求指教,最好有源代码!本人刚进论坛,没分,如果满意的话以后再补给你!!!!!!!!!急!!!!!!

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

C++11:一些微小的变化(新的数据类型、template表达式内的空格、nullptr、std::nullptr_t)

本文介绍一些C++的两个新特性,它们虽然微小,但对你的编程十分重要 一、Template表达式内的空格 C++11标准之前建议在“在两个template表达式的闭符之间放一个空格”的要求已经过时了 例如: vector&lt;list&lt;int&gt; &gt;; //C++11之前 vector&lt;list&lt;int&gt;&gt;; //C++11 二、nullptr ...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

【阿里P6面经】二本,curd两年,疯狂复习,拿下阿里offer

二本的读者,在老东家不断学习,最后逆袭

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...

作者 | 伍杏玲出品 | CSDN(ID:CSDNnews)格子衬衫、常掉发、双肩包、修电脑、加班多……这些似乎成了大众给程序员的固定标签。近几年流行的“跨界风”开始刷新人们对程序员的...

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

立即提问
相关内容推荐