سلام به همگی
من تجربه کاریم در مورد لبویو اینقدری نیست، اگر این آموزش مشکلی داشت، دوستان حرفه ای بگند تا تصحیح کنیم
به 2 علت این تاپیک رو ایجاد کردم!
1- یک بار برای همیشه این سریال رو با تمامی قواعد آموزش بدیم ( با کمک دوستان) تا هرکسی مشکلی داشت مستقیم بیاد اینجا
2- کمتر شدن PM هایی که هر روز در مورد این سریال لبویو به بقیه ارسال میشه :biggrin:
مقاله و مطلب برای اینکه سردربیارید پروتکل سریال چجور کار می کنه توی اینترنت زیاده! من به علت کمبود اطلاعات خودم :redface: و خلاصه شدن موضوع، درست میرم سر اصل مطلب. هرکس علاقه داشت سردربیاره سریال کلاً چجور کار می کنه، یه گوگل بزنه کلی مطلب پیدا می کنه!
اول از همه و قبل اینکه کلا ادامه مطلب رو بخونید، باید visa رو نصب داشته باشید. اگر ندارید، از این لینک دانلود کنید http://www.ni.com/visa
همه می دونید که سریال یه پورت ارسال و یک پورت دریافت داره (rx و tx )
توی تمامی برنامه ها، کلاً برنامه سریال 2 قسمت میشه، یکی واسه دریافتش و یکی واسه ارسالش
لبویو هم مثل بقیه یک سری توابع واسه دریافت داره و یک سری توابع برای ارسال، که دونه دونه توضیح میدیم
توی قسمت بلوک دیاگرام، سریال کلــــــــی تابع داره که انشالله همشونو یاد میگیرید و به ما هم یاد میدید، ولی فعلا ما با چند جزء اصلی اون کار داریم
به آدرس instrument i/o و بعد serial برید

طبق عکس ، چند عدد تابع میبینید، که توابع اصلی هستند که ما قراره باهاشون کار کنید
من یه توضیحی درباره توابع اصلی بدم
configure port : واسه پیکربندی پورت سریال
write : ارسال اطلاعات ( بصورت رشته)
read : دریافت اطلاعات ( بصورت رشته)
close : بستن برنامه
byte at port : مشخص کردن تعداد کاراکتر دریافتی
حالا میریم سر اصول برنامه، شما توی لبویو، ابتدا از طریق configure port پورت سریال رو پیکر بندی می کنید، طبق دیتای دریافتی، از توابع خواندن و نوشتن استفاده می کنیم و وقتی کارمون تموم شد پورت سریال رو می بندیم
عکس زیر یک برنامه سریال ساده بدون هیچ تابع دریافت و ارسالیه

تابع configure کلی سیم از اینور اونورش زده بیرون که می تونید با یک نگاه سرسری به help و خوندن توضیحات از اونا سردربیارید، توی عکس فقط تنظیمات اصلی پورت سریال نوشته شدند.
توی این برنامه ساده ما پورت سریال رو باز می کنیم و میبندیم
الان یک تابع نوشتن بهش اضافه می کنیم

الان هرچی توی پالت write بنویسید ارسال میشه
حالا یک تابع خوندن میزاریم

برای تابع خوندن باید شما مشخص کنید که بافرتون چند کاراکتره! تعداد کارکتر دریافتی رو مشخص می کنید و هرتعداد که بنوسید همونقدر دریافت می کنید و توی پالت read مینویسه
اگر تعداد کاراکتر رو مشخص بکنید، همون اندازه میگیره و نشون میده ، ولی اگر کاراکتر ورودیتون متغیر باشه باید یک گره اطلاعاتی بزارید تا قبل از تابع خوندن تعداد کاراکتر مشخص بشه و همیشه اندازه همون نوشته دریافتیتون عدد بافر مشخص بشه و هر رشته ای رو کامل دریافت بکنید

این کل اصول دریافت و ارسال اطلاعات بود و این برنامه آخر که یک رشته رو ارسال و یک رشته رو دریافت می کنه

