nc33693 2023-03-23 09:59 采纳率: 40%
浏览 30
已结题

Visual studio最后一问,愿全世界编程人员编程无bug,每日不加班。

这几天的问题依旧没解决,我是否不太适合做这一行了。我是一名普通学校的实习生,这个其实是我的第一个项目任务,完成一个上位机开发。我现在把我写的Visual studio代码放在这了。如果今天还是没完成,我在考虑是否要辞职了。可惜了我这三周的工作时长了,但是我真的受不了天天对着完成不了的任务了。
望有人个给我个方向,或者帮我看看有没有解决的方法。 一名物联网工程专业人未毕业但是想从事嵌入式的学生
这是我的数据显示函数

 private void analysisdata()//数据接收分析
        {
            //if ((Readbuff[0] == 0x55) && (Readbuff[19] == 0xAA))
            //{
                //int checksum = 0;
                //for (int m = 1; m < 18; m++)
                //{
                //    checksum += Readbuff[m];
                //}
                //byte check = (byte)checksum;
                //if ((check == Readbuff[18]) && ((Readbuff[3] & 0X08) == 0X08))
                {
                    int rev;
                    int stack;
                    int softstart;
                    textBox1.Text = Readbuff[1].ToString();
                    textBox5.Text = Readbuff[2].ToString();
                    textBox7.Text = Readbuff[4].ToString();
                    textBox9.Text = Readbuff[5].ToString();
                    textBox10.Text = Readbuff[6].ToString();
                    textBox11.Text = Readbuff[15].ToString();

                    rev = Readbuff[3];
                    rev &= 0x01;
                    if (rev == 0x01)
                    {
                        textBox8.Text = 1.ToString();
                    }
                    else
                    {
                        textBox8.Text = 0.ToString();
                    }
                    stack = Readbuff[3];
                    stack &= 0x10;
                    if (stack == 0x10)
                    {
                        textBox13.Text = 1.ToString();
                    }
                    else
                    {
                        textBox13.Text = 0.ToString();
                    }
                    softstart = Readbuff[3];
                    softstart = softstart & 0X20;
                    if (softstart == 0X20)
                    {
                        textBox14.Text = 1.ToString();
                    }
                    else
                    {
                        textBox14.Text = 0.ToString();
                    }
                    textBox2.Text = (Readbuff[11] + (Readbuff[12] << 8)).ToString();
                    textBox3.Text = (Readbuff[7] + (Readbuff[8] << 8)).ToString();
                    textBox4.Text = (Readbuff[9] + (Readbuff[10] << 8)).ToString();
                    textBox6.Text = (Readbuff[13] + (Readbuff[14] << 8)).ToString();
                    textBox12.Text = (Readbuff[16] + (Readbuff[17] << 8)).ToString();
                    textBox15.Text = (textBox15.ToString() + "读取成功!!");
                    readbit = false;
                    readornot = false;
                    return;
                }
            //}
        }

这个是我的读取数据按钮

 private void button3_Click(object sender, EventArgs e)//参数读取
        {
            panel1.Visible=false;
            Thread.Sleep(100);
            panel1.Visible = true;
            byte[] command = new byte[] { 0x55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xAA };
            int receiveData = serialPort1.BytesToRead;        //读取缓存区字节数目
            textBox15.Text = Convert.ToString(receiveData);
            DateTime ReadStartTime = DateTime.Now;
            //int i = 0;
            // for(i=0;i<18;i++)
            //{
            //    command[i+1] = Readbuff[i+1];
            //}
            if (serialPort1.IsOpen)
            {
                try
                {
                    serialPort1.Close();
                    //MessageBox.Show("请检查串口!!");
                }
                catch 
                {
                    
                }
            }
            try
            {
                serialPort1.PortName=comboBox1.Text;
                serialPort1.Open();
                serialPort1.DiscardInBuffer();
                serialPort1.DiscardOutBuffer();
            }
            catch 
            {
                textBox15.Text = (textBox15.ToString() + "打开串口失败!!");
                return;
            }
            if(serialPort1.IsOpen)
            {
                try
                {
                    analysisdata();
                    //serialPort1.Write(command, 0, command.Length);
                }
                catch
                {
                    MessageBox.Show("读取失败,请检查串口!!");
                    return ;
                }
                Thread.Sleep(100);
                serialPort1.DiscardInBuffer();
                readbit = true;
                Thread.Sleep(100);
            }
            else
            {
                serialPort1.DiscardInBuffer();
                serialPort1.DiscardOutBuffer();
                MessageBox.Show("读取失败,请检查串口!!");
                return;
            }
        }

