PDA

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



pyramid_ali
پنج شنبه 05 فروردین 1395, 17:21 عصر
سلام به همه دوستان، کسی میدونه با سی شارپ چی جوری میشه پورت سریال رو خوند؟؟؟
من یک دستگاه زیگبی دارم میخوام با پورت سریال که به یو اس بی وصل میشه ارتباط برقرار کنم! اگه کسی بلده راهنمایی کنه لطفا!

Hadi-Hashemi
پنج شنبه 05 فروردین 1395, 17:24 عصر
شما بگو در چه مرحله ای از برنامه هستی تا کمکتون کنم.

ضمنا میخوایین دیتا ارسال کنین یا بگیری؟

مهدی کرامتی
پنج شنبه 05 فروردین 1395, 17:48 عصر
اگر از Windows Forms استفاده می کنی یک کامپوننت SerialPort رو فرمت بنداز و Property هاش رو ست کن. متد Open و Close هم داره که ارتباط رو برقرار می کنه و می بنده.

pyramid_ali
جمعه 06 فروردین 1395, 08:55 صبح
شما بگو در چه مرحله ای از برنامه هستی تا کمکتون کنم.

ضمنا میخوایین دیتا ارسال کنین یا بگیری؟

در هیچ مرحله ای :)) یعنی کار سخت افزاریش تموم شده و فقط مونده یه برنامه که بتونه دیتا را از طریق پورت سریال بگیره و تو دیتابیس ذخیره کنه، و البته در مواقع لزوم بتونه دیتا هم ارسال کنه! من برنامه نویسی وب و سی کار کردم ولی به خاطر GUI مجبور شدم بیام رو سی شارپ (البته گزینه های دیگه هم بود ولی من وقت یاد گرفتنشو ندارم)! در همین حدم از سی شارپ بلدم که بتونم یه فرم ایجاد کنم (چنتا از المنتای پرکاربردشو بلدم + event) و مفهوم کلاس و وراثت و اینترفیس رو بلدم! حالا اگه لازمه چیزه دیگه ای یاد بگیرم ممنون میشم توضیح بدید (کار با دیتابیس توی سی شارپ رو بلد نیستم ولی mysql رو حرفه ای بلدم - دستورات sql تقریبا شبیه همن) در ضمن ته کار کردن با دیتابیس توی سی شارپ ساخت یه mdf و دیتاست بوده و کشیدن این دیتاست روی فرم :)) از لحاظ کدنویسی هیچیشو نمیدونم :))
ممنون میشم کمک کنید!

pyramid_ali
جمعه 06 فروردین 1395, 09:00 صبح
اگر از Windows Forms استفاده می کنی یک کامپوننت SerialPort رو فرمت بنداز و Property هاش رو ست کن. متد Open و Close هم داره که ارتباط رو برقرار می کنه و می بنده.
ممنون از کمکتون، سرنخ رو دادید :))

Hadi-Hashemi
جمعه 06 فروردین 1395, 10:07 صبح
در هیچ مرحله ای :)) یعنی کار سخت افزاریش تموم شده و فقط مونده یه برنامه که بتونه دیتا را از طریق پورت سریال بگیره و تو دیتابیس ذخیره کنه، و البته در مواقع لزوم بتونه دیتا هم ارسال کنه! من برنامه نویسی وب و سی کار کردم ولی به خاطر GUI مجبور شدم بیام رو سی شارپ (البته گزینه های دیگه هم بود ولی من وقت یاد گرفتنشو ندارم)! در همین حدم از سی شارپ بلدم که بتونم یه فرم ایجاد کنم (چنتا از المنتای پرکاربردشو بلدم + event) و مفهوم کلاس و وراثت و اینترفیس رو بلدم! حالا اگه لازمه چیزه دیگه ای یاد بگیرم ممنون میشم توضیح بدید (کار با دیتابیس توی سی شارپ رو بلد نیستم ولی mysql رو حرفه ای بلدم - دستورات sql تقریبا شبیه همن) در ضمن ته کار کردن با دیتابیس توی سی شارپ ساخت یه mdf و دیتاست بوده و کشیدن این دیتاست روی فرم :)) از لحاظ کدنویسی هیچیشو نمیدونم :))
ممنون میشم کمک کنید!

اوکی. در مورد دیتابیس و کارای دیگه دوستان با تجربه تر بهتر میتونن کمکتون کنن.

