PDA

View Full Version : استفاده از اطلاعات نمایش داده شده در HyperTerminal در vb



poorhasan
دوشنبه 03 خرداد 1389, 10:01 صبح
با سلام خدمت دوستان
من با تعدادی نمایشگر وزن کار کردم که دارای خروجی سریال هستند اونها رو وقتی به هایپر ترمینال وصل می کنم و تست می کنم همون وزنی که روی دستگاه نشون می ده روی هایپر ترمینال هم میاد جالب اینجاست که وقتی یه دستگاه دیگه مال یه شرکت دیگه روهم که وصل می کنم بازم وزن روی نمایشگر روی هایپر میاد در صورتی که من برنامه ای که برای خواند از پورت این دستگاه ها نوشتم برای یه دستگاه دیگه باید تغییرکنه یعنی این دستگاههایی که با هایپر ترمینال دقیقا اطلاعاتشون درست نمایش داده می شد از نظر ارسال بایت ها با هم تفاوت دارند ولی نمی دونم از چه راهی هایپر ترمینال با هر کدوم از این دستگاه ها به راحتی ارتباط برقرار می کنه و وزن رو می خونه ولی من که بخوام همین کار رو بکنم باید اول آرایه بایت ها رو دریافت کنم بعد با حساب و کتاب وزن رو بدست بیارم که اونم برای دستگاههای مختلف فرق می کنه
نمی دونم تونستم منظورم رو به اساتید برسونم یا نه
چیزی که من می خوام اینه که یه روش یا هر چیز دیگه ای هست که بشه یه راه برای طراحی یه برنامه پیدا کرد که اگه هر دستگاهی رو وصل کردیم مانند هایپر ترمینال بتونه اطلاعات وزنشو بخونه
با تشکر و شرمندگی به خاطر طولانی شدن سوال

vbhamed
دوشنبه 03 خرداد 1389, 11:52 صبح
سلام

هايپر ترمينال به خودي خود كاري انجام نمي ده، فقط خروجي اون دستگاهها رو نمايش مي ده
شما هم با كنترل MSCOMM مي توني دقيقا همون خروجي رو داشته باشي
فقط بايد خودت پردازشش كني و وزن رو ازش استخراج كني

poorhasan
دوشنبه 03 خرداد 1389, 12:21 عصر
سلام

هايپر ترمينال به خودي خود كاري انجام نمي ده، فقط خروجي اون دستگاهها رو نمايش مي ده
شما هم با كنترل MSCOMM مي توني دقيقا همون خروجي رو داشته باشي
فقط بايد خودت پردازشش كني و وزن رو ازش استخراج كني

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

vbhamed
دوشنبه 03 خرداد 1389, 18:31 عصر
سلام

فريم داده هايي كه مي فرسته يعني چي ؟
هايپر چيزي نمي فرسته
فقط طبق تنظيمات پورت Com كه اونم خودتون بايد بدين، داده ها رو مي خوانه
هر چيزي هم كه مياد از خود دستگاه مياد و ربطي به هايپر نداره
شايد شما موقع خوندن اشتباه داده ها رو مي خونيد يا اشتباه پردازش مي كنيد

poorhasan
سه شنبه 04 خرداد 1389, 00:26 صبح
سلام