چند نکته خیلی مهم هست که اگر درست انجام ندید دچار مشکل میشید!
اول از همه اینکه، طبق ترتیب دریافت و ارسال اطلاعاتتون باید ترتیب این توابع رو بچینید، مثلاً این برنامه آخری که من نوشتم، اول یک رشته ارسال میشه و جواب اون توسط دستگاه گیرنده ارسال و باز توسط لبویو گرفته و چاپ میشه
بیشترین مشکل توی قسمت timeout وجود داره! این timeout یا همون سرریز یه چیز تو مایه های watch dog میکرو عمل می کنه و بعد از ارسال یا دریافت هر دستور یک تایمری شروع به کار می کنه و اگر تا پایان اون دستوری اجرا نشه یک خطا برای توقف برنامه میده. خیلی ها چون برای اولین بار با هیپرترمینال کار می کنند، زمان ارسال دستورشون پایین میشه و همش این خطا بهشون نشون داده میشه. شما برای شوع کار می تونید زمان timeout رو زیاد کنید تا دچار مشکل نشید.
تا اینجای کار ما یک برنامه ساده ساده سریال نوشتیم، ولی برای اینکه بخواین با میکرو یا دستگاه های دیگه کار بکنید، باید یک سری کارهای دیگه انجام بدید! اینا مشکلاتی هستند که من شدید درگیرشون بودم و بعد فهمیدم که مشکل کارم چیه و اینجا میگم تا دیگه شما دچار مشکل نشید
اول از همه اینکه بهتره توسط یک secuence به برنامتون ترتیب بدید تا این بده بستون اطلاعاتیتون یه سروسامانی بگیره و دریافت و ارسال اطلاعاتتون با ترتیب درست اجرا بشه

ولی باز هم برنامه درست کار نمی کنه بعضی وقت ها!! گیر اصلی اینه که سرعت کامپیوتر معمولاً خیلی بیشتر از بقیه سیستم ها هستش و وقتی شما یک رشته رو ارسال می کنید، تا اون دستگاه رشته رو بگیره و به خودش بیاد که چی به چیه، توی لبویو میره توی قسمت بعدی و اینجوری همه چی قاطی میشه و بده بستون اطلاعات درست از آب در نمیاد. تنها راه چاره اینه که یک تأخیر بعد از ارسال رشته بزارید.

همین تأخیر چند میلی ثانیه ای کلاً برنامه رو متحول می کنه !!! این تأخیر رو می تونید تست بکنید با سیستمتون و کمترین اندازه رو خودتون با سعی و خطا دربیارید. قسمت دریافت چون از طرف کامپیوتر هستش معمولاً احتیاجی به تأخیر نداره
الان شما می تونید طی چند مرحله، طبق برنامه ای که نوشتید، به تعداد مورد نیاز از این توابع خوندن و نوشتن استفاده بکنید و دقت داشته باشید که اینا باید هماهنگ باشه و اگر جایی باید تابع نوشتن بزارید تابع خوندن بزارید برنامه قاطی می کنه و میره روی خطا
یه نکته ظریفی هم هست که من بعد از مدت ها!!!!!!! تونستم بفهمم! یعنی پدرم در اومد تا بفهمم! بعضی وقت ها، رشته ای که دریافت می کنید، داخلش enter خورده و از چند سطر تشکیل شده! مثلاً جواب های ماژول sim900
اگر دستور ATI رو به SIM900 بفرستید، جوابی که ارسال می کنه اینجوریه
ATI
SIM900 REV11
OK
یعنی اول همون دستوری که ارسال کردید رو میفرسته، سطر دوم SIM900 REV11 و سطر سوم خالی و سطر چهارم هم OK
ولی چیزی که شما دریافت می کنید فقط ATI !!!!!!!
مشکل چیه ؟
اگر دقت کرده باشید شما فقط سطر اول رو دریافت کردید! یعنی بعد از خوردن ENTER دیگه اطلاعات از دست رفته !! سطر اول هر تعداد کاراکتری که می خواد باشه، ولی شما فقط تا جایی که ENTER خورده رو دارید.
بعدها فهمیدم که هر تابع READ واسه خوندن یک سطره !!! یعنی اگر دستورتون 4 سطره، شما باید 4 عدد تابع READ رو پشت سر هم بزارید و بعد کل اونارو با توابع رشته به هم متصل کنید و توی خروجی نشون بدید. اینجوری تمامی سطرها رو می تونید دریافت کنید.

