ورود

View Full Version : پورت سریال



ali_72
چهارشنبه 05 خرداد 1395, 13:31 عصر
سلام
نرم افزار با دستگاهی از طرق پورت سریال در ارتباط است
دستگاه تنها در صورت درخواست نرم افزار داده ارسال میکند
نرم افزار هم جهت مانیتور عملکرد دستگاه و ارسال ی سری فرامین طراحی شده است
نرم افزار بعد ا دریافت هر داده از دستگاه دستور ارسال داده بعدی را میدهد
در نرم افزار مشابه دات نت این فرایند مراتب کندتر بود
من با ایجاد ی دیلی این تاخیر را در ارسال ایجاد کردم
ولی من در نسخه کیوت نرم افزار ب این مشکل برخوردم:
با ارسال یکی از دستورات در جواب دستگاه در بعضی موارد داده های اشتباه هم د ادامه دریافت میکنم

مثلا من با ارسال دستور sd ب دستگاه دستور ارسال وضعیت فعلی را میدهم (ک اگه اپراتور دستوری برای کار با دستگاه ارسال نکنه این در روتین نرم افزار بعد از دریافت داده مجدد ارسال میشه)

وقتی کاربر دستور شروع حرکت دستگاه (start) را ارسال میکند در بعضی مواقع نرم افار در جواب چنین داده ای دریافت میکند (جوابsdجوابstart)
نحوه کدنویسی من ب ترتیب هست ک هیچ وقت دو داده با هم ارسال نمی شود
با توجه ب اینکه نرم افزار نسخه دات نت دقیق و صحح کار میکند و هیچ وقت این مشکل رو نداشته ایراد از دستگاه یا برنامه دستگاه نمی تونه باشه و صد در صد ست نرم افزار منه


من از الگوریتم ها و تحلیل پروژه دات نت استفاده کردم و نرم افزار برای ویندوز طراحی شده

خیلی طولانی شد
میدونم شاید گیج کننده هم باشه
ولی امیدوارم دوستی این مطلب رو بخونه ک چنین تجربه ای داشته باشه و بتونه راهنمایی کنه
ممنون

pswin.pooya
جمعه 07 خرداد 1395, 11:11 صبح
می تونه از توابعی که برای پورت سریال استفاده کردی باشه. مخصوصا بحث بافرینگ که من توی خود میکرو کنترلرهم تجربه همچین موردی رو داشتم. (البته من خودم با پورت سریال کیوت کار نکردم اما برای بقیه دیوایس ها اگر فلاش نکنی صبر می کنه تا بافر پر شه و بعد ارسال کنه. مثلا وقتی توی فایل می نویسی روی هارد دیسک نمی نویسه تا زمانی که فلاش کنی بافر رو و این برای بالا بردن سرعت عملیات IO هست. یا حتی زمانی که شما std::endl رو توی استریم های سی پلاس می فرستید اون رو فلاش می کنه و روی مانیتور می نویسه (البته شاید بگید قبل از اونم می نویسه، اما جریان اون نوشتن کاملا شانسی هست و نمی تونه همیشه صدق کنه). بنابراین اگر با خود دیوایس کار می کنید و یا اینکه از استریمها برای کار باهاش استفاده می کنید از دستور flush استفاده کنید.

البته اگر خود داکیومنت رو بخونید کلی توابع برای خواندن و یا نوشتن وجود داره که هر کدوم از اونها رفتار متفاوتی دارند. ممکنه شما به اشتباه از یک تابعی استفاده کردید که همچین رفتاری رو داره. یا اینکه تنظیمات خود پورت با تنظیمات نسخه دات نتی اون متفاوت هست.