簡體   English   中英

C#-從串行端口緩沖區讀入

[英]C# - readin from serial port buffer

我正在嘗試從RS-232端口讀取數據。 有沒有人舉過一個例子,說明如何從端口/緩沖區獲取數據,並確保我擁有所有數據,因為它可以是多行數據。

我是否簡單閱讀如下?

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

嘗試這個:

using System.IO.Ports;
...

private SerialPort port = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);

Console.WriteLine(port.ReadExisting());

有關詳細信息,請參見Coad's Code

問:如何從端口/緩沖區獲取日期,或如何從連接的設備輸入數據。 並且確保您擁有所有數據。

答:我曾與.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數據,則需要與設備建立握手。 您必須讓設備以設備滿意的速度處理。 在必須傳輸較大數據的情況下,請考慮建立一個簡單的數據包通過協議和命令信號量結構-或使用所定義的控制器/設備可以使用的協議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM