PDA

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



saman6384
سه شنبه 09 شهریور 1389, 20:10 عصر
سلام
من می خوام با یک میکرو ارتباط برقرار کنم! خیلی راحت می تونم به اون دیتا ارسال کنم!! اما وقتی تابع زیر رو برای خواندن از بافر اجرا می کنم! برنامه هنگ میکنه!!


void serialdata_Receive()
{
byte[] rec = new byte[16];

CheckForIllegalCrossThreadCalls = false;
slpMicro.Read(rec, 0, 16);
while (RunFlag)
{

if (slpMicro.BytesToRead == 16)
{
if ((rec[0] == (byte)'$') && (rec[15] == (byte)'#'))
{
if (rec[1] == (byte)SlotNumber)
{
if (rec[2] == (byte)',')
{

counter++;
byte k = (byte)1;
int j;

//*****************Digital*************

for (int i = 0; i < 8; i++)
{
rec[3] >>= i;
j = (rec[3] ^ k);
if ((j % 2) == 0) chkDI[i].Checked = true;
else chkDI[i].Checked = false;
}

for (int i = 0; i < 8; i++)
{
rec[4] >>= i;
j = (rec[4] ^ k);
if ((j % 2) == 0) chkDI[i + 8].Checked = true;
else chkDI[i + 8].Checked = false;
}

for (int i = 0; i < 8; i++)
{
rec[5] >>= i;
j = (rec[5] ^ k);
if ((j % 2) == 0) chkDI[i + 16].Checked = true;
else chkDI[i + 16].Checked = false;
}

for (int i = 0; i < 8; i++)
{
rec[6] >>= i;
j = (rec[6] ^ k);
if ((j % 2) == 0) chkDI[i + 24].Checked = true;
else chkDI[i + 24].Checked = false;
}

//***************Analoge***************

AI1 = (int)rec[7] * 256 + (int)rec[8];
AI2 = (int)rec[9] * 256 + (int)rec[10];
AI3 = (int)rec[11] * 256 + (int)rec[12];
AI4 = (int)rec[13] * 256 + (int)rec[14];
}
else MessageBox.Show("Wrong Data (,) ", "ERROR");
}
else MessageBox.Show("Wrong Slot Data (Slot Number)", "ERROR");
}
else MessageBox.Show("Wrong Data ( $ or # )", "ERROR");
}
break;
}

nmbA28.Value = Convert.ToDecimal(AI1);
nmbA29.Value = Convert.ToDecimal(AI2);
nmbA30.Value = Convert.ToDecimal(AI3);
nmbA31.Value = Convert.ToDecimal(AI4);
slpMicro.DiscardInBuffer();


--------------------
اینم هنگ می کنه!!


private void btnrebuff_Click(object sender, EventArgs e)
{
byte[] recbuff = new byte[20];
CheckForIllegalCrossThreadCalls = false;

try
{

slpMicro.Read(recbuff, 0, 16);
for (int i = 0; i < 16; i++)
lblRecbuff.Text += recbuff[i].ToString();

}
catch (Exception ex)
{ }


slpMicro.DiscardInBuffer();


}

cheshm6k
سه شنبه 09 شهریور 1389, 22:28 عصر
سلام.
من تجربه ای در زمینه کار با میکرو کنترلر ندارم اما پورت سریال یه رویداد بنام DataRecieved (اگه اشتباه نکنم) داره . نیازی به این همه کد نیست . اگه وقتی به متد read میرسه و اطلاعاتی واسش نیاد همونجا میمونه . پس قاعدتا هنگ میکنه.

saman6384
سه شنبه 09 شهریور 1389, 22:41 عصر
خوب اون رویداد رو هم گذاشتم. اما انگار خوابه!!
اطلاعات بهم می رسه!! چون bytetoread مقدار بایتها رو نشون میده که اطلاعات گرفته!! اما وقتی تابع رو اجرا می کنم هنگ میکنه!!

این کدا فقط یه دستور slpMicro.Read(recbuff, 0, 16); واسه خوندن از بافر هستش بقیش برای استفاده از داده های گرفته شده!!

ممنون از جوابتون:لبخندساده:

cheshm6k
سه شنبه 09 شهریور 1389, 23:47 عصر
؟؟؟؟؟ اما من از سریال پورت واسه کار با مودم استفاده کردم و رویدادشم جواب داد.
میشه کدی که تو رویداد DataRecievedت مینویسی رو بذاری ؟


این کدا فقط یه دستور slpMicro.Read(recbuff, 0, 16); واسه خوندن از بافر هستش بقیش برای استفاده از داده های گرفته شده!!

میدونم این دستور چیه دوست من . اما فقط اگه 16 بایت بخونه میره خط بعد. مطمئنی از میکروکنترلر 16 بایت میاد ؟ نه کمتر.

saman6384
چهارشنبه 10 شهریور 1389, 00:21 صبح
serialdata_Receive()

که کداش بالا نوششتم میزارم
آره همیشه چک میکنم بافر رو
از میکرو 25 بایت میاد.

cheshm6k
چهارشنبه 10 شهریور 1389, 00:39 صبح
توی رویدادت اینو امتحان کن :


void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
string s = sp.ReadExisting();
//کارهایی که میخوای انجام بدی

}