من الان برفرض اطلاعات ورودیم توی 2 سطر نوشته شده، در نتیجه 2 بار پورت رو می خونم و در آخر اونارو به هم متصل می کنم و در خروجی نشون میدم
این اصولی که گفتم تمامی اطلاعات اولیه و تجربیاتی هستند که خودم در این زمینه باهاشون مواجه بودم، قسمت VISA توابع خیلی زیادی داره و می تونید با کمک help از کارشون سردربیارید
مثلاً بعضی مواقع لازم میشه کل اطلاعات موجود رو پاک کنیم! با یک تابع clear میشه این کار رو انجام داد !

توی این برنامه الان هرچی توی بافر باشه بعد از این تابع پاک میشه!
امیدوارم که این آموزش بتونه کمکتون بکنه و کارتون راه بیفته. اگر موردی داشت بگین، چون من هم مثل شما مبتدی هستم و بیشتر تفریحی با لبویو کار می کنم! اگر هم روشهای دیگه ای کشف کردین یا اینکه مشکلاتی مواجه شدین و حلش کردین اینجا بگین تا بتونه به بقیه هم کمک بکنه
همیشه گفتم، باز هم میگم، لبویو هیچ محدودیتی نداره و اگر چیزی درست کار نمی کنه همیشه از طرف ما هستش. اگر برنامه درست نوشته بشه بدون هیچ مشکلی کار می کنه
موفق باشید
من تجربه کاریم در مورد لبویو اینقدری نیست، اگر این آموزش مشکلی داشت، دوستان حرفه ای بگند تا تصحیح کنیم
به 2 علت این تاپیک رو ایجاد کردم!
1- یک بار برای همیشه این سریال رو با تمامی قواعد آموزش بدیم ( با کمک دوستان) تا هرکسی مشکلی داشت مستقیم بیاد اینجا
2- کمتر شدن PM هایی که هر روز در مورد این سریال لبویو به بقیه ارسال میشه :biggrin:
مقاله و مطلب برای اینکه سردربیارید پروتکل سریال چجور کار می کنه توی اینترنت زیاده! من به علت کمبود اطلاعات خودم :redface: و خلاصه شدن موضوع، درست میرم سر اصل مطلب. هرکس علاقه داشت سردربیاره سریال کلاً چجور کار می کنه، یه گوگل بزنه کلی مطلب پیدا می کنه!
اول از همه و قبل اینکه کلا ادامه مطلب رو بخونید، باید visa رو نصب داشته باشید. اگر ندارید، از این لینک دانلود کنید http://www.ni.com/visa
همه می دونید که سریال یه پورت ارسال و یک پورت دریافت داره (rx و tx )
توی تمامی برنامه ها، کلاً برنامه سریال 2 قسمت میشه، یکی واسه دریافتش و یکی واسه ارسالش
لبویو هم مثل بقیه یک سری توابع واسه دریافت داره و یک سری توابع برای ارسال، که دونه دونه توضیح میدیم
توی قسمت بلوک دیاگرام، سریال کلــــــــی تابع داره که انشالله همشونو یاد میگیرید و به ما هم یاد میدید، ولی فعلا ما با چند جزء اصلی اون کار داریم
به آدرس instrument i/o و بعد serial برید

