پاسخ : درست کار نکردن یوزارت
راستی، چند تا نکته رو فراموش نکن:
1- قبل از اینکه بخوای داده های جدید رو تو متغیرهایی که تعریف کردی بریزی (چه همون R اصلی و چه این a1 تا a12 های فرعی) بهتره مقدارشون رو برابر "" قرار بدی تا خالی بشن، اینطوری بهتره. تو قسمت وقفه سریال میکرو گیرنده این کارو بکن:
[code=vb]
Rxc:
R = ""
$timeout = 1000000
Input r noecho
Buffer_udr = Udr
a1 = ""
.
.
.
a12 = ""
a1 = left (R , 3)
.
.
.
a12 = mid (R , 18 , 3)
Return
Return[/code]
2- این نکته به نظرم خیلی مهمه. اونم اینکه اگه تعداد داده های ارسالیت (منظورم یکان دهگان صدگان هرکدوم از متغیرهاییه که میخوای بفرستی) متفاوته و فرضا عدد اولی تو رشتت هم میتونه 1 باشه هم 10 هم 120) اگه بصورت عادی ارسال بشه (یعنی اگه فقط تبدیل به رشته بشه و ارسال بشه) طول رشته ای که فرستاده شده متفاوت خواهد بود، بنابراین وقتی شما تو میکروی دریافت کننده سه کاراکتر اول رو میریزی تو متغیر A1 اگه عدد ارسال شدت 120 بوده کامل دریافت میشه، اگه 10 بوده 10 دریافت میشه به همراه اولین عدد از متغیر بعدی! و اگه یک رقمی باشه اون دریافت میشه به همراه 2 کاراکتر از عدد بعدی!! به همین جهت، تو میکروی فرستنده یه استاندارد سازی بکن و با یه If تعیین کن که اگه تک تک داده ها بین 0 الی 9 بود، قبل 2 تا صفر بخوره و اگه بین 10 الی 99 بود یک صفر و در غیر این صورت خودش باشه. یعنی تو میکروی فرستنده اگه اولین عددت رو تو متغیر B1 به عنوان یه Byte تعریف کردی:
[code=vb]
Dim B1 as byte
Dim Sb1 as String * 3
if B1 < 10 then
Sb1 = chr(48) + chr(48) + str(B1)
end if
if B1 > 9 and B1 < 100 then
Sb1 = chr(48) + str(B1)
end if[/code]
حالا متغیر Sb1 الی Sb12 رو با هم جمع بزن و بریز تو یه متغیر بزرگتر و با دستور Print همشونو بفرست.
3- من همیشه برای اینکه دیتایی که تو میکروی گیرنده دریافت میکنم رو چک کنم و از سالم بودن رشته دریافتی مطمئن بشم، به اول رشته و آخرش یه حرف اضافه میکنم و تو میکروی گیرنده چکش میکنم. ببین:
[code=vb]
S = chr(83) + Sb 1 + ... + Sb12 + chr(83)[/code]
تو کد بالا یه حرف S بزرگ به اول و آخر رشته اضافه میشه (طول رشته S حداقل باید به اندازه مجموع رشته های Sb و 2 کاراکتر اضافه شده باشه).
بعد تو میکروی گیرنده 2 تا متغیر جدید از نوع String با طول 1 تعریف میکنم (مثلا اینجا متغیرهای Check1 و Check2 در ابتدای برنامه Dim شدن) و به این صورت یه If تو وقفه سریال اضافه میکنم تا اگه دیتای دریافتی به هر دلیلی دچار اشکال شد یا نویز گرفت و چیز دیگه ای دریافت شد ازشون استفاده نشه:
[code=vb]
Rxc:
R = ""
$timeout = 1000000
Input r noecho
Buffer_udr = Udr
a1 = ""
.
.
.
a12 = ""
Check1 = ""
Check2 = ""
check1 = left (R , 1)
Check2 = Right(R , 1)
if check1 = Check2 and check1 = "S" then
a1 = left (R , 3)
.
.
.
a12 = mid (R , 18 , 3)
end if
Return
Return[/code]
البته میتونی بسته به کاری که ازش میخوای و اهمیت صحت داده های ارسالیت به جای این کار از خود دستور Echo استفاده کنی و تو میکروی ارسال کننده هم یه وقفه سریال بذاری تا بعد از دریافت رشته ارسالی خودش، اگه تایید بود مثلا یه OK بفرسته. دیگه خیلی پیچیده و درهم شد، ببخشید