اگه وقتی پورتتو باز میکنی و error نمیده قاعدتا باید جواب بده.

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


sp = new SerialPort("COM3");
sp.Open();
sp.WriteLine("دستور");
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);

saman6384
چهارشنبه 10 شهریور 1389, 00:49 صبح
متاسفانه الان میکرو پیشم نیس
فردا میرم شرکت می تونم تست کنم و گرنه الان می کردم!!
خیلی خیلی ممنون از راهنماییت!!
حالا فردا اگه باز به مشکل خوردم ( با عرض معذرت) دوباره مزاحم میشم:خجالت:

cheshm6k
چهارشنبه 10 شهریور 1389, 01:11 صبح
متاسفانه الان میکرو پیشم نیس
فردا میرم شرکت می تونم تست کنم و گرنه الان می کردم!!
خیلی خیلی ممنون از راهنماییت!!
حالا فردا اگه باز به مشکل خوردم ( با عرض معذرت) دوباره مزاحم میشم:خجالت:

خواهش میکنم ، خوشحال میشم اگه بتونم کمکی بکنم.

peymanjon
چهارشنبه 10 شهریور 1389, 02:34 صبح
دوستان الان که این بحث اینجا باز شده ،برام جالبه که بدونم از طریق .net تا چه حد میشه با میکرو کنترولر ها ارتباط ایجاد کرد؟
فقط باید یک داده رو پورت فرستاد و از طریق میکرو اون داده را از پورت خوند؟فقط همین یا میشه حتی اون میکرو را پروگرم کرد ؟

saman6384
چهارشنبه 10 شهریور 1389, 22:32 عصر
دوستان الان که این بحث اینجا باز شده ،برام جالبه که بدونم از طریق .net تا چه حد میشه با میکرو کنترولر ها ارتباط ایجاد کرد؟
فقط باید یک داده رو پورت فرستاد و از طریق میکرو اون داده را از پورت خوند؟فقط همین یا میشه حتی اون میکرو را پروگرم کرد ؟

من که تازه شروع به کار با پورتها کردم و زیاد وارد نیستم!!

اما تا اونجا که می دونم میکرو ها رو با برنامه bascam و یک کیت مخصوص که فکر کنم قیمتشون رو هم میشه 200 تا 250 پروگرام می کنن!!

saman6384
چهارشنبه 10 شهریور 1389, 22:40 عصر
حالا یه سوال در مورده کاره خودم :
من کر هامو بدم رو یک دستگاه دیگه و تست کردم!! دیگه هنگ نمی کرد! دیتا دریافت می کرد و می خوند!
اما بازم مشکلاتی وجود داشت...
1) امیکرو واسه من بایت می فرستاد! اما من کد اسکی دریافت می کردم ( البته این مورد با دستکاری برنامه خودم و میکرو حل شد)
2) اما مشکل اصلی این بود که میکرو یک سری بایت برای من ارسال می کرد مثل 44 0 1 2 4 5 44 1 36 ، اما من یا ناقص دریافت می کردم یا دریافت نمی کردم یا یک چیزهای عجیب غریب دریافت می کردم!!

