繁体   English   中英

读取串行端口在Windows XP中工作正常,但在Windows 7中停止工作并变慢

[英]Read serial port work good in windows XP but stop working and slow in windows 7

我说的是C#编程,并与Windows 7和XP中的串行端口和不同的结果进行通信。 我的代码是:

    int count = 0;
    float data1;
    float data2;
    private void button1_Click(object sender, EventArgs e)
    {
        serialPort1.PortName = textBox1.Text;
        serialPort1.BaudRate = Convert.ToInt32(textBox2.Text);

        serialPort1.Open();
        serialPort1.Write("?");

    }

    private void button2_Click(object sender, EventArgs e)
    {
        serialPort1.Close();

    }

    private void button3_Click(object sender, EventArgs e)
    {
        //string pathfile = @"C:\Documents and Settings\Dlab\Desktop\";
        //string filename = "data1.txt";
        //System.IO.File.WriteAllText(pathfile + filename, chart1.SaveImage();
       // this.chart1.SaveImage(@"C:\Documents and Settings\Dlab\Desktop\data1p.png", System.Drawing.Imaging.ImageFormat.Gif);

        //Bitmap bmp1 = new Bitmap(500, 500);
        //chart1.DrawToBitmap(bmp1, new Rectangle(0, 0, 500, 500));
        //bmp1.Save(@"C:\Documents and Settings\Dlab\Desktop\data1b.png");

        //chart1.Serializer.Save(@"C:\Documents and Settings\Dlab\Desktop\data1t.text");



        //this.chart2.SaveImage(@"C:\Documents and Settings\Dlab\Desktop\data2p.png", System.Drawing.Imaging.ImageFormat.Gif);

        //Bitmap bmp2 = new Bitmap(500, 500);
        //chart2.DrawToBitmap(bmp2, new Rectangle(0, 0, 500, 500));
        //bmp2.Save(@"C:\Documents and Settings\Dlab\Desktop\data2b.png");

        //chart2.Serializer.Save(@"C:\Documents and Settings\Dlab\Desktop\data12.text");
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // string[] ports = SerialPort.GetPortNames();
        //foreach (string port in ports)
        //{
        //   comboBox1.Items.Add(port);

        // }

    }

    byte[] rs = new byte[53];


    int rscnt = 0;
   // DateTime then = DateTime.Now;
   // float dt;
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {





        if (e.EventType != SerialData.Chars) return;
        rscnt += serialPort1.Read(rs, rscnt, 53 - rscnt);
        if (rscnt == 53)
        {
            this.BeginInvoke(new Action(() => type(rs)));
            rs = new byte[53];
            rscnt = 0;
        }

    }
    private void type(byte[] data)
    {
        //if (rs[0] == 65)
        //{ 
       // }
        //DateTime now = DateTime.Now;
        //dt = ((now.Second - then.Second));
        //label8.Text =  dt.ToString();
        //textBox3.Text = dt.ToString();


        data1 = ((rs[1] * 65536) + (rs[2] * 256) + (rs[3])-10000000)/100;
        data2 = ((rs[4] * 16777216) + (rs[5] * 65536) + (rs[6] * 256) + (rs[7])-1000000000)/2136;

        count++;
        label5.Text = count.ToString();
        label3.Text = data1.ToString();
        label4.Text = data2.ToString();

        //chart1.Series[0].Points.AddXY(count, data1);
        //chart2.Series[0].Points.AddXY(count, data2);

        //list1.Add(count, rs[1]);
        //zedGraphControl1.GraphPane.AddCurve("", list1, Color.Red);

        //zedGraphControl1.AxisChange();
        // zedGraphControl1.Refresh();
        serialPort1.DiscardInBuffer();



    }
    //  PointPairList list1 = new PointPairList();
}
}

该程序在Windows XP中可以很好地工作,但是当我在Windows 7中尝试时,它的速度很慢,会得到错误的数据,并且稍有停止工作之后。

我在Windows 7和XP中再次编写了该程序,并在Visual Studio 2008和2012中对其进行了测试,但结果却相同。

private void type(byte[] data)
{
   ...
   serialPort1.DiscardInBuffer();
}

那真是个讨厌的错误。 您正在丢弃接收缓冲区中不应丢弃的字节。 您执行此操作的确切时间是高度不可预测的,这取决于type()开始运行的时间。 它运行在UI线程上,因此计时非常难以预测,并且肯定会受到在此操作系统上运行的操作系统的影响。 在XP上完全可以使用,这只是个运气。

使用DiscardInBuffer()几乎是不正确的,只有在调用SerialPort.Open()从接收缓冲区中清除旧数据后才使用它。 或者要从协议错误中恢复,请尝试重新同步发送器和接收器。 但是您没有协议,像这样丢弃字节只会产生垃圾数据,而缺少随机字节集。 产生延迟,您只能从下一次传输中使缓冲区充满一些字节。 并且崩溃,无论您如何处理损坏的数据,都有可能严重崩溃。

必须删除该语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM