المنفذ التسلسلي ريدلاين مقابل ReadExisting أو كيفية قراءة البيانات من المنفذ التسلسلي بشكل صحيح

StackOverflow https://stackoverflow.com/questions/636758

سؤال

وأنا قراءة البيانات من المنفذ التسلسلي. وتأتي البيانات خارج النطاق. أنا الآن باستخدام Readline() وانخفض البيانات يحصل حتى بعد أزلت DiscardInBuffer(). ما هي الطريقة الصحيحة لقراءة البيانات من المنفذ التسلسلي؟ وهناك عدد قليل جدا من الأمثلة على الانترنت التي أشعر أنها مثل بعض الكأس المقدسة أن أحدا لم أحسب.

وأي مساعدة من فضلك؟

ويبدو أن المنفذ التسلسلي هو طفل متقلبة.

وC #، ويندوز سي 5.0، HP العميل رقيقة، إطار الاتفاق 2.0

 private void WeighSample()
    {
        this._processingDone = false;
        this._workerThread = new Thread(CaptureWeight);
        this._workerThread.IsBackground = true;
        this._workerThread.Start();
    } //end of WeighSample()


    private void CaptureWeight()
    {
         globalCounter++;
         string value = "";


          while (!this._processingDone)
          {
              try
              {

                 value = this._sp.ReadLine();

                  if (value != "")
                  {
                      if (value == "ES")
                      {
                          _sp.DiscardInBuffer();
                          value = "";
                      }
                      else
                      {
                          this.Invoke(this.OnDataAcquiredEvent, new object[] { value });
                      }
                  }
              }
              catch (TimeoutException)
              {
                  //catch it but do nothing
              }
              catch
              {
                  //reset the port here?
                  MessageBox.Show("some other than timeout exception thrown while reading serial port");
              }
          }


    } //end of CaptureWeight()

وشيء واحد ملاحظة حول طلبي هو أن أبدأ موضوع (weighSample) عندما يقفز المؤشر إلى مربع النص. والسبب في هذا هو أن الوزن يمكن أيضا أن تكتب يدويا (جزء من مسا ل). لذلك أنا لا أعرف مقدما ما إذا كان المستخدم هو الذهاب للضغط PRINT على التوازن أو اكتب الوزن. في كلتا الحالتين بعد الحصول على البيانات، والخروج من ترابط. أيضا، لاحظ أنني لا تستخدم الحدث المنفذ التسلسلي DataReceived، منذ لقد قيل لي انها ليست موثوق بها.

وأي تعليقات / الأفكار موضع ترحيب. وهذا هو أول تجربة لي مع المنافذ التسلسلية.

هل كانت مفيدة؟

المحلول

ولدي <م> لا كان الحظ مع ريدلاين العمل. لا مجرد القراءة في المخزن مؤقت محلي كلما تتوفر بيانات ومن ثم استخدام موضوع مستقل لفحص البيانات وإيجاد خط يكسر نفسك.

نصائح أخرى

ويعتمد على ما نهاية الخط (موسوعة الحياة) حرف (ق) هو لإدخال البيانات الخاصة بك. يتم توجيه خط البيانات الخاصة بك ثم ريدلاين هي وظيفة صالحة للاستخدام، ولكنك قد ترغب في النظر في الممتلكات سطر جديد وتأكد من أن يتم تعيين بشكل مناسب لإدخال البيانات الخاصة بك.

وعلى سبيل المثال، إذا مخرجات النطاق الخاص بك تغذية لموسوعة الحياة ثم تعيين port.NewLine = "\n";

http://msdn.microsoft. كوم / EN-US / مكتبة / system.io.ports.serialport.newline.aspx

وأود أن أعلق على الياس سانتوس لكنني لا تملك ما يكفي من سمعته. هناك بعض gotchas في استخدام طريقة ReadExisting:

الشبكي : //msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting (ت = vs.110) .aspx اتصال

<اقتباس فقرة>   

لاحظ أن هذه الطريقة يمكن أن تترك وراء بايت الرائدة في   المخزن المؤقت الداخلي، الأمر الذي يجعل قيمة BytesToRead أكبر من الصفر.

وأنا واجهت بعض القضايا مع ReadExisting قبل وذلك لأن من وحدات البايت غير المرغوب فيها. استخدام Readline الثابتة تلك القضايا.

if (serialPort1->IsOpen){
    if (serialPort1->BytesToRead>0){
        this->textBox1->Text += serialPort1->ReadExisting();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top