و اما در مورد ارتباط سریال:

اولین چیزی که لازمه همونطور که آقای کرامتی هم اشاره کردن کامپوننت SerialPort هستش. شما به دو روش میتونین اینو به پروژه تون اضافه کنین.

1- از طریق Toolbox میتونین همانند چیزای دیگه مثل Button ,Label و ... به پروژه اضافه کنین.

2- از طریق کد:



SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);



حالا نوبت میرسه به تنظیماتش. برای اینکه دو دستگاه حرف همدیگه رو خوب بفهمن و با هم ارتباط برقرار کنن باید هر دو از یه درگاه (Port) و یه سری قوانین استفاده کنن.

درگاه که همون شماره پورت هست. یعنی زمانی که شما دستگاه تون رو به کامپیوتر وصل میکنین کامپیوتر به اون چه شماره ای اختصاص میده. مثلا COM3 ,COM2 ,COM1 و ...

و اما قوانین که اینا هستن:



سرعت انتقال داده ها ( baud rate )
طول بیت داده ( bit length )
بیت های آغاز و پایان ( Start - Stop bit )
بیت توازن ( parity bit )



این 4 ماده باید برای هر دو دستگاه یکی باشه. مثلا اگه اون دستگاه زیگبی با سرعت 9600bps کار میکنه برنامه شما هم باید روی 9600bps تنظیم شده باشه.

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


حالا نویت میرسه به ارسال و دریافت دیتا:

ارسال دیتا:

ارسال دیتا از دریافت یکم راحتره. چون توی ارسال رمانش دست ماست که کِی ارسال کنیم و هر جا که لازم باشه کافیه پورت رو باز کنیم دیتا رو ارسال کنیم و بعد پورت رو ببندیم. مثلا این کد کاراکتر A رو میفرسته.



sp.Open();
sp.Write("A");
sp.Close();



دریافت دیتا:

دریافت دینا یکم درسر داره چون شما نمیدونی کی قرار چیزی دریافت کنی و هر لحظه ممکنه دیتا بیاد. برای همین از رویداد DataRecevied باید استفاده کنین و توش با نوشتن کدهای زیر به برنامه بفهمونی که هر موقع چیزی دریافت کردی خبرم کن:



strData = sp.ReadExisting();
this.Invoke(new EventHandler(Hadi));
sp.Close();


بعدش کافیه یه متد به اسم Hadi بنویسی و کارایی که یعد از دریافت دیتا قرار انجام بشه رو توش مشخص کنی. (البته اسم Hadi رو برای مثل نوشتم) - دیتا هم که دریافت شده توی strData ذخیره میشه.

فقط یه چیزی این متدی که مینویسی باید قبل از رویداد DataRecevied نوشته بشه.



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

بحث ارتباط سریال فقط همین چیزی نیست که من توضیح دادم ولی همینا برای شروغ کافیه.


البته اگه قابل بدونی میتونی برای توضیحات بیشتر به نوشته من توی این موضوع (http://forum.wle.ir/Thread-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B9%D9%85%D9%84%DB%8C-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%DA%A9%D9%86%D8%AA%D 8%B1%D9%84%D8%B1-%D8%A8%D8%A7-%D9%BE%D9%88%D8%B1%D8%AA-%D8%B3%D8%B1%DB%8C%D8%A7%D9%84) یه نیگا بندازی.


موفق باشی.

pyramid_ali
جمعه 06 فروردین 1395, 11:16 صبح
اوکی. در مورد دیتابیس و کارای دیگه دوستان با تجربه تر بهتر میتونن کمکتون کنن.

و اما در مورد ارتباط سریال:

اولین چیزی که لازمه همونطور که آقای کرامتی هم اشاره کردن کامپوننت SerialPort هستش. شما به دو روش میتونین اینو به پروژه تون اضافه کنین.

1- از طریق Toolbox میتونین همانند چیزای دیگه مثل Button ,Label و ... به پروژه اضافه کنین.

2- از طریق کد:



SerialPort sp = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);



حالا نوبت میرسه به تنظیماتش. برای اینکه دو دستگاه حرف همدیگه رو خوب بفهمن و با هم ارتباط برقرار کنن باید هر دو از یه درگاه (Port) و یه سری قوانین استفاده کنن.

درگاه که همون شماره پورت هست. یعنی زمانی که شما دستگاه تون رو به کامپیوتر وصل میکنین کامپیوتر به اون چه شماره ای اختصاص میده. مثلا COM3 ,COM2 ,COM1 و ...

