3

RS-232 ポートからデータを読み取ろうとしています。ポート/バッファからデータを取得する方法の例があり、複数行のデータである可能性があるため、すべてのデータがあることを確認してください。

次のように読むだけですか?

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

2 に答える 2

6

Q: ポート/バッファから日付を取得する方法、または接続されたデバイスからデータを入力する方法。そして、すべてのデータがあることを確認してください。

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 データがある場合は、デバイスとのハンドシェイクを設定する必要があります。デバイスが満足できるレートでデバイスを処理させる必要があります。より大きなデータを転送する必要がある場合は、単純なパケット パッシング プロトコルとコマンド セマフォ コンストラクトの設定を検討するか、コントローラー/デバイスが動作するように設計されたプロトコルを使用することを検討してください。

于 2012-02-03T03:26:52.967 に答える
4

これを試して:

using System.IO.Ports;
...

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

Console.WriteLine(port.ReadExisting());

詳細はCoad's Codeにあります。

于 2009-09-04T13:05:44.643 に答える