PDA

View Full Version : سوال: الگوریتم تفکیک سازی یک رشته



elahe1393
سه شنبه 25 شهریور 1393, 09:30 صبح
برنامه ای نوشتم که با دستگاهی از طریق پورت سریال ارتباط برقرار میکنه مرتبا داده از دستگاه به برنامه ارسال میشه من بر اساس نیازم یه رشته به دستگاه ارسال میکنم تا تنظیماتی روی دستگاه اعمال بشه ابتدا یه $ میفرستم دستگاه میفهمه داده میخواد براش ارسال بشه بعد 50 میلی ثانیه یک رشته برحسب تنظیماتم میفرستم وقتی دستگاه رشته رو دریافت کرد یک بسته مثل Command is $$$1,1,150,1,1,30# برام میفرسته زمانی هم که تنظیماتو اعمال کرد یک بسته مثل command1:1\r\nPWM1=150\r\nvelocity1:1\r\ncommand2: 1\r\nPWM2=30# برام میفرسته بعد از این بسته هام برحسب تنظیمات ارسال شده تنظیم شدن حالا من میخوام وقتی رشته کلی رو دریافت کنم همه این بخش هارو تفکیک کنم تا بفهمم دستگاه کجا داده منو دریافت کرده کجا تنظیماتو اعمال کرده کدوم بسته داده برحسب تنظیمات منه طول بسته هام متغیره و اعداد منفی هم میگیره میشه منو راهنمایی کنید تا یه الگوریتمی برای تفکیک این رشته بدست بیارم تا بتونم اعتبارسنجی کنم
نمونه رشته دریافتی از کل این بخشها

$28303,0,0,12,0,0,0# \r\n$28304,0,1,13,0,0,0# \r\n$28305,0,0,13,0,0,0# \r\n$28306,0,0,13,0,0,0# \r\n$28307,0,1,14,0,0,0# \r\n$28308,0,0,14,0,0,0# \r\n$28309,0,0,14,0,0,0# \r\n$28310,0,0,14,0,0,0# \r\nCommand is $$$1,1,150,1,1,30#$$28311,0,0,14,0,0,-2# \r\n$28312,0,0,14,0,0,-2# \r\n$28313,0,0,14,0,0,-2# \r\n\r\ncommand1:1\r\n$28314,0,0,14,0,0,-2# \r\nPWM1=150\r\nvelocity1:1\r\ncommand2:1\r\nPWM2= 30#$\r\n$28315,0,0,14,0,0,-2# \r\n$28316,150,0,14,30,0,-2# \r\n$28317,150,0,14,30,0,-2# \r\n$28318,150,0,14,30,0,-2#

البته اینم بگم بعضی وقتا امکان داره چندتا کاراکتر کمو بیش داشته باشه مثلا به جای سه تا $ پشت سرهم دوتا باشه یا یه بسته مثلا $1 بینش باشه خیلی وقته دارم روش کار میکنم ولی هنوز نتونستم به یه نتیجه معقولانه برسم

hamid_hr
سه شنبه 25 شهریور 1393, 10:19 صبح
به نظر من
شما باید بدونید مثلا $28303,0,0,12,0,0,0# که دریافت میکنید یعنی چه؟
اگر نمیدونید باید یه دیکشنری از اطلاعاتی که میفرسته درست کنید
حالا رشته ای که میفرسته رو splite کنید
اینطوری
var tmp = str.Replace("\r\n","\n").Split('\n');

حالا تک تک دستورات تبه صورت ارایه تو tmp هستش
با توجه به دیکشنری که داری این دستورات رو ترجمه میکنی

elahe1393
سه شنبه 25 شهریور 1393, 13:20 عصر
درسته این روشی که شما میگید صحیح
حتی راحت تر از این میشه با کمک دستور
string[] recieveDataSplit = recieveData.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
تفکیک کرد حالا مشکل اصلیم اینه که من بسته های شبیه $28303,0,0,12,0,0,0# برام بیشتر مهمه و لازمش دارم البته مهمتر از این بسته هایی که بعد از PWM2=30 به دستم میرسهحالا من چطور میتونم این رشته رو طوری مجزا کنم که بتونم بسته های موردنظرمو ازشون جدا کنم تا استفاده کنم؟؟؟

rahnema1
چهارشنبه 26 شهریور 1393, 09:37 صبح
مثالی از رشته ای که گذاشتید دستورات داخلش نبود من خودم بر اساس توضیحی که دادید تصور کردم رشته به صورت زیر باشه

string mystring = "$28303,0,0,12,0,0,0# \r\n$28304,0,1,13,0,0,0# command1:1\r\nPWM1=150\r\nvelocity1:1\r\ncommand2: 1\r\nPWM2=30# \r\n$28305,0,0,13,0,0,0# \r\n$28306,0,0,13,0,0,0#";
Match regMatch = Regex.Match(mystring ,@"PWM\d+=30#");
string mystring2= mystring.Substring(regMatch.Index+regMatch.Length) ;

elahe1393
چهارشنبه 26 شهریور 1393, 11:00 صبح
مرسی از راهنماییتون خیلی خوب بود