نکته : من سایز تری شولد و بافر خواندن رو 16 گذاشتم اینجوری بود!! 100 هم گذاشتم همینجوری بود!!

با برنامه بس کام که چک می کنیم همون دیتا هایی که میکرو ارسال می کنه رو نمایش میده!!

دیگه نمیدونم چیکا کنم!

saman6384
پنج شنبه 11 شهریور 1389, 19:36 عصر
سلام دوباره

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

اما مشکل اینه که وقتی می خوام تو برنامه خودم اطلاعات رو عوض کنم! روی دستور سند سریال پورت وایمیسه ! ارورر میده !! میگه ترد نمیتونه اجرا کنه!! ( من تردی تعریف نکردم)

کسی میدونه چیکا کنم؟؟

cheshm6k
پنج شنبه 11 شهریور 1389, 20:09 عصر
سلام . قطعه کد و متن error رو بزار ، که اگه بتونیم نظر بهتری بدیم

saman6384
پنج شنبه 11 شهریور 1389, 20:51 عصر
قطعه کدش چون اولیس!! ممکنه زیاد قابل فهم نباشه!!
اما چشم می زارم.

ولی اررور رو نمی تونم! چون بردها در دسترسم نیس تا شنبه!!

اررور توی خط 306 میاد


اینجا :

slpMicro.Write(send, 0, 14);

cheshm6k
پنج شنبه 11 شهریور 1389, 23:52 عصر
من برنامه رو دیدم . چندتا نکته به نظرم اومد. نمیدونم تا چه حد میتونه کمک کنه اما.....

1- در ابتدا portName رو روی Com1 تنظیم کردی . مطمئنی شماره پورتت درسته ؟
2- وقتی slotNumber, BoundRate رو با کامبوها تغییر میدی روی slpPort اعمال نمیکنی.
3- دلیل وجود timer2 رو درک نکردم . interval=5 و تابع send رو فراخوانی میکنه که اون تابع ابتدا timer رو غیر فعال میکنه !!!!!!!!

saman6384
جمعه 12 شهریور 1389, 09:55 صبح
من برنامه رو دیدم . چندتا نکته به نظرم اومد. نمیدونم تا چه حد میتونه کمک کنه اما.....

1- در ابتدا portName رو روی Com1 تنظیم کردی . مطمئنی شماره پورتت درسته ؟
2- وقتی slotNumber, BoundRate رو با کامبوها تغییر میدی روی slpPort اعمال نمیکنی.
3- دلیل وجود timer2 رو درک نکردم . interval=5 و تابع send رو فراخوانی میکنه که اون تابع ابتدا timer رو غیر فعال میکنه !!!!!!!!

1. خوب اون که فکر نکنم تاثیری داشته باشه! چون با کمبو عوضش میکنم همون اول اجرای برنامه.

2.ببخشید تو رو خدا! گفتم که فعلا کد هام خیلی شلوغ پلوغه:خجالت:
این دو تا رو تو چند خط آخر اعمال کردم ، اولش فقط کدای لایه زیری برنامه رو نوشتم:بامزه:

3. اینم بخاطره نمونه اولیه بودنشه!
چون اول تصمیم گرفتم که ارسال اطلاعات رو توی یه تایمر(timer2) بزارم که هی برد هامو رفرش کنه! اما با اون کار میکرو هی هنگ میکرد. بعد تصمیم گرفتم که وقتی از میکرو اطلاعات گرفتم تایمر رو فعال و هنگامی که اطلاعات فرستادم تایمر رو غیره فعال کنم، که این هم جواب نداد و کار نکرد اصلا!! چون تایمر اصلا دوباره فعال نمی شد.

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

حالا مشکلم اینه که وقتی می خوام با کلیک روی digital output ها یا تغییر شماره Analoge output ها خودم دستی یک سری اطلاعات رو بفرستم!! بعضی مواقع اون ارورری که گفتم رو میده!! همون خطه 306

