سؤال

لقد حصلت على نظام تشغيل XP جزءا لا يتجزأ، مع COM2 كونها ميناء الأجهزة RS485.

في قانون بلدي، وأنا إنشاء DCB مع RTS_CONTROL_TOGGLE . يهمني ان نفترض ان تفعل ما تقول ... إيقاف RTS في وضع نواة مرة يحدث المقاطعة فارغة الكتابة. وينبغي أن يكون لحظة تقريبا.

وبدلا من ذلك، ونحن نرى على نطاق أن الكمبيوتر هو الذي يقود الحافلة في أي مكان 1-8 ميلي ثانية أطول من نهاية الرسالة. الجهاز الذي نتحدث إلى يستجيب في حوالي 1-5 ميلي ثانية. لذلك ... الفساد الاتصالات وافر. لا، ليس هناك وسيلة لتغيير زمن الاستجابة الهدف.

لقد مدمن مخدرات الآن تصل إلى ميناء RS232 وتوصيل مجالا لخطوط TX وRTS، ونحن نرى نفس الشيء. خط RTS يبقى عالية 1-8 ميلي ثانية بعد يتم إرسال الرسالة.

لقد حاولت أيضا إيقاف FIFO، أو وضع أعماق FIFO إلى 1، مع عدم وجود تأثير.

وأي أفكار؟ أنا على وشك أن محاولة يدويا السيطرة على خط RTS من وضع المستخدم مع أولوية REALTIME خلال دورة "SendFile، واضحة RTS". ليس لدي الكثير من الآمال بأن هذا العمل أيضا. لا ينبغي أن يتم ذلك في وضع المستخدم.

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

المحلول

RTS_CONTROL_TOGGLE لا يعمل (لديه متغير تأخير 1-15 ميلي ثانية واحدة قبل إيقاف تشغيله بعد الإرسال) على موقعنا على منصة جزءا لا يتجزأ XP. فمن الممكن أن أتمكن من الحصول على أسفل إذا أنا غيرت الكم الوقت ل1 مللي ثانية باستخدام timeBeginPeriod (1) وغيرها، ولكن أشك في أنه سيكون موثوق أو ما يكفي ليهم. (الجهاز يستجيب @ 1 ميلي ثانية واحدة في بعض الأحيان)

والحل النهائي هو قبيح لكنه يعمل على هذا الجهاز. أنا لن استخدامه على أي شيء حيث لم يتم إصلاح الأجهزة في الحجر.

وأساسا:

1) تعيين FIFOs على صفحة إدارة الجهاز المنفذ التسلسلي لإيقاف أو 1 شخصية عميقة

2) إرسال رسالة الخاص + <قوية> 2 بايت إضافية هل تستخدم هذا الرمز:

int WriteFile485(HANDLE hPort, void* pvBuffer, DWORD iLength, DWORD* pdwWritten, LPOVERLAPPED lpOverlapped)
{
  int iOldClass = GetPriorityClass(GetCurrentProcess());
  int iOldPriority = GetThreadPriority(GetCurrentThread());
  SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
  SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);

  EscapeCommFunction(hPort, SETRTS);

  BOOL bRet = WriteFile(hPort, pvBuffer, iLength, pdwWritten, lpOverlapped);

  EscapeCommFunction(hPort, CLRRTS);

  SetPriorityClass(GetCurrentProcess(), iOldClass);
  SetThreadPriority(GetCurrentThread(), iOldPriority);

  return bRet;
}

ووWriteFile () إرجاع عند البايت أو العامين الماضيين قد كتب إلى المنفذ التسلسلي. لقد NOT خرج ميناء بعد، وبالتالي فإن الحاجة إلى إرسال 2 بايت إضافية. واحد أو كلا منهم سيحصل الحضيض عند القيام CLRRTS.

وكما قلت ... انها قبيحة.

نصائح أخرى

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

وأي أفكار؟

وأنت قد تجد أن هناك شفرة المصدر لبرنامج تشغيل المنفذ التسلسلي في DDK، التي من شأنها أن تتيح لك رؤية كيف من المفترض أن يتم تنفيذ هذا الخيار: أي سواء كان ذلك على المستوى المقاطعة، على مستوى DPC، أو ما هو أسوأ

وتشمل

وهناك إمكانيات أخرى إعادة كتابة السائق. استخدام برنامج تشغيل RS485-3rd الطرف إذا كان يمكنك العثور على واحد. أو باستخدام أجهزة RS485-3rd الطرف مع سائقها الخاص (على سبيل المثال على الأقل في 3rd الأطراف السابقة التي استخدمت لصنع "وحات المنفذ التسلسلي الذكية" مع 32 منفذا، ومخازن عميقة، والمعالجات الخاصة به، وأتوقع أن RS485 مشكلة وهذا ما كان حلها عن طريق شخص).

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

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

وأنا على وشك أن محاولة يدويا السيطرة على خط RTS من وضع المستخدم مع أولوية REALTIME خلال دورة "SendFile، واضحة RTS".

لا تدع هذا الموضوع تدور خارج نطاق السيطرة: IME موضوع من هذا القبيل يمكن لو كان عربات التي تجرها الدواب استباق غيرها من كل موضوع وضع المستخدم إلى الأبد

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