zp820 发表于 2011-8-11 13:35:11

C#如何实现串口自动接收数据

各位大神,C#如何实现串口自动接收数据?请尽量写得详细点,先谢谢了!

pigjiang 发表于 2011-8-11 13:36:44

看“缓冲区满”能否作为一个event?

zp820 发表于 2011-8-15 17:11:14

解决了,serialport控件有个DataReceived事件!

zhq0571 发表于 2011-8-15 17:40:30

在中断中接收加入到缓冲区,在定时进行处理。

      private void serialPort_强电_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
      {
            // if (timer1.Enabled)
            CommReading_强电 = true;
            while (serialPort_强电.BytesToRead > 0)
            {
                //apps.BASE.Queue_同步.IN((byte)serialPort_同步.ReadByte());

                byte d = (byte)(serialPort_强电.ReadByte() & 0x000000ff);
                // lock(COM_同步_Data)
                {
                  COM_强电_Data.Enqueue(d);
                }
                // Application.DoEvents();
            }
            CommReading_强电 = false;
      }

private void 强电接收()
      {
            string recs = "";
            // bool h = false;
            //byte Hbyte = 0x00;
            if (CommReading_强电) return;
         // lock (COM_强电_Data)
            {


                while (COM_强电_Data.Count > 0)
                //while(apps.BASE.Queue_同步.HaveData())
                {
                  while (CommReading_强电)
                  {
                        Application.DoEvents();
                  }

                  COM_强电_LastD = COM_强电_ReadD;

                  COM_强电_ReadD = Convert.ToByte(COM_强电_Data.Dequeue());
                  //COM_同步_ReadD = apps.BASE.Queue_同步.OUT();
                  recs += COM_同步_ReadD.ToString("X2");



                  if (COM_强电_ReadD == 0xAA)
                  {
                        COMRecData_i强电 = 0;

                        //h = true;
                        COM_强电_Recing = true;
                        continue;
                  }

                  if (COMRecData_i强电 > 100) COMRecData_i强电 = 0;
                        if (COM_强电_ReadD == 0xBB)
                        {
                            //COMRecData_强电 = 0xBB;
                            //收到强
                            if ((COMRecData_强电==0x01)&&(COMRecData_强电==0xFE)) //开机
                            {
                              LOG_强电("收到:强电开启应答");
                            }

                            if ((COMRecData_强电 == 0x02) && (COMRecData_强电 == 0xFD)) //关机
                            {
                              
                              LOG_强电("收到:强电关闭应答,退出程序");
                              apps.Form_main.自动关机 = true;
                              apps.Form_main.Close();
                            }



                            COM_同步_Recing = false;
                            continue;
                        }
            

                  if (COM_强电_Recing)   //有数据头!
                  {
                        COMRecData_强电 = COM_强电_ReadD;//| (byte)(COM_同步_ReadD & 0x0f));
                        COMRecData_i强电++;

                        /* if (h)
                           {
                               Hbyte = (byte)((COM_同步_ReadD << 4));// & 0xf0);
                               h = false;
                           }
                           else
                           {
                               COMRecData_同步 = (byte)(Hbyte | (COM_同步_ReadD & 0x0f));
                               COMRecData_i同步++;
                               h = true;
                           }*/
                  }
                }
            }

      }

myhonour 发表于 2011-9-5 14:20:51

mark

flame0510 发表于 2011-9-16 23:55:12

mark
页: [1]
查看完整版本: C#如何实现串口自动接收数据