مشکل در ارتباط سریال

وضعیت
موضوع بسته شده است.

m_mx2009

Member
سلام
بنده قصد دارم با یک میکروکنترلر تبدل دیا داشته باشم....ولی مشکل اینجاست ک بعضی وقتا کاراکترهای عجیب غریب دریافت میکنه....مشکل از میکرو نیست چون با ترمینال یه برنامه دیگه تستش کردم مشکلی نداشت...
کد های برنامه م اینه :

[CSS]

private voidserialPort1_DataReceived(objectsender,
System.IO.Ports.SerialDataReceivedEventArgse)
{
intbytes;
bytes = serialPort1.BytesToRead;
byte[] buffer = new byte[bytes];
serialPort1.Read(buffer, 0, bytes);
for(intt = 0; t < bytes; t++)
{
textBox1.Text += buffer[t].ToString() + " ";
}
}

[/CSS]

به نظرتون مشکل از چی میتونه باشه؟
ممکنه تنظیمات اشتباه باشه؟
کلا من فقط باودریت و پریتی رو تنظیم میکنم...بقیه ش رو نمیدونم باید چیکار کنم...
اگه تجربه ای در این زمینه دارید ممنون میشم راهنمایی کنید...
 
آخرین ویرایش:

the_king

مدیرکل انجمن
سلام
بنده قصد دارم با یک میکروکنترلر تبدل دیا داشته باشم....ولی مشکل اینجاست ک بعضی وقتا کاراکترهای عجیب غریب دریافت میکنه....مشکل از میکرو نیست چون با ترمینال یه برنامه دیگه تستش کردم مشکلی نداشت...
کد های برنامه م اینه :

[CSS]

private voidserialPort1_DataReceived(objectsender,
System.IO.Ports.SerialDataReceivedEventArgse)
{
intbytes;
bytes = serialPort1.BytesToRead;
byte[] buffer = new byte[bytes];
serialPort1.Read(buffer, 0, bytes);
for(intt = 0; t < bytes; t++)
{
textBox1.Text += buffer[t].ToString() + " ";
}
}

[/CSS]

به نظرتون مشکل از چی میتونه باشه؟
ممکنه تنظیمات اشتباه باشه؟
کلا من فقط باودریت و پریتی رو تنظیم میکنم...بقیه ش رو نمیدونم باید چیکار کنم...
اگه تجربه ای در این زمینه دارید ممنون میشم راهنمایی کنید...

به احتمال خیلی زیاد نویز ئه، وجودش کاملا طبیعیه. بیت Parity برای شناسایی یک بیت اشتباه کفایت می کنه، اما نه می تونه ایراد رو برطرف کنه و نه برای شناسایی
بیت های اشتباه بیشتر از یک بیت موثره. شما خودتان باید در ارسال اطلاعات امکان شناسایی ایراد و مکانیسم برطرف کردنش رو پیاده سازی کنید.
شخصا یک زمانی از پورت Parallel پرینتر برای انتقال اطلاعات بین دو کامپیوتر استفاده می کردم.
اگر موقع ارسال داده از Checksum استفاده نکرده بودم، نه امکان شناسایی ایراد وجود داشت و نه می شد برای برطرف کردنش کاری کرد.
شما در کدتون حتما باید امکان چک کردن ورودی و ارسال مجدد رو پیشبینی کنید.

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

اگر بخواهید سرعت ارسال کند نشه، باید ارتباط دو طرفه باشه، فرستنده یکسری داده رو همراه یک شیوه برای شناسایی داده درست، مثل Checksum شون بفرسته و
بعد منتظر جواب گیرنده باشه. تا وقتی گیرنده جوابی نده، فرستنده داده دیگری نخواهد فرستاد. گیرنده داده هایی که دریافت کرده با Checksum همراه شون مقایسه می کنه،
اگر مطابقت داشت به فرستنده سیگنال میده که داده ها به درستی دریافت شده اند و داده های بعدی رو بفرست.
ولی اگر Checksum با داده ها مطابقت نداشت، یا داده ها رو با نویز دریافت کرده و یا Checksum رو یا هر دو. در هر صورت وقتی Checksum با داده ها مطابقت نداشت به فرستنده
سیگنال میده که آخرین داده هایی که ارسال کرده بودی رو مجددا ارسال کن. ممکنه یکسری داده در همون سری اول درست ارسال بشه و یکسری در دفعه پنجم.

Checksum یک فرمول ئه که روی داده ها اجرا میشه تا یک عدد خاص بدست بیاد. فرمول های متفاوتی برایش هست.
یکبار این محاسبه موقع ارسال در فرستنده انجام میشه و یکبار موقع دریافت در گیرنده. اگر مقداری که فرستنده به عنوان Checksum ارسال کرده با مقداری که
گیرنده خودش محاسبه می کنه یکی نباشه، حتما یک چیزی این وسط اشتباه ارسال شده.
فرمول خیلی ساده اش اینه که یک بایت باشه که همه داده ها رو داخلش با هم جمع کنید. طبیعتا این بایت می تونه سر ریزی داشته باشه که مهم نیست.
یا فرضا دو بایت باشه که بایت اول حاصل جمع همه داده ها است و بایت دوم XOR شده همه داده ها.
یا فرضا دو بایت باشه که بایت اول حاصل جمع همه داده ها باشه و بایت دوم حاصل جمع بایت اول پس از جمع زدن هر بایت از داده.
 
وضعیت
موضوع بسته شده است.

جدیدترین ارسال ها

بالا