و اما قوانین که اینا هستن:



سرعت انتقال داده ها ( baud rate )
طول بیت داده ( bit length )
بیت های آغاز و پایان ( Start - Stop bit )
بیت توازن ( parity bit )



این 4 ماده باید برای هر دو دستگاه یکی باشه. مثلا اگه اون دستگاه زیگبی با سرعت 9600bps کار میکنه برنامه شما هم باید روی 9600bps تنظیم شده باشه.

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


حالا نویت میرسه به ارسال و دریافت دیتا:

ارسال دیتا:

ارسال دیتا از دریافت یکم راحتره. چون توی ارسال رمانش دست ماست که کِی ارسال کنیم و هر جا که لازم باشه کافیه پورت رو باز کنیم دیتا رو ارسال کنیم و بعد پورت رو ببندیم. مثلا این کد کاراکتر A رو میفرسته.



sp.Open();
sp.Write("A");
sp.Close();



دریافت دیتا:

دریافت دینا یکم درسر داره چون شما نمیدونی کی قرار چیزی دریافت کنی و هر لحظه ممکنه دیتا بیاد. برای همین از رویداد DataRecevied باید استفاده کنین و توش با نوشتن کدهای زیر به برنامه بفهمونی که هر موقع چیزی دریافت کردی خبرم کن:



strData = sp.ReadExisting();
this.Invoke(new EventHandler(Hadi));
sp.Close();


بعدش کافیه یه متد به اسم Hadi بنویسی و کارایی که یعد از دریافت دیتا قرار انجام بشه رو توش مشخص کنی. (البته اسم Hadi رو برای مثل نوشتم) - دیتا هم که دریافت شده توی strData ذخیره میشه.

فقط یه چیزی این متدی که مینویسی باید قبل از رویداد DataRecevied نوشته بشه.



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

بحث ارتباط سریال فقط همین چیزی نیست که من توضیح دادم ولی همینا برای شروغ کافیه.