طبق عکس ، چند عدد تابع میبینید، که توابع اصلی هستند که ما قراره باهاشون کار کنید
من یه توضیحی درباره توابع اصلی بدم
configure port : واسه پیکربندی پورت سریال
write : ارسال اطلاعات ( بصورت رشته)
read : دریافت اطلاعات ( بصورت رشته)
close : بستن برنامه
byte at port : مشخص کردن تعداد کاراکتر دریافتی
حالا میریم سر اصول برنامه، شما توی لبویو، ابتدا از طریق configure port پورت سریال رو پیکر بندی می کنید، طبق دیتای دریافتی، از توابع خواندن و نوشتن استفاده می کنیم و وقتی کارمون تموم شد پورت سریال رو می بندیم
عکس زیر یک برنامه سریال ساده بدون هیچ تابع دریافت و ارسالیه

تابع configure کلی سیم از اینور اونورش زده بیرون که می تونید با یک نگاه سرسری به help و خوندن توضیحات از اونا سردربیارید، توی عکس فقط تنظیمات اصلی پورت سریال نوشته شدند.
توی این برنامه ساده ما پورت سریال رو باز می کنیم و میبندیم
الان یک تابع نوشتن بهش اضافه می کنیم

الان هرچی توی پالت write بنویسید ارسال میشه
حالا یک تابع خوندن میزاریم

برای تابع خوندن باید شما مشخص کنید که بافرتون چند کاراکتره! تعداد کارکتر دریافتی رو مشخص می کنید و هرتعداد که بنوسید همونقدر دریافت می کنید و توی پالت read مینویسه
اگر تعداد کاراکتر رو مشخص بکنید، همون اندازه میگیره و نشون میده ، ولی اگر کاراکتر ورودیتون متغیر باشه باید یک گره اطلاعاتی بزارید تا قبل از تابع خوندن تعداد کاراکتر مشخص بشه و همیشه اندازه همون نوشته دریافتیتون عدد بافر مشخص بشه و هر رشته ای رو کامل دریافت بکنید

این کل اصول دریافت و ارسال اطلاعات بود و این برنامه آخر که یک رشته رو ارسال و یک رشته رو دریافت می کنه

چند نکته خیلی مهم هست که اگر درست انجام ندید دچار مشکل میشید!
اول از همه اینکه، طبق ترتیب دریافت و ارسال اطلاعاتتون باید ترتیب این توابع رو بچینید، مثلاً این برنامه آخری که من نوشتم، اول یک رشته ارسال میشه و جواب اون توسط دستگاه گیرنده ارسال و باز توسط لبویو گرفته و چاپ میشه
بیشترین مشکل توی قسمت timeout وجود داره! این timeout یا همون سرریز یه چیز تو مایه های watch dog میکرو عمل می کنه و بعد از ارسال یا دریافت هر دستور یک تایمری شروع به کار می کنه و اگر تا پایان اون دستوری اجرا نشه یک خطا برای توقف برنامه میده. خیلی ها چون برای اولین بار با هیپرترمینال کار می کنند، زمان ارسال دستورشون پایین میشه و همش این خطا بهشون نشون داده میشه. شما برای شوع کار می تونید زمان timeout رو زیاد کنید تا دچار مشکل نشید.
تا اینجای کار ما یک برنامه ساده ساده سریال نوشتیم، ولی برای اینکه بخواین با میکرو یا دستگاه های دیگه کار بکنید، باید یک سری کارهای دیگه انجام بدید! اینا مشکلاتی هستند که من شدید درگیرشون بودم و بعد فهمیدم که مشکل کارم چیه و اینجا میگم تا دیگه شما دچار مشکل نشید
اول از همه اینکه بهتره توسط یک secuence به برنامتون ترتیب بدید تا این بده بستون اطلاعاتیتون یه سروسامانی بگیره و دریافت و ارسال اطلاعاتتون با ترتیب درست اجرا بشه

