none
急问!!!有关接收串口数据的问题! RRS feed

  • 问题

  •       最近在编写一个从串口读取数据画出波形的软件。但是在调试时发现,数据采集板发送的数据不能全部接收并画出,波形中只有几段是正常的,其余全是巨大跳动的数值。但是用串口调试助手接收数据采集板发送的数据后,利用串口调试助手将此数据一次性发送到软件中,此时波形完全没有问题。我知道问题出在串口数据接收上,但却知道该怎么办,请各位大侠帮帮看看,谢谢!

    代码段一:串口数据接收代码

            private void serialPortData_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                byte[] readBuffer = new byte[serialPortData.ReadBufferSize];
                int bytesRead = serialPortData.Read(readBuffer, 0, readBuffer.Length);
                if (isTimeOut)
                {
                    isTimeOut = false;
                    bufferCurrent = 0;
                    drawAxes();
                }
                else
                {
                }
                for (int i = 0; i < bytesRead; i = i + 2)
                {
                    buffer[bufferCurrent] =Convert.ToUInt16( readBuffer[i] << 8 | readBuffer[i + 1]);
                    bufferCurrent++;
                    if (bufferCurrent == 4000)
                    {
                        serialPortData.Close();
                        timeCount = 0;
                        break;
                    }
                }
                timeCount = 0;
            }

    代码二:波形绘制代码段

            private void drawCurve()
            {
                for (int i = 0; i < bufferCurrent - 1; i++)
                {
                    try
                    {
                        int temp1 = Convert.ToInt32(axesrect.Height - buffer[i] / Convert.ToDouble(0x4000) * axesrect.Height);
                        int temp2 = Convert.ToInt32(axesrect.Height - buffer[i + 1] / Convert.ToDouble(0x4000) * axesrect.Height);
                        gdi.DrawLine(Pens.Blue, Convert.ToInt32(Convert.ToDouble(i) / 4000.0 * axesrect.Width) + axesrect.Left+70, temp1 + padding, Convert.ToInt32(Convert.ToDouble(i + 1) / 4000.0 * axesrect.Width) + axesrect.Left+70, temp2 + padding);
                    }
                    catch
                    {

                    }
                }
                pictureBoxAxes.Image = bmap;
            }


    菜鸟不怕!
    2010年12月29日 12:58

答案

  • 可能有2个问题。1:接收的数据不完整。2:在其他线程内不允许操作UI界面。

    serialPortData_DataReceived事件相当难控制,建议另写线程来实现数据接收。

    2010年12月30日 5:34

全部回复

  • 一般设备都会提供测试demo代码

    最好参考这些代码来写。比较靠谱。


    family as water
    2010年12月29日 14:20
  • 可能有2个问题。1:接收的数据不完整。2:在其他线程内不允许操作UI界面。

    serialPortData_DataReceived事件相当难控制,建议另写线程来实现数据接收。

    2010年12月30日 5:34