سؤال

لدي تطبيق C# حيث يبدو أن بيانات التسلسلية (COM1) لا تنقل في بعض الأحيان. فيما يلي مقتطف مبسط من الكود الخاص بي (تمت إزالة المكالمات إلى Textbox التي تمت إزالة كتاب ": تمت إزالة كتاب"):

    InitializeComponent()
    {
       // 
       // serialPort1
       // 
       this.serialPort1.BaudRate = 115200;
       this.serialPort1.DiscardNull = true;
       this.serialPort1.ReadTimeout = 500;
       this.serialPort1.ReceivedBytesThreshold = 2;
       this.serialPort1.WriteTimeout = 500;
       this.serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.serialPort1_DataReceived);
    }

        if (radioButtonUart9600.Checked)
        {
           serialPort1.BaudRate = 9600;

           try
           {
              serialPort1.Open();
           }
           catch (SystemException ex)
           {
              /* ... */
           }
        }

        try
        {
           serialPort1.Write("D");
           serialPort1.Write(msg, 0, 512);
           serialPort1.Write("d");
           serialPort1.Write(pCsum, 0, 2);
        }
        catch (SystemException ex)
        {
           /* ... */
        }

الأمر الغريب هو أن هذا الرمز نفسه يعمل بشكل جيد عندما يتم تكوين المنفذ مقابل 115.2 كيلو بايت في الثانية. ومع ذلك ، عند تشغيل بيانات 9600 بت في الثانية التي يجب أن تنتقل بواسطة هذا الرمز يبدو أنه لا يتم نقله. لقد تحقق من هذا من خلال مراقبة علامة الاستلام على الجهاز البعيد. لا يتم طرح استثناءات من داخل بيان المحاولة. هل هناك شيء آخر (تدفق ، وما إلى ذلك) يجب أن أفعله للتأكد من نقل البيانات؟ أي أفكار أو اقتراحات قد تكون موضع تقدير. أنا أستخدم Microsoft Visual C# 2008 Express Edition. شكرًا.

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

المحلول

قم بإزالة هذه الكتل Try/Catch. يجب أن تمنحك فرصة لرؤية TimeOutException التي تحصل عليها لأنك ضبطت قيمة WriteTimeout منخفضة للغاية. إرسال 516 بايت في 9600 Baud يستغرق 538 ميلي ثانية.

إعداداتك الأخرى هي وصفات للمشاكل أيضًا. تخلص من المستلمة وتجاهل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top