كيفية فرض 250 مللي ثانية للتأخير بين الكتابة على منفذ تسلسلي؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

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

أفكار؟

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

المحلول

يجب أن يكون لديك نوع من الفئة لغرض الكتابة إلى المنفذ التسلسلي، وربما نقطة كتابة واحدة (وظيفة Writetoport أو أي شيء).

في ذلك، يمكنك حفظ الوقت الحالي في كل مرة تكتب فيها، ثم استخدم المنطق في التأخير لذلك. لذا:

DateTime lastWritten;
TimeSpan timeBetweenWrites = new Timespan(0,0,0,0,250);
void WriteToDevice(string data)
{
    TimeSpan sinceLastWrite=DateTime.Now-lastWritten;
    if(sinceLastWrite<timeBetweenWrites)
        Thread.Sleep(timeBetweenWrites-sinceLastWrite);
    SerialPort.Write(data);
    lastWritten=DateTime.Now;
}

نصائح أخرى

تعليق الخيط يجب أن يعمل من أجلك:

System.Threading.Thread.Sleep(250);

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

جلب الطابع الزمني قبل كل انتقال. النوم لمدة 250- (الآن - ثم) مللي ثانية (فرضت في الصفر، من الواضح). يبدو أن هذا ما تسأل عنه.

إذا كنت، بدلا من ذلك، فأنت تشعر بالقلق بشأن أشياء مثل قضايا جدولة OS التي تقدم أوقاتا غير 250 مللاضا في المتوسط، أو أكثر من قبالة صغيرة من 250ms بالضبط، ثم لديك مشكلة أكثر صعوبة في يدنا وستحتاج إلى القراءة على تقنيات الوقت الحقيقي الصعب (وربما شراء بعض الأجهزة الإضافية).

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