using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;namespace PC上位机
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort_DataReceived);
        }        private void CKbutton_Click(object sender, EventArgs e) //“打开关闭串口”按钮
        {
            string CommNum = this.CKH.Text;
        
            int IntBdr = Convert.ToInt32(this.BTL.Text);//将串口号和波特率存起来
            if (!serialPort.IsOpen)                      //如果串口是关闭的
            {
                serialPort.PortName = CommNum;
                serialPort.BaudRate = IntBdr;           //设定串口号和波特率
                try     //try:尝试下面的代码,如果错误就跳出来执行catch里面代码
                {
                   
                    serialPort.Open();  //打开串口
                   
                    CKbutton.Text = "关闭串口"; //改变按钮上的字符
                    CKH.Enabled = false;
                    BTL.Enabled = false;
                 
                }
                catch 
                {
                    MessageBox.Show("串口打开失败了!\n\n可能是串口已补占用。");                   
                }
            }
            else//如果串口是打开的
            {
                serialPort.Close();         //关闭串口;
                CKbutton.Text = "打开串口"; //改变按钮上的字符
                CKH.Enabled = true;
                BTL.Enabled = true;         //将串口号与波特率选择控件打开
            }
           
        
        }
        ArrayList data = new ArrayList();        public ArrayList Data
        {
            get { return data; }
            set { data = value; }
        }
        Pen myPen = new Pen(Color.Red);        #region xy增益与坐标申明
        private float xGain;//x增益
        public float XGain
        {
            get { return xGain; }
            set { xGain = value; }
        }
        private float yGain;//y增益        public float YGain
        {
            get { return yGain; }
            set { yGain = value; }
        }
        private float xOrigin;//x原点        public float XOrigin
        {
            get { return xOrigin; }
            set { xOrigin = value; }
        }
        private float yOrigin;//y原点        public float YOrigin
        {
            get { return yOrigin; }
            set { yOrigin = value; }
        }
        private float xNext;//x新坐标        public float XNext
        {
            get { return xNext; }
            set { xNext = value; }
        }
        private float yNext;//y新坐标        public float YNext
        {
            get { return yNext; }
            set { yNext = value; }
        }
        private float i;        public float I
        {
            get { return i; }
            set { i = value; }
        }
        #endregion
   
 
        private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            for (int d = 0; d < 8; d++)
            {
                data.Add(serialPort.ReadByte());
            }
        }        public void draw()
        {            Bitmap bm = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            Graphics g = Graphics.FromImage(bm);
            xGain = i;
            i = (float)(i + 0.01);            yGain = float.Parse(data[7].ToString());
       data.Clear();    
            xNext = xGain + xOrigin;
            yNext = yGain + yOrigin;
            g.DrawLine(myPen, xOrigin, yOrigin, xNext, yNext);
            xOrigin = xNext;
            yOrigin = yNext;           
            g.Dispose();
            g = this.pictureBox1.CreateGraphics();
            g.DrawImage(bm, 0, 0);
            g.Dispose();
            //数据测试代码段:
            textBox1.Invoke(new EventHandler(delegate
             {
             textBox1.AppendText(Convert.ToString(data[data.Count - 1]) + " ");
             textBox1.ScrollToCaret();
             }));
            data.Clear();
        }        private void timer1_Tick_1(object sender, EventArgs e)
        {
            draw();
        }
大家帮我看看这段代码,上位机接收串口数据并绘图。为什么textBox1收不到数据,pictureBox1也无法绘图.

解决方案 »

  1.   

    能不能说的具体点。   data.Add(serialPort.ReadByte());系统老是说这句话有问题“由于线程退出或应用程序请求,已放弃IO操作”
      

  2.   


    ReadByte()是阻塞的
    假如串口没有数据,程序还调用ReadByte()会阻塞在那,这时你串口关闭会抛出异常。
      

  3.   

     for (int d = 0; d < 8; d++)
      {
      data.Add(serialPort.ReadByte());
      }
    为什么要用循环。
    你先看看抛出异常的时候d等于多少。
      

  4.   

             private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
               // for (int d = 0; d < 8; d++)
                //{
                    //data.Add(serialPort.ReadByte());
                //}
                string data = serialPort.ReadExisting();
                updateReceiveText(data);
            }添加:
    public void updateReceiveText(string msg)
            {
             
              textBox1.Invoke(new EventHandler(delegate
                {
                    textBox1.AppendText(msg);
                    textBox1.ScrollToCaret();
                }));
            }我这样改了后可以收到数据了。但是怎么把串口的数据给 “ArrayList data = new ArrayList();”
    并正确收到显示画图呢
      

  5.   

    int bytes = serialPort.BytesToRead;
    buffer = new byte[bytes];
    serialPort.Read(buffer, 0, bytes);
    不要ArrayList,用List
    list.AddRange(buffer);
      

  6.   

    http://blog.csdn.net/wuyazhe/category/695097.aspx
      

  7.   

    在串口接收数据的函数里,先判断有没有数据,有的话再接收,
    直接接收数据当然会出现问题。
    另外串口的配置也要注意。看看波特率、奇偶校验、停止位等等是不是和设备的参数相同。
    另外如果你的电脑串口是usb转的串口,也许也会有问题。
    你可以先找个串口调试助手来试试,能不能接受到数据。
      

  8.   

    觉得是这段代码出了问题:
    private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
      {
      for (int d = 0; d < 8; d++)
      {
      data.Add(serialPort.ReadByte());
      }
      }
    好像data.Add并没有把数据添加到data
    怎么改啊
      

  9.   

    我用下面这段代码可以收到数据:
    private void serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
      {
      // for (int d = 0; d < 8; d++)
      //{
      //data.Add(serialPort.ReadByte());
      //}
      string data = serialPort.ReadExisting();
      updateReceiveText(data);
      }添加:
    public void updateReceiveText(string msg)
      {
        
      textBox1.Invoke(new EventHandler(delegate
      {
      textBox1.AppendText(msg);
      textBox1.ScrollToCaret();
      }));
      }
    但是用data却不行