我想做一个程序每100ms从串口读数据保存,每500ms从将得到的数据波形显示,先做的保存以下是代码
namespace _0090107
{
    public partial class Form1 : Form
    {
        SerialPort port1 = new SerialPort();//实例化串口类
        
        public Form1()
        {
            InitializeComponent();
            
        }
        private const string FILE_NAME = "record.dat";
        public static void WriteFile(string str)//存储方法
        {
            System.IO.StreamWriter sr;
            if (System.IO.File.Exists(FILE_NAME)) //如果文件存在,则创建File.AppendText对象
            {
                sr = System.IO.File.AppendText(FILE_NAME);
            }
            else   //如果文件不存在,则创建File.CreateText对象
            {
                sr = System.IO.File.CreateText(FILE_NAME);
            }
            sr.WriteLine(str);
            sr.Close();
        }       
        private void Form1_Load(object sender, EventArgs e)
        {
            port1.ReadBufferSize = 1048576;//设置串口通信参数
            port1.PortName = "COM11";
            port1.BaudRate = 115200;
            port1.Parity = 0;
            port1.ReadTimeout = 1000;
            port1.DataBits = 8;
            port1.StopBits.Equals(1);
            port1.Open();
            
        }        private void button1_Click(object sender, EventArgs e)//单击事件
        {Thread myThread = new Thread(new ThreadStart(save));//创建新线程
            myThread.Start();
           
        }
        private void save()
        {
            while (port1.BytesToRead>0)
            {
                DateTime dt1 = DateTime.Now;
                int data = Convert.ToInt32(port1.ReadLine());
                string abc = Convert.ToString(data);
                WriteFile(abc);
                if (DateTime.Now - dt1 > new TimeSpan(100))
                {
                    break;
                }
                else
                {
                    Thread.Sleep(Convert.ToInt32( 100 - (DateTime.Now - dt1).TotalMilliseconds)); 
                
                }
            
           
            }       
        
        }    }
}现在的问题是我必须点一次button1才会读进一个新数据,可我希望的是点一下之后,就不用管了,每100ms保存一个,自动的,我试过把创建新线程放在一个timer_tick里,但是有人告诉那样不好,所以我用了while。或者我用readline()是一种错误,该用readbyte(),将他们放到一个数组,真的糊涂了,希望各位朋友帮忙解答。

解决方案 »

  1.   

    点一下之后,就不用管了:port1.BytesToRead>0 因为这里 你已经全部读出了来了,所以结束了,只要再套一个while 就可以while(我要读){ while (port1.BytesToRead>0) 
                {          
              
                }    
      
    }另为什么不用 srial port 的 Event
      

  2.   

           #region serialPort_DataReceived 扫描处理
            private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
           {
              自动触发!
           }
           
           #region serialPort_ErrorReceived
            private void serialPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
            {
                MessageBox.Show(e.ToString(), "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Error);        }
            #endregion
      

  3.   

    serialPort_DataReceived  时间配合 定时器就可以满足你的需求了!
      

  4.   

    Datareceive本身就是线程模式啊,那还管那么多干嘛,每次收到数据的时候,保存一下应该就可以了吧
      

  5.   

    private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 

       //这个好使
       while (port1.BytesToRead>0) 
       { 
           int data = Convert.ToInt32(port1.ReadLine()); 
           string abc = Convert.ToString(data); 
           WriteFile(abc); 
        }
      

  6.   

    谢谢大家的帮助,特别是一楼教会了我用线程的sleep来做定时器,两个while循环的嵌套加上一个sleep,我是觉得很巧了。因为我知道一个程序是不能拖两个timer控件的,所以我在想两件需要定时做的事情怎么才能只用一个timer控件来实现,那就是自己做一个。也就是一楼的办法,用线程。接下来我就是否可以在我的另一个timer控件里画图的程序了,那个程序也用到了port1.readline(),请问大家,能否用,是否会阻塞,怎么解决?多线程,泛型,缓存,还是从已经保存的文件中读取,总之我已经很乱了...
      

  7.   

    还有一个新问题就是采样频率如果和发射端频率差别很大,数据就停止存储了,这是怎么回事?是readline()的问题吗?
      

  8.   

    都用timer就好了,怎么会混乱?两个都是独立执行的线程,有自己的时间,你可以自己设定时间。没影响的
    我不理解的是为什么说用timer不好?Sleep也差不多的
      

  9.   

    不好意思,先前没有明白,其实你想要的只是一个双线程的东西就行
    利用System.Threading.Timer实现多线程 
      

  10.   

    2楼   7楼的朋友给你的方法,你可以试。串口是自动监听数据的,发送一次,接收写在DataReceived事件里,你的处理及保存都可以放在此事件里写。
    如果想定时保存,那就加timer控件。   此功能建议楼主不要使用线程来操作。
    private void selMonitor_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                try
                {
                    this.txtInceptValues.Text = "";保存接收的值。
                    for (int count = 0; count < selMonitor.BytesToRead; count++)
                    {
                        byte[] singlebyte ={ (byte)this.selMonitor.ReadByte()};
                        string temp = BitConverter.ToString(singlebyte);
                        this.txtInceptValues.Text = this.txtInceptValues.Text + temp;
                    }
                    在此做处理或是保存数据。
                }
                catch
                {
                }
            }