فريم داده هايي كه مي فرسته يعني چي ؟
هايپر چيزي نمي فرسته
فقط طبق تنظيمات پورت Com كه اونم خودتون بايد بدين، داده ها رو مي خوانه
هر چيزي هم كه مياد از خود دستگاه مياد و ربطي به هايپر نداره
شايد شما موقع خوندن استباه داده ها رو مي خونيد يا اشتباه پردازش مي كنيد
سلام
شاید من منظورم رو درست بیان نکردم
فرض کنید تنظیمات پورت سریال دو دستگاه با هم یکی هستند
ببینید نمایشگر های وزن دارای یک فریم خاص تو خروجی سریال هستند مثل رابطه زیر
13,52,48,48,48,48,48,48,20 که 13 نشون دهنده ابتدای فریم و 20 انتهای فریم می باشد و اعداد 48 ضرایب هزارگان و صد گان و .... هستند و یه سری چیزای دیگه
تو دستگاههای مختلف این فریم ها باهم فرق می کنه مثلا تو یه دستگاه دیگه اینطوره
13,45,25,24,24,24,24,24,24,14,15
برای هر کدوم از این دیتاها باید یک رابطه جدا بدست بیاریم تا بتونیم با mscomm32 اونو روی یک فرم نمایش بدیم ولی هایپر ترمینال قادره هردو تا ی این دستگاهها رو به راحتی بخوانه بدون هیچ برنامه ای
اینو بگم که در این فریم اعداد مثلا مثال اول 48 مقدار اولیه به ازای وزن صفر است وقتی وزن افزایش پیدا میکنه با توجه به ارزش بایت ضرایب وزن حاصل می شود
یعنی اگر عبارت زیر را از دستگاه دریافت کنیم وزن برابر با 542 کیلو گرم است
13,52,48,48,48,53,52,50,20
اگر توجه کرده باشید از سمت راست به چپ بایت دوم 2 واحد و بایت سوم 4 واحد و بایت چهارم 5 واحد افزایش یافته است .
با تشکر فراوان از محبت همه دوستان

vbhamed
سه شنبه 04 خرداد 1389, 08:39 صبح
سلام
ولي من بازم فكر مي كنم جايي داريد اشتباه مي كنيد
من خودم با يك مدل ترازو كار كردم و خروجيش اصلا اينطوري كه شما مي گين نيست
يه چيزي شبيه اين رو مي ده كه كاملا مشخصه


ST,+00000.00 g
ST,+00000.00 g
ST,+00000.00 g
ST,+00000.00 g
US,+00001.47 g
US,+00002.95 gمي تونيد تو تاپيك زير پست شماره 5 اين موضوع رو ببينيد
http://barnamenevis.org/forum/showthread.php?t=104916

شما يك صفحه از خروجي هايپر ترمينال رو اينجا بزاريد تا ببينيم چي ميشه
ولي ظاهرا خروجي كه شما مي گيري به صورت بايت به بايت هست در صورتيكه بايد رشته باشه

مثلا در مورد 13,52,48,48,48,48,48,48,20 معنيش ميشه 4000000 گرم يا 4 تن
13 كه كد Enter هست 20 هم جداكننده از وزن بعدي، 52 كد اسكي عدد 4 و 48 كد اسكي عدد 0 هست


ولي طبق مثال دوم يعني خروجي 13,52,48,48,48,53,52,50,20
اگر عبارت بالا نمايش 542 كيلوگرم باشه پس در كل كد 13 و 52 ابتداي عبارت هستن
48 كه همون كد اسكي 0 هست
53 كد اسكي 5
52 كد اسكي 4
50 كد اسكي 2
يعني 000542 كه همون 542 كيلو گرم است
شايد هم 52 بعد از 13 واحد اندازه گيري رو مشخص كنه كه به گرم هست يا كيلوگرم يا تن
20 هم كه انتهاي عبارت

poorhasan
سه شنبه 04 خرداد 1389, 12:15 عصر
سلام
ولي من بازم فكر مي كنم جايي داريد اشتباه مي كنيد
من خودم با يك مدل ترازو كار كردم و خروجيش اصلا اينطوري كه شما مي گين نيست
يه چيزي شبيه اين رو مي ده كه كاملا مشخصه


ST,+00000.00 g
ST,+00000.00 g
ST,+00000.00 g
ST,+00000.00 g
US,+00001.47 g
US,+00002.95 gمي تونيد تو تاپيك زير پست شماره 5 اين موضوع رو ببينيد
http://barnamenevis.org/forum/showthread.php?t=104916

شما يك صفحه از خروجي هايپر ترمينال رو اينجا بزاريد تا ببينيم چي ميشه
ولي ظاهرا خروجي كه شما مي گيري به صورت بايت به بايت هست در صورتيكه بايد رشته باشه

مثلا در مورد 13,52,48,48,48,48,48,48,20 معنيش ميشه 4000000 گرم يا 4 تن
13 كه كد Enter هست 20 هم جداكننده از وزن بعدي، 52 كد اسكي عدد 4 و 48 كد اسكي عدد 0 هست


