【问题标题】:C# - readin from serial port bufferC# - 从串口缓冲区读取
【发布时间】:2009-09-04 12:51:14
【问题描述】:

我正在尝试从 RS-232 端口读取数据。有没有人举例说明我如何从端口/缓冲区获取数据并确保我拥有所有数据,因为它可以是多行数据。

我是不是简单的把它读成下面这样?

string Rxstring = port.ReadLine();
Console.WriteLine(Rxstring);

【问题讨论】:

    标签: c# serial-port buffering


    【解决方案1】:

    问:如何从端口/缓冲区获取日期,或从连接的设备输入数据。并确保您拥有所有数据。

    A:我与 .net 串行端口类驱动程序进行了广泛的合作,我的任务是创建可靠、健壮的代码。这意味着被测连接的设备必须运行并且不会在很长一段时间内发生故障。串行端口可以并且确实会丢失数据!不要忘记这一点。

    //from top of the head;
    
    using System.Port.IO;
    using System.Port;
    
    private class mywindowsForm: Form
    {
          StringBuilder sbReceived = new StringBuilder();
          string Received = string.Empty;
          int byteCOUNT = 0;
    
          System.Windows.Timers.Timer serialTimer;
    
          //Default constructor 
          myWindowsForm()
          {
             //assume that you clicked and dragged serial port in
              serialPort1 = new SerialPort();//create new serial port instance 
              serialPort1.Baud = 9600;
              serialPort1.DataReceived+=<Tab><Enter>
              //serial port timer 
              serialTimer = new System.Windows.Timers.Timer(500);//set to 500ms time delay
              serialTimer.Elapsed+=<TAB><ENTER>
          }
    
          void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
          {
               //serial port has detected input data
               //however, we only want to get serial data so,
               if(e.EventType !=SerialData.Chars) return;
               //good design practice dictates that we have an event handler that we invoke
                this.BeginInvoke(new eventhandler(AddReceive));//beginInvoke is designed to deal with asynchronous processes like serial port data. 
          }
    
          private void AddReceive(object s, EventArg e)
          {
                byteCOUNT=serialPort1.BytesToRead;//count the number of bytes in RX buffer
                if(byteCOUNT > 0) 
                 {
                     string ST = serialPort1.ReadTo("\n");//lets get one line at a time 
                     sbReceived.Append(ST);//add whatever has been RX'd to our container. 
                     serialPort1.Interval =100;
                     serialPort1.Start();//to be sure we have all data, check to see for stragglers.
                  }
          }
    
           void serialTimer(object Sender, TimerElapsedEventArgs e)
           {
                serialTimer.Stop();
                this.BeginInvoke(new EventHandler(ReadData));
            }
    
           void ReadData(object Sender, EventArgs e)
           {
                //parse output for required data and output to terminal display (build one using rich text box)
                 Received = sbReceived.ToString();
                 //and if we have ANY MORE incoming data left over in serial buffer
                  if(Received.Length > 0)
                  {
                      //your data 
                  }
           }
    }
    

    这应该足以让您入门。这是多年来在 C# 中创建自定义终端仿真器的结果。还有其他事情可以做,特别是如果你有大量的 i/o 数据,你需要设置与设备的握手。您必须让设备以设备满意的速度处理。在必须传输较大数据的情况下,请考虑设置一个简单的数据包传递协议和命令信号量结构 - 或使用控制器/设备设计使用的协议。

    【讨论】:

      【解决方案2】:

      试试这个:

      using System.IO.Ports;
      ...
      
      private SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);
      
      Console.WriteLine(port.ReadExisting());
      

      详情请见Coad's Code。

      【讨论】:

      • 这是否也清除了缓冲区中的内容,还是我必须手动执行?
      • 这是一个流,所以你可以打电话给Flush()。但我认为你不需要它。详情在这里:msdn.microsoft.com/en-us/library/…
      猜你喜欢
      • 2014-05-11
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多