none
串口接收速度与绘图显示的问题 RRS feed

  • 问题

  • 我最近在做一个类似示波器的东西。通过串口发送数据到电脑并把它们绘制成图表。

    使用的控件是serialPort。

    但是通过和其他的串口软件相比较我发现自己的程序接收速度远比不上。

    别的程序接收了几万个字节,我的才显示接收了几千个。

    我想这是不是跟我在Data_Received事件中绘图有关?

    2012年5月1日 11:56

答案

全部回复

  • Hi Xulao,

    欢迎来到C#论坛。

    你能够提供一些关于该问题更详细的信息吗?你可以看看下面的与该问题类似的帖子。

    http://topic.csdn.net/u/20110212/14/a4daaaf6-b9ff-441f-8d19-71306c40da0c.html

    http://topic.csdn.net/u/20120305/17/d40c302c-eb3e-438c-8c05-6389d5f6e7c5.html?62858

    祝你愉快。


    Bob Shen [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月2日 7:54
    版主
  • 我来详细解释一下吧:

    我的程序的主要功能就是采集数据然后将其绘制成图形。

    首先我在窗体上创建了一个PictureBox作为绘图区域。

    然后进行串口接收。我建立了一个元素数量等同于PictureBox宽度的数组datas[]用以存储信息。

    当接收的数据满了之后,再用矩阵的方式显示在窗体上,使用System.Graphics类。

    现在的主要问题就是这个程序接收数据的速度比较慢,是不是因为我绘图的原因?

    如图显示,打开串口8秒钟后才接收了5931个字节。而在别人的程序中能达到2万多。

    这是串口接收部分的程序:

            int data_receive_number;
            int graphics_recive_number;
            int[] datas = new int[700];               //数据数组

            private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                int n=serialPort1.BytesToRead;
                int draw_n;
                byte[] buf=new byte[n];
                data_receive_number += 1;
                serialPort1.Read(buf,0,n);           //读数据

                /*******Graphics Showing Method 1********/
                graphics_recive_number += 1;
                datas[graphics_recive_number] = buf[n - 1];
                if (graphics_recive_number >= 699)
                {
                    Graphics g = pictureBox1.CreateGraphics();
                    g.TranslateTransform(0, pictureBox1.Size.Height);
                    g.ScaleTransform(1.0F, -1.0F);                     //初始化坐标轴
                    Pen p = new Pen(Color.Green, 1);
                    g.Clear(Color.Khaki);
                    for (draw_n = 0; draw_n <= 699; draw_n++)
                    {
                        g.DrawLine(p, draw_n, datas[draw_n], draw_n, datas[draw_n] + 1);  //依次画点
                    }
                    graphics_recive_number = 0;
                }
                /*****************************************/

                
                /********Text Showing*******/
                    this.Invoke((EventHandler)(delegate
                    {
                        label_RecNum.Text = Convert.ToString(data_receive_number);  //显示接收数量
                    }));
                 /***************************/
            }


    • 已编辑 Xulao 2012年5月2日 11:20
    2012年5月2日 11:18
  • Hi Xulao,

    你可以试试改变串口的缓冲大小,同时你可以考虑用多线程来处理。请参考以下链接:

    http://topic.csdn.net/u/20120305/17/d40c302c-eb3e-438c-8c05-6389d5f6e7c5.html

    祝你愉快。


    Bob Shen [MSFT]
    MSDN Community Support | Feedback to us

    2012年5月7日 6:10
    版主