这个是我的串口接收函数


 private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)//数据处理并判断
        {
            int receiveData = serialPort1.BytesToRead;        //读取缓存区字节数目
            textBox15.Text = Convert.ToString(receiveData);
            DateTime ReadStartTime = DateTime.Now;
                byte[] rdata = null;
                Thread.Sleep(100);
               // if (serialPort1.BytesToRead < 20)
               //    return;
                rdata = new byte[serialPort1.BytesToRead];
                try
                {
                    serialPort1.Read(rdata, 0, rdata.Length);
                }
                catch
                {
                    MessageBox.Show("写入数据失败,请检查串口号", "失误");
                }
                int i = 0;
                foreach (byte member in rdata)
                { 
                  Readbuff[i] = (byte)member;
                    i++;
                }
            if ((Readbuff[0] == 0X55) && (Readbuff[19] == 0XAA))
                {
                    int icnt;
                    int checksum = 0;
                    for (icnt = 1; icnt < 18; icnt++)
                    {
                        checksum += Readbuff[icnt];
                    }
                    byte check = (byte)checksum;
                    if ((Readbuff[18] == check) && ((Readbuff[3] & 0X04) == 0X04))
                    {
                        writeornot = true;
                    }

                }
                else
                {
                    MessageBox.Show("写入数据失败,请检查数据", "失误");
                }
               // Thread.Sleep(100);
                //serialPort1.DiscardInBuffer();
                //serialPort1.DiscardOutBuffer();
                //analysisdata();
                //Thread.Sleep(100);
            
        }
  • 写回答

2条回答 默认 最新

  • wanghui0380 2023-03-23 11:10
    关注

    古老的问题,也是某园子挖了无数年的坑,坑了无数代的新手了
    sleep?Readbuff[0],serialPort1.DiscardInBuffer()?
    这些都是那些园子里不负责的博主犯下的罪啊

    问题1:你用了2个地方读取一个共享的缓冲区,请保留一个(就好比快递公司通知你有快递到了,然后有2个人去拿了,肯定是后一个人拿的时候,人家告诉你已经取走了)
    解决方法:只让一个人拿,让他拿了给你放回寝室

    问题2:请拿掉所有的Thread.Sleep(100)(就好比快递公司公司通知你快递到,你说我不急,我先睡个1小时再说。或者说你觉着快递公司不会通知你,你非要说每隔1个小时去问问快递公司到了没有)

    问题3:去掉所有的serialPort1.DiscardInBuffer();(这是清除缓冲区,就好比快递公司说快递到了,你不来取我就扔了。好吧,你没事就扔掉,然后还怪取不到值?)

    问题4:Readbuff[0]??(还是快递公司把,你定了2次10件货,假设快递公司严格按次序给你送。现在的问题是无论你是每隔1小时亲自问,还是快递公司给通知,假设第一次到了3件,第二次到了5件,第3次到了2件----你可以想到除了第一次的buffer[0]是准的,后面都不会准

    解决办法:https://ask.csdn.net/questions/7906231?spm=3001.5141

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月31日
  • 已采纳回答 3月23日
  • 创建了问题 3月23日

悬赏问题

  • ¥15 前后端分离的学习疑问?
  • ¥15 stata实证代码答疑
  • ¥15 MATLAB数据处理插值
  • ¥50 husky+jaco2实现在gazebo与rviz中联合仿真
  • ¥15 dpabi预处理报错:Error using y_ExtractROISignal (line 251)
  • ¥15 在虚拟机中配置flume,无法将slave1节点的文件采集到master节点中
  • ¥15 husky+kinova jaco2 仿真
  • ¥15 zigbee终端设备入网失败
  • ¥15 金融监管系统怎么对7+4机构进行监管的
  • ¥15 硬件IIC从模式的数据发送,中断数据的接收,不能用HAL库(按照时序图)