خودم فکر می کنم برایه اینه که در یک لحظه همزمان تابع ارسال فراخوانی میشه!! اما نمیدونم چیکا باید بکنم!!
به نظر شما این مشکل با ترد حل میشه؟

یعنی هر وقت خواستم یک چیزی دستی بفرستم از یک ترد استفاده کنم؟

cheshm6k
جمعه 12 شهریور 1389, 14:00 عصر
1. خوب اون که فکر نکنم تاثیری داشته باشه! چون با کمبو عوضش میکنم همون اول اجرای برنامه.

2.ببخشید تو رو خدا! گفتم که فعلا کد هام خیلی شلوغ پلوغه:خجالت:
این دو تا رو تو چند خط آخر اعمال کردم ، اولش فقط کدای لایه زیری برنامه رو نوشتم:بامزه:

3. اینم بخاطره نمونه اولیه بودنشه!
چون اول تصمیم گرفتم که ارسال اطلاعات رو توی یه تایمر(timer2) بزارم که هی برد هامو رفرش کنه! اما با اون کار میکرو هی هنگ میکرد. بعد تصمیم گرفتم که وقتی از میکرو اطلاعات گرفتم تایمر رو فعال و هنگامی که اطلاعات فرستادم تایمر رو غیره فعال کنم، که این هم جواب نداد و کار نکرد اصلا!! چون تایمر اصلا دوباره فعال نمی شد.

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

حالا مشکلم اینه که وقتی می خوام با کلیک روی digital output ها یا تغییر شماره Analoge output ها خودم دستی یک سری اطلاعات رو بفرستم!! بعضی مواقع اون ارورری که گفتم رو میده!! همون خطه 306

خودم فکر می کنم برایه اینه که در یک لحظه همزمان تابع ارسال فراخوانی میشه!! اما نمیدونم چیکا باید بکنم!!
به نظر شما این مشکل با ترد حل میشه؟

یعنی هر وقت خواستم یک چیزی دستی بفرستم از یک ترد استفاده کنم؟


1- timer2 هر 5 میلی ثانیه اجرا میشه . و تو در زمان لود اونو فعال میکنی پس یه بار تابع send فراخوانی میشه .پس میتونه مشکل ساز بشه . ترجیحا وقتی کامبوی پورت رو تغییر میدی تایمر رو فعال کن.
2-پیش میاذ.
3-خود رویداد recieved همون کاری که میخوای انجام میده. منتظر میمونه تا یه چیزی بخونه . اونوقت تو میتونی بعد از پردازش اظلاعات ارسالی میکرو تابع send رو فراخوانی کنی.

واسه حل این مشکل نباید وقتی تابع send در حال اجراست به کاربر اجازه ارسال دستی بدی. میتونی از یه متغیر استفاده کنی یا اینکه، اوله تابع Seri..._send، خاصیت Enabled دکمه ارسال دستی رو false کنی و در انتهاش مجددا true کنی.

saman6384
جمعه 12 شهریور 1389, 16:49 عصر
خیلی ممنون از توجهتون!

امروز نشستم هم مرتبش کردم
هم همینی که شما گفتی!! یعنی وقتی تابع ارسال در حال اجراس به هیچ کنترلی اجازه ارسال ندادم دیگه!! گذاشتم خوده تابع همه چیو چک کنه و اطلاعات رو بفرسته! دیگه رویداد یا تابعه دیگه ای فراخوانیش نکنه!
حدس میزنم درس شه!

peymanjon
شنبه 13 شهریور 1389, 22:27 عصر
شما می خواین از طریق پورت اطلاعاتی که از میکرو می آید را بخونید؟
من با میکرو کار کردم ، چند پست پیش من سوال کردم که آیا میشه با c# میکرو را پروگرم کرد؟ راستش من میدونم با بسکام و کدویژن میکرو را پروگرم کنم ولی می خوام بدونم این کار را میشه با .net و C# انجام داد؟
راستی اگه میخوای از پورت بخونی من میتونم برنامه شو برات بفرستم؟