ولي طبق مثال دوم يعني خروجي 13,52,48,48,48,53,52,50,20
اگر عبارت بالا نمايش 542 كيلوگرم باشه پس در كل كد 13 و 52 ابتداي عبارت هستن
48 كه همون كد اسكي 0 هست
53 كد اسكي 5
52 كد اسكي 4
50 كد اسكي 2
يعني 000542 كه همون 542 كيلو گرم است
شايد هم 52 بعد از 13 واحد اندازه گيري رو مشخص كنه كه به گرم هست يا كيلوگرم يا تن
20 هم كه انتهاي عبارت

سلام دوست عزیز
فهمیدم مشکل کار من کجاست تو نمونه اطلاعاتی که گذاشته بودم درستش این بود
13,43,48,48,48,48,48,48,84 بود و همین فریم تکرار میشد
بایت دوم از چپ مربوط به وزن مثبت یا منفی است
مشکل کار من این بود که اصلا به اینکه اینها کد اسکی یه عبارات خاصی هستند توجه نمی کردم من با دستور data(i)=asc(mscomm1.input) داده ها رو در یک آرایه ذخیره می کردم و با توجه به اینکه ضرایب چطور تغییر می کردند یک رابطه بدست می آوردم و اینجوری وزن رو حساب می کردم مثل اینکه من لقمه رو از دور سرم می چرخوندم مثلا ( 48 معادل صفر 49 با یک واحد افزایش معادل 1 و ... و باتوجه به ارزش بایت جمع و ضرب می کردم وزن بدست میومد)
واقعا دیدمو در این مورد باز کردید واقعا ازتون ممنونم
راستی دستور برگردوندن یک کارکتر با توجه به کد اسکی چطوری یعنی چطور میتونم 50 رو به 2 تبدیل کنم

vbhamed
سه شنبه 04 خرداد 1389, 14:13 عصر
سلام

تبديل كد اسكي به كاراكتر براي حالت غير يونيكد


ch = chr$(52)

و براي يونيكد


ch = chrw$(65200)

ولي شما نياز نيست از پورت بخونيد و تو آرايه بزاريد
يك رشته تو قسمت عمومي فرم تعريف كنيد به اسم مثلا S
بعد اينطوري بنويسيد


s = s + mscomm1.input

بعد رشته رو پردازش كنيد
هر موقع هم از رشته استفاده كرديد مي تونيد اونو خالي كنيد تا زياد بزرگ نشه

poorhasan
سه شنبه 04 خرداد 1389, 15:20 عصر
ببخشید حامد خان
تو برنامه ای که به نام Balance تو این سایت گذاشتی چند تا مورد رو من نفهمیدم اگه میشه توضیح بدید
Dim pish$, pass$, s$, m$
اصلا $ تو تعریف متغییر یعنی چی ؟ علامت % چطور
mscomm.InBufferCount >= 15 برای چی استفاده می شه ؟
این چه معنی میده Dim temp() As String, i%, f%
این دیگه خیلی برام نامفهومه temp = Split(m, vbCrLf)
vbcrlf کارش چیه ؟

vbhamed
چهارشنبه 05 خرداد 1389, 10:10 صبح
ببخشید حامد خان
تو برنامه ای که به نام Balance تو این سایت گذاشتی چند تا مورد رو من نفهمیدم اگه میشه توضیح بدید

Dim pish$, pass$, s$, m$

اصلا $ تو تعریف متغییر یعنی چی ؟ علامت % چطور



اين يعني متغير pish و pass و s و m رشته اي هستن مشابه As String عمل مي كنه

$ : String
% : Integer
& : Long
! : Single
@ : Currency
# : Double



mscomm.InBufferCount >= 15 برای چی استفاده می شه ؟
يعني وقتي تعداد بايتهاي خوانده شده از ترازو بيشتر از 15 تا شد حالا يه كاري انجام بده
چون در ترازوي استفاده شده، هر سطر اطلاعاتي 15 كاراكتر بود من اين رو گذاشتم تا وقتي داده ها هنوز كامل نرسيدن، چيزي خونده نشه و بعد يه جا بخونه