البته اگه قابل بدونی میتونی برای توضیحات بیشتر به نوشته من توی این موضوع (http://forum.wle.ir/Thread-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B9%D9%85%D9%84%DB%8C-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%DA%A9%D9%86%D8%AA%D 8%B1%D9%84%D8%B1-%D8%A8%D8%A7-%D9%BE%D9%88%D8%B1%D8%AA-%D8%B3%D8%B1%DB%8C%D8%A7%D9%84) یه نیگا بندازی.


موفق باشی.

ممنون از راهنماییت! من فعلا به دستگاه زیگبی دسترسی ندارم چون توی آزمایشگاه دانشگاه است، به خاطر همین با برنامه virtual serial port driver دو تا پورت رو بهم وصل کردم و با یکی دیتا دادم و با اون یکی دیتا رو گرفتم! چون دیتا رو خودم میخواستم بدم با تایمر هر 0.1 ثانیه یک بایت رندوم رو ارسال کردم و با اون یکی پورت دریافتش کردم! همه چیز درست کار میکنه ولی مشکلی که هست اینه که توی تابع datarecieved برای پورت گیرنده نمیتونم مثلا تکست label رو تغییر بدم و اررور میده و میگه این کار نیاز به مالتی تردینگ داره! و مجبورم که تغییر لیبل رو توی همون تیک تایمرم انجام بدم! یه جا آموزش مالتی تردینگ بود ولی کار نکرد واسه من، شما اطلاعاتی در این مورد ندارین؟؟

یه سوال دیگه اینه که من وقتی با usb دستگاهم رو به کامپیوتر وصل میکنم از کجا بفهمم که کدوم پورت داره استفاده میشه؟؟ COM1?COM2 یا .... که بتونم ازش دیتا بگیرم؟؟؟ یعنی اولش باید کل پورتامو چک کنم یا به صورت پیش فرض با وصل دستگاه به کامپیوتر پورت COM1 اشغال میشه؟؟
دستگه که با usb به سیستم وصل میشه خودش میره رو پورتا یا باید با یه برنامه ثالثی پ.رت usb رو به پورت سریال مپ کنیم؟؟
بازم خیلی ممنون از وقتی که گذاشتین!

Hadi-Hashemi
جمعه 06 فروردین 1395, 11:45 صبح
ممنون از راهنماییت! من فعلا به دستگاه زیگبی دسترسی ندارم چون توی آزمایشگاه دانشگاه است، به خاطر همین با برنامه virtual serial port driver دو تا پورت رو بهم وصل کردم و با یکی دیتا دادم و با اون یکی دیتا رو گرفتم! چون دیتا رو خودم میخواستم بدم با تایمر هر 0.1 ثانیه یک بایت رندوم رو ارسال کردم و با اون یکی پورت دریافتش کردم! همه چیز درست کار میکنه ولی مشکلی که هست اینه که توی تابع datarecieved برای پورت گیرنده نمیتونم مثلا تکست label رو تغییر بدم و اررور میده و میگه این کار نیاز به مالتی تردینگ داره! و مجبورم که تغییر لیبل رو توی همون تیک تایمرم انجام بدم! یه جا آموزش مالتی تردینگ بود ولی کار نکرد واسه من، شما اطلاعاتی در این مورد ندارین؟؟

یه سوال دیگه اینه که من وقتی با usb دستگاهم رو به کامپیوتر وصل میکنم از کجا بفهمم که کدوم پورت داره استفاده میشه؟؟ COM1?COM2 یا .... که بتونم ازش دیتا بگیرم؟؟؟ یعنی اولش باید کل پورتامو چک کنم یا به صورت پیش فرض با وصل دستگاه به کامپیوتر پورت COM1 اشغال میشه؟؟
دستگه که با usb به سیستم وصل میشه خودش میره رو پورتا یا باید با یه برنامه ثالثی پ.رت usb رو به پورت سریال مپ کنیم؟؟
بازم خیلی ممنون از وقتی که گذاشتین!

والا اون چیزی که گفتین رو نمیدونم. دقیقا هم متوجه نشدم چیکار کردین.

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

برای اینکار میتونی 2 کار انجام بدی:

1- بعد از وصل کردن دستگاه و شناسایی از طرف ویندوز بری توی Device Manager و از اونجا ببینی. توی برنامه هم یه ComboBox بذاری و شماره پورت رو از اون انتخاب کنی.

2- یه روش هم هست که اتوماتیک میشناسه ولی یه چند تا مشکل داره.

برای اینکار باید با این کد نام پورتهایی که به سیستم وصله رو بدست بیاری.



string[] ports = SerialPort.GetPortNames();


بعد port[0] میشه نام پورتت

و اما مشکلاتش:

1- اگه بیش از دو دستگاه وصل باشه اون وقت آرایه port بیش از یک مقدار خواهد داشت که بازم باید بگردی ببینی کدوم پورت مخصوص دستگاه شماس.
2- بعضی وقت ها دیدم که این کد برای بعضی دستگاه های وصل شده عمل نمیکنه. یعنی اون دستگاه ها رو نمیبینه.


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

اونم اینه که پورت رو باز کنی یه کاراکتر مثلا A رو ارسال کنی اون کاراکتر رو دستگاهت بگیره و ببینه اگه A بود B رو بع عنوان جواب ارسال کنه و بعد شما اگه توی برنامتون کاراکتر B رو دریافت کردی معلوم میشه که دستگاهت به اون پورت وصل شده. (اینو باید هر چند وقت یه بار برای همه پورتها انجام بدی).

فقط یادت نره توی try انجام بدی چون اگه به پورتی چیزی وصل نباشه و بخای اونو open کنی برنامت خطا میده و میاد بیرون.

رضا261
سه شنبه 29 تیر 1395, 14:00 عصر
لطفا یه نمونه از پیاده سازی Hadi بزارید.
من چندتا نمونه کد را تست کردم نشد:گریه::گریه:

Hadi-Hashemi
چهارشنبه 14 مهر 1395, 21:56 عصر
لطفا یه نمونه از پیاده سازی Hadi بزارید.
من چندتا نمونه کد را تست کردم نشد:گریه::گریه:

ببخشید من الان دیدم

دوست عزیز یه سر به اینجا (http://support.wle.ir/%D9%85%D9%88%D8%B6%D9%88%D8%B9-%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%B9%D9%85%D9%84%DB%8C-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7-%D9%85%DB%8C%DA%A9%D8%B1%D9%88%DA%A9%D9%86%D8%AA%D 8%B1%D9%84%D8%B1-%D8%A8%D8%A7-%D9%BE%D9%88%D8%B1%D8%AA-%D8%B3%D8%B1%DB%8C%D8%A7%D9%84.html) بزنین