ولی باز هم برنامه درست کار نمی کنه بعضی وقت ها!! گیر اصلی اینه که سرعت کامپیوتر معمولاً خیلی بیشتر از بقیه سیستم ها هستش و وقتی شما یک رشته رو ارسال می کنید، تا اون دستگاه رشته رو بگیره و به خودش بیاد که چی به چیه، توی لبویو میره توی قسمت بعدی و اینجوری همه چی قاطی میشه و بده بستون اطلاعات درست از آب در نمیاد. تنها راه چاره اینه که یک تأخیر بعد از ارسال رشته بزارید.

همین تأخیر چند میلی ثانیه ای کلاً برنامه رو متحول می کنه !!! این تأخیر رو می تونید تست بکنید با سیستمتون و کمترین اندازه رو خودتون با سعی و خطا دربیارید. قسمت دریافت چون از طرف کامپیوتر هستش معمولاً احتیاجی به تأخیر نداره
الان شما می تونید طی چند مرحله، طبق برنامه ای که نوشتید، به تعداد مورد نیاز از این توابع خوندن و نوشتن استفاده بکنید و دقت داشته باشید که اینا باید هماهنگ باشه و اگر جایی باید تابع نوشتن بزارید تابع خوندن بزارید برنامه قاطی می کنه و میره روی خطا
یه نکته ظریفی هم هست که من بعد از مدت ها!!!!!!! تونستم بفهمم! یعنی پدرم در اومد تا بفهمم! بعضی وقت ها، رشته ای که دریافت می کنید، داخلش enter خورده و از چند سطر تشکیل شده! مثلاً جواب های ماژول sim900
اگر دستور ATI رو به SIM900 بفرستید، جوابی که ارسال می کنه اینجوریه
ATI
SIM900 REV11
OK
یعنی اول همون دستوری که ارسال کردید رو میفرسته، سطر دوم SIM900 REV11 و سطر سوم خالی و سطر چهارم هم OK
ولی چیزی که شما دریافت می کنید فقط ATI !!!!!!!
مشکل چیه ؟
اگر دقت کرده باشید شما فقط سطر اول رو دریافت کردید! یعنی بعد از خوردن ENTER دیگه اطلاعات از دست رفته !! سطر اول هر تعداد کاراکتری که می خواد باشه، ولی شما فقط تا جایی که ENTER خورده رو دارید.
بعدها فهمیدم که هر تابع READ واسه خوندن یک سطره !!! یعنی اگر دستورتون 4 سطره، شما باید 4 عدد تابع READ رو پشت سر هم بزارید و بعد کل اونارو با توابع رشته به هم متصل کنید و توی خروجی نشون بدید. اینجوری تمامی سطرها رو می تونید دریافت کنید.

من الان برفرض اطلاعات ورودیم توی 2 سطر نوشته شده، در نتیجه 2 بار پورت رو می خونم و در آخر اونارو به هم متصل می کنم و در خروجی نشون میدم
این اصولی که گفتم تمامی اطلاعات اولیه و تجربیاتی هستند که خودم در این زمینه باهاشون مواجه بودم، قسمت VISA توابع خیلی زیادی داره و می تونید با کمک help از کارشون سردربیارید
مثلاً بعضی مواقع لازم میشه کل اطلاعات موجود رو پاک کنیم! با یک تابع clear میشه این کار رو انجام داد !

توی این برنامه الان هرچی توی بافر باشه بعد از این تابع پاک میشه!
امیدوارم که این آموزش بتونه کمکتون بکنه و کارتون راه بیفته. اگر موردی داشت بگین، چون من هم مثل شما مبتدی هستم و بیشتر تفریحی با لبویو کار می کنم! اگر هم روشهای دیگه ای کشف کردین یا اینکه مشکلاتی مواجه شدین و حلش کردین اینجا بگین تا بتونه به بقیه هم کمک بکنه
همیشه گفتم، باز هم میگم، لبویو هیچ محدودیتی نداره و اگر چیزی درست کار نمی کنه همیشه از طرف ما هستش. اگر برنامه درست نوشته بشه بدون هیچ مشکلی کار می کنه
موفق باشید
دیدگاه