این چه معنی میده Dim temp() As String, i%, f%
Temp يك آرايه بدون بعد يا تعداد از نوع رشته اي تعريف شده تا بعدا بعدش تغيير كنه
I و f هم Integer


این دیگه خیلی برام نامفهومه temp = Split(m, vbCrLf)
vbcrlf کارش چیه ؟
vbVrLf يعني كاراكتر Enter و خط بعد يعني Corrage Return و LineFeed (همون Enter خودمون)
مقداري كه هر بار از ترازو خونده ميشه با Enter از مقدار قبلي جدا شده
اين دستور مياد رشته m رو مي گيره و بر اساس Enter يا همون vbVrLf سطرها رو از هم جدا مي كنه و هر سطر رو تو يك خونه از آرايه temp مي زاره
آرايه Temp هم كه قبلا بدون بعد تعريف شده بود اينجا بعد مي گيره
تعداد عناصرش هم ميشه

Msgbox Ubound(Temp)

poorhasan
چهارشنبه 05 خرداد 1389, 11:37 صبح
سلام
شرمنده از اینکه سوالات من تمومی نداره ولی اینم برام کمی ابهام داره تنظیمات پیش فرض پورت سریال که به صورت زیر هست چه فرقی با اون که تو برنامه تون گذاشتید می کنه

9600,n,8,1
اگه تغییر کنه اطلاعات به چه صورتی ارسال می شه
یه سوال دیگم اینکه vbCrLf چه جوری توی دستور temp = Split(m, vbCrLf) عمل می کنه
مثلا رشته m برابر با این مقداره 43.48.48.48.48.49.50.116.13 باشه یعنی اون میاد غیر از اخرین کارکتر بقیه رو داخل temp ذخیره می کنه اون کارکتر 13 رو تشخیص می ده که مربوط به اینتر هست یا غیر از اینه ؟
اگر رشته رو به صورت 48.48.48.49.50.116.13.43.48 باشه چه جوری میشه ؟
یه چیز دیگم اینکه پس از اینکه دستور If .InBufferCount >= 15 Then اجرا شد بافر mscomm چه جوری خالی میشه ؟ همین که بخوانیم خالی میشه ؟
با تشکر فراوان

vbhamed
چهارشنبه 05 خرداد 1389, 12:44 عصر
سلام
شرمنده از اینکه سوالات من تمومی نداره ولی اینم برام کمی ابهام داره تنظیمات پیش فرض پورت سریال که به صورت زیر هست چه فرقی با اون که تو برنامه تون گذاشتید می کنه

9600,n,8,1
اگه تغییر کنه اطلاعات به چه صورتی ارسال می شه
یه سوال دیگم اینکه vbCrLf چه جوری توی دستور temp = Split(m, vbCrLf) عمل می کنه
مثلا رشته m برابر با این مقداره 43.48.48.48.48.49.50.116.13 باشه یعنی اون میاد غیر از اخرین کارکتر بقیه رو داخل temp ذخیره می کنه اون کارکتر 13 رو تشخیص می ده که مربوط به اینتر هست یا غیر از اینه ؟
اگر رشته رو به صورت 48.48.48.49.50.116.13.43.48 باشه چه جوری میشه ؟
یه چیز دیگم اینکه پس از اینکه دستور If .InBufferCount >= 15 Then اجرا شد بافر mscomm چه جوری خالی میشه ؟ همین که بخوانیم خالی میشه ؟
با تشکر فراوان




سلام

شما هنوز هم داري اشتباه رشته رو مي خوني
رشته اي كه خونده ميشه نبايد به اين شكل باشه :

43.48.48.48.48.49.50.116.13
چون اين رشته يعني كاراكتر 4 و 3 و . و 4 و 8 و . و 4 و .....
بلكه بايد اين باشه :

+000012t

يعني تو رشته شما بايد دقيقا عبارت بالا قرار بگيره نه كد اسكي اونها

بله، بافر MSCOMM هم به محض خوندن خالي ميشه