PDA

View Full Version : تشخیص قطع شدن اتصال پورت com



rezaei_y
پنج شنبه 01 تیر 1391, 21:02 عصر
با سلام

من با استفاده از کد زیر اطلاعات رو از پورت دریافت میکنم

comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{

if (!comport.IsOpen) return;


string data = comport.ReadExisting();



Log(LogMsgType.Incoming, data);


}
حال فرض میکنیم به هر دلیلی دستگاهی که از آن اطلاعات دریافت می کنیم خاموش شد
چگونه توسط کد نویسی این قطع شدن اتصال رو تشخیص بدم که مثلا یک تصویر چراغ قرمز رنگ دال بر عدم اتصال به کاربر نشون بدم

با تشکر

rezaei_y
پنج شنبه 01 تیر 1391, 21:45 عصر
کمک کنید دوستان

چطور تشخیص بدم پورت قطع شده؟

rezaei_y
جمعه 02 تیر 1391, 08:30 صبح
کسی نیست جواب ما رو بده؟؟!
خواهشا راهنمایی کنید؟

rezaei_y
یک شنبه 04 تیر 1391, 09:35 صبح
:گریه:میشه یا نمیشه؟

Saeed_m_Farid
یک شنبه 04 تیر 1391, 13:33 عصر
چطور تشخیص بدم پورت قطع شده؟
اولاً comport رو تو کدتون درست کنید، بجاش (SerialPort(sender باید بزارید، اگه comport یه متغیر سراسری هست هم بازم درستش اینه که از sender استفاده کنید؛ چون دارید به EventHandler پاس میدینش (اینجا (http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx)) ...
بعدش هم شما که خودتون دارید باز بودن پورت رو چک می کنید تو دریافت داده؛ فکر نمی‌کنم یه نظارت کننده مجزا برای اینکار لازم داشته باشین، به هرصورت بنظرم بهتره از BackgroundWorker استفاده کنید و درست نیست که مثلاً هر 100ms بره چک کنه پورت شما رو و ببینه وصل هست یا نه! بعد یا فلگ ست کنه یا "تصویر چراغ قرمز رنگ دال بر عدم اتصال به کاربر نشون بده"؛ چون با این کار بیخودی پورت رو باز نگه میدارین و ریسورس الکی از سیستم میگیرید، هر وقت لازم شد دیتا بفرستین، یکبار IsOpen‌ رو چک کنید کافیه؛ بازم نظر خودتونِ ...

مثال ساده کار با BackgroundWorker (http://www.dotnetperls.com/backgroundworker)
کار با عناصر فرم در BackgroundWorker (http://www.infosysblogs.com/microsoft/2006/10/cross_thread_ui_control_access.html)

من یه pseudocode میذارم (که دیگه تبدیلش به backgroundworker با خودتون) برای نمونه :
if (serial.IsOpen)
{
try
{
// Send the binary data out the port
byte[] hexstring = Encoding.ASCII.GetBytes(data);
foreach (byte hexval in hexstring)
{
// need to convert byte to byte[] to write
byte[] _hexval = new byte[] { hexval };
serial.Write(_hexval, 0, 1);
Thread.Sleep(10);
}
}
catch (Exception ex)
{
Log(LogMsgType.Error, "Failed to SEND" + data + "\n" + ex + "\n");
}
}

این هم یه مثال دیگه (http://stackoverflow.com/questions/973631/system-io-ports-serialport-and-multithreading) برای کارکردن چندنخی با پورت سریال ...

rezaei_y
دوشنبه 05 تیر 1391, 16:55 عصر
با سلام
ممنون از اینکه جواب دادین
در مورد اینکه هر موقع نیاز داشتم پورت رو چک کنم که ببینم ایا باز هست یا نه؟؟؟ من از لحظه ای که فرم را باز میکنم تا لحظه بسته شدن برنامه اطلاعات رو از پورت میخونم چون دارم اطلاعات رو از یک باسکول میخونم و هر لحظه هم ممکنه یک ماشین جدید برای باسکول بیاد.
تا جایی هم که من میدونم port_DataReceived زمانی اجرا میشه که اطلاعاتی از پورت فرستاده بشه حالا اگه یک دفعه دستگاه باسکول به هر دلیلی خاموش بشه port_DataReceived دیگه قاعدتا اجرا نمیشه که بررسی بشه آیا داده ای وجود داره یا نه
با این تفاسیر آیا راه دیگه ای بجز Timer میمونه که هر چند ثانیه پورت رو چک کنه؟؟

Saeed_m_Farid
دوشنبه 05 تیر 1391, 19:32 عصر
ببینین، این بستگی به دیوایسی داره که به پورت سریال شما متصل هست؛ من نمیدونم باسکول چه‌جوریه ولی معمولاً سخت افزارهایی که با برنامه های سیستمی کار میکنن یه روال سلام-علیک دارن (Handshaking) و به شما میگن که من الان وصل شدم و شما به لیست تون اضافشون می‌کنید و ... ولی علاوه بر اون، باید شما یه متد Request داشته باشد که به ازاء اون درخواست و ID سخت افزار، جواب مناسبی از طرف سخت افزار به برنامه شما داده بشه ... چرا؟
چون این شما هستید که میخواین بدونین ارتباط سخت افزاری زنده هست یا نه، مثلاً شما میگی ping اون تا یه treshhold ای اگه pong (و مشخصات خودش[1]) رو برگردوند می‌فهمید که ارتباط alive هست و اگه تو این مدت جواب نیومد، یعنی یه خاکی تو سرش ریخته! خلاصه اش اینکه تایمر بذارین که چکار کنه، این مهمه! فکر کنم نقطه مبهم تو پروژه شما هم همین باشه.
_________________________
[1]: اگه تعداد باسکول های شما بیشتر از یه‌دونه هست، حتماً یه UID دارن که باهاش شناسایی میشن؛ ما تو یه پروژه مشابه تعداد زیادی دیوایس داشتیم که به سرور وصل میشدن و معمولاً سرور محدودیت پورت سریال داره (اگه اصلاً داشته باشه!)، برای حل این مشکل یه سخت افزار واسط این وسط گذاشتیم که تمام دیوایس ها به اون وصل میشدن و اون بعنوان یه پروتکل کانورتر عمل میکرد، یعنی به تمام دستگاه ها IP میداد و مثل دیوایس شبکه باهاشون رفتار میشد، حالا نمیدونم شما چطور تعداد زیادی دیوایس رو به پورت سریال وصل می‌کنید ...

Esmail Solhkhah
سه شنبه 06 تیر 1391, 10:00 صبح
با تشکر از جناب Saeed_m_Farid (http://barnamenevis.org/member.php?41415-Saeed_m_Farid) که جوابهاشون همیشه دقیق و فنی هست

بنده پیشنهاد میدم از کامپوننت CommStudio استفاده کنید این بنده خدا یه پراپرتی داره که دقیقا دیس شدن پورت رو بهتون میده

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

موفق باشید.

rezaei_y
سه شنبه 06 تیر 1391, 17:11 عصر
ممنون از همه دوستان

حالا این کامپوننت رو از کجا باید پیدا کرد؟

Esmail Solhkhah
چهارشنبه 07 تیر 1391, 10:14 صبح
ممنون از همه دوستان

حالا این کامپوننت رو از کجا باید پیدا کرد؟

از تو جیب بنده (شوخی کردم ناراحت نشید ، دست خودم نیس بعضی وقتا حس شوخ طبعیم گل میکنه :خجالت:)

به عنوان یه پیشنهاد دوستانه : درمورد کامپوننتها اول به سایت خود شرکت سازنده (http://www.commstudio.com/commstudio) مراجعه کنید ، امکانات نرم افزار رو ببینید ، شایدم دست و دل باز بودن رایگان گذاشتن برا دانلود (یکم بعیده واللا)

اگه نشد نام همین کامپوننت رو گوگل کنید ترجیحا با کلمه قشنگ دانلود

اگه بازم پیدا نشد که میشه (در مورد این کامپوننت PM بدید بنده تو آرشیوم دارم)

موفق باشید.