مرسی
راستی، چند تا نکته رو فراموش نکن:
1- قبل از اینکه بخوای داده های جدید رو تو متغیرهایی که تعریف کردی بریزی (چه همون R اصلی و چه این a1 تا a12 های فرعی) بهتره مقدارشون رو برابر "" قرار بدی تا خالی بشن، اینطوری بهتره. تو قسمت وقفه سریال میکرو گیرنده این کارو بکن:
[code=vb]
Rxc:
R = ""
$timeout = 1000000
Input r noecho
Buffer_udr = Udr
a1 = ""
.
.
.
a12 = ""
a1 = left (R , 3)
.
.
.
a12 = mid (R , 18 , 3)
Return
Return[/code]
2- این نکته به نظرم خیلی مهمه. اونم اینکه اگه تعداد داده های ارسالیت (منظورم یکان دهگان صدگان هرکدوم از متغیرهاییه که میخوای بفرستی) متفاوته و فرضا عدد اولی تو رشتت هم میتونه 1 باشه هم 10 هم 120) اگه بصورت عادی ارسال بشه (یعنی اگه فقط تبدیل به رشته بشه و ارسال بشه) طول رشته ای که فرستاده شده متفاوت خواهد بود، بنابراین وقتی شما تو میکروی دریافت کننده سه کاراکتر اول رو میریزی تو متغیر A1 اگه عدد ارسال شدت 120 بوده کامل دریافت میشه، اگه 10 بوده 10 دریافت میشه به همراه اولین عدد از متغیر بعدی! و اگه یک رقمی باشه اون دریافت میشه به همراه 2 کاراکتر از عدد بعدی!! به همین جهت، تو میکروی فرستنده یه استاندارد سازی بکن و با یه If تعیین کن که اگه تک تک داده ها بین 0 الی 9 بود، قبل 2 تا صفر بخوره و اگه بین 10 الی 99 بود یک صفر و در غیر این صورت خودش باشه. یعنی تو میکروی فرستنده اگه اولین عددت رو تو متغیر B1 به عنوان یه Byte تعریف کردی:
[code=vb]
Dim B1 as byte
Dim Sb1 as String * 3
if B1 < 10 then
Sb1 = chr(48) + chr(48) + str(B1)
end if
if B1 > 9 and B1 < 100 then
Sb1 = chr(48) + str(B1)
end if[/code]
حالا متغیر Sb1 الی Sb12 رو با هم جمع بزن و بریز تو یه متغیر بزرگتر و با دستور Print همشونو بفرست.
3- من همیشه برای اینکه دیتایی که تو میکروی گیرنده دریافت میکنم رو چک کنم و از سالم بودن رشته دریافتی مطمئن بشم، به اول رشته و آخرش یه حرف اضافه میکنم و تو میکروی گیرنده چکش میکنم. ببین:
[code=vb]
S = chr(83) + Sb 1 + ... + Sb12 + chr(83)[/code]
تو کد بالا یه حرف S بزرگ به اول و آخر رشته اضافه میشه (طول رشته S حداقل باید به اندازه مجموع رشته های Sb و 2 کاراکتر اضافه شده باشه).
بعد تو میکروی گیرنده 2 تا متغیر جدید از نوع String با طول 1 تعریف میکنم (مثلا اینجا متغیرهای Check1 و Check2 در ابتدای برنامه Dim شدن) و به این صورت یه If تو وقفه سریال اضافه میکنم تا اگه دیتای دریافتی به هر دلیلی دچار اشکال شد یا نویز گرفت و چیز دیگه ای دریافت شد ازشون استفاده نشه:
[code=vb]
Rxc:
R = ""
$timeout = 1000000
Input r noecho
Buffer_udr = Udr
a1 = ""
.
.
.
a12 = ""
Check1 = ""
Check2 = ""
check1 = left (R , 1)
Check2 = Right(R , 1)
if check1 = Check2 and check1 = "S" then
a1 = left (R , 3)
.
.
.
a12 = mid (R , 18 , 3)
end if
Return
Return[/code]
البته میتونی بسته به کاری که ازش میخوای و اهمیت صحت داده های ارسالیت به جای این کار از خود دستور Echo استفاده کنی و تو میکروی ارسال کننده هم یه وقفه سریال بذاری تا بعد از دریافت رشته ارسالی خودش، اگه تایید بود مثلا یه OK بفرسته. دیگه خیلی پیچیده و درهم شد، ببخشید


مرسی
دیدگاه