# پایگاه‌های داده > سایر پایگاه‌های داده > Foxpro > سوال: تحلیل و تبدیل دو قطعه کد

## nima_8m

با سلام به اساتید گرامی
سپاس از زحماتتون برای برپا نگهداشتن این تالار
من دوتا قطعه کد فاکس دارم که مربوط میشه به اتصال ترازو به برنامه حالا میخوام تحلیل این دو قطعه کد و تفاوتش رو بدونم و اگه بشه به سی شارپ تبدلیش کنم برای برنامه ممنون

 wight_tar = FOPEN('COM1', 12)
 wight_c = FREAD(wight_tar, 8)
 FCLOSE(wight_tar)
 PUBLIC a[3]
 FOR i = 1 TO 3
    a[i] = ASC(SUBSTR(wight_c, AT('»', wight_c)+i, 1))
    a[i] = dec2hex(a(i))
 ENDFOR
 result = a(1)+a(2)+a(3)
 RELEASE a
 result = VAL(result)/1000
ENDPROC



 wight_tar = FOPEN('COM1', 12)
 wight_c = FREAD(wight_tar, 32)
 FCLOSE(wight_tar)
 PUBLIC a
 a = ''
 FOR i = 1 TO 8
    a = a+SUBSTR(wight_c, AT('+', wight_c)+i, 1)
 ENDFOR
 result = VAL(ALLTRIM(a))
 RELEASE a
 result = result/1000
ENDPROC

----------


## gh_khajehzade

سلام
تا اونجایی من میدونم FOPEN برای باز کردن فایله نه خواندن از پورت com!امیدوارم اساتید راهنمایی کنند.

----------


## nima_8m

> سلام
> تا اونجایی من میدونم FOPEN برای باز کردن فایله نه خواندن از پورت com!امیدوارم اساتید راهنمایی کنند.


این کد ها در حال حاضر به خوبی دارن کار میکنن

----------


## farhad_shiri_ex

> با سلام به اساتید گرامی
> سپاس از زحماتتون برای برپا نگهداشتن این تالار
> من دوتا قطعه کد فاکس دارم که مربوط میشه به اتصال ترازو به برنامه حالا میخوام تحلیل این دو قطعه کد و تفاوتش رو بدونم و اگه بشه به سی شارپ تبدلیش کنم برای برنامه ممنون
> 
>  wight_tar = FOPEN('COM1', 12)
>  wight_c = FREAD(wight_tar, 8)
>  FCLOSE(wight_tar)
>  PUBLIC a[3]
>  FOR i = 1 TO 3
> ...


با سلام
تابع fopen که در ویژوال فاکس استفاده میشه مشابه عملکرد توابع مربوط به I/O در زبان C می باشد، بنابراین شما می توانید هر جریان ورودی را به این توابع ارسال نمایید مثلا در زبان C تحت لینوکس ورودی ترمینال را به عنوان یک جریان پاس میدیم بنابراین این جریان ورودی می تواند هم یک فایل ذخیره شده بر روی هارد دیسک باشد وهم می توانید جریان ورودی بایت ها از یک پورت سریال مثل COM باشد.ویا حتی می تواند جریان ورودی از یک سوکت TCP/IP باشد...
عملکرد برنامه شما هم ابتدا یک جریان داده از ورودی دریافت میشود در یک رشته بایت بعد قطعا برای استخراج صحیح بایت ها به یک MASK احتیاج هست که در اینجا در یک حلقه با استفاده از دستورات داخل حلقه بایت های دریافتی در یک آرایه ذخیره شده و بعد از حلقه ها هم که اطلاعات آرایه چون از نوع رشته های بایت ذخیره شده با استفاده از تابع VAL به مقدار عددی Cast شده است.
تفاوت این دوتا تکه کد هم در نوع داده های دریافتی از ورودی هست که در مثال اول 8 بایت داده دریافت شده در دومی 32 بایت داده دریافت شده یا حداقل در دستور fread اینگونه تعریف شده اند.
وبرای تبدیل به کد سی شارپ هم کافی که با استفاده از کلاس serialPort یک ارتباط برقرار کنید برای Extract Data Buffer هم کافی که از Bit Mask Vector ها به همراه عملگرهای بیتی استفاده کنید.

----------


## nima_8m

ممنون و سپاسگذارم از پاسخ کامل شما این کد برای ترازوهای قدیمی بود من یه عکس از ارسال دیتا ترازوهای جدیدی به پیوست فرستادم آیا میشه با همین کد و یه تغییراتی این اطلاعات رو خوند ممنون میشم قدیما ترازوها به صورت هگز میفرستادن ولی الان عیناً عدد وزن رو ارسال میکنن ممنون میشم راهنمایی بفرمایید
اعداد ارسالی بعداز مساوی 3 رقم اعداد صحیح دات و سه رقم اعداد اعشاری

----------


## farhad_shiri_ex

> ممنون و سپاسگذارم از پاسخ کامل شما این کد برای ترازوهای قدیمی بود من یه عکس از ارسال دیتا ترازوهای جدیدی به پیوست فرستادم آیا میشه با همین کد و یه تغییراتی این اطلاعات رو خوند ممنون میشم قدیما ترازوها به صورت هگز میفرستادن ولی الان عیناً عدد وزن رو ارسال میکنن ممنون میشم راهنمایی بفرمایید
> اعداد ارسالی بعداز مساوی 3 رقم اعداد صحیح دات و سه رقم اعداد اعشاری


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

----------


## nima_8m

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


ممنونم از پاسخ  های کامل شما من یه عکس به پیوست فرستادم کامل توضیح داده که وزن ها به صورت AASCII ارسال میشه ترازوهای قدیمی به صورت باینری میفرستادن امیدوارم کمک کنه

----------


## farhad_shiri_ex

> ممنونم از پاسخ  های کامل شما من یه عکس به پیوست فرستادم کامل توضیح داده که وزن ها به صورت AASCII ارسال میشه ترازوهای قدیمی به صورت باینری میفرستادن امیدوارم کمک کنه


ببنید این تکه برنامه کارتون راه میندازه!(البته که تست نکردم زحمت تست اش با خودتون)

using System;  
using System.IO.Ports;  
using System.Threading;  
  
public class PortChat  
{  
    static bool _continue;  
    static SerialPort _serialPort;  
public static void Main()  
{  
	string name;  
	string data;  
	Thread readThread = new Thread(Read); 
	_serialPort = new SerialPort("COM1", 19200, Parity.None, 8, StopBits.One);  
	_serialPort.Handshake = Handshake.None; 
	_serialPort.ReadTimeout = 500;  
	_serialPort.WriteTimeout = 500; 
	_serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived)
	
	
    try  
    {  
        if(!(_serialPort.IsOpen)){
			_serialPort.Open();  
			readThread.Start();
		}		
    }  
    catch (Exception ex)  
    {  
        MessageBox.Show("Error opening/writing to serial port :: " + ex.Message, "Error!");  
    }  
	
	readThread.Join();  
    _serialPort.Close();
}


void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)  
{  
    Thread.Sleep(500);  
	_continue = false; 
}  


public static void Read()  
{  
	while (_continue)  
	{  
		try  
		{  
			data = _serialPort.ReadLine();  
			Console.WriteLine(data);  
		}  
		catch (TimeoutException) { }  
	}  
}


int getWeight(){
	
	int weight =0 , i =0;
	string tmp ;
	foreach (string buf in data) {
		i++;
		tmp += buf.Substring(buf.IndexOf("+") + i , 1) ;
    }
   weight = Convert.ToInt32(buf.Trim(), 16) / 1000;
}	

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

----------


## nima_8m

سلام به اساتید گرامی خصوصا جناب شیری که همیشه به ما لطف دارن
تو پست شماره 5 خروجی ترازو روی هایپرترمینال نمایش داده شده که به اینصورت هست (پست شماره 5 )
=015.120(kg)
کاملا واضح است که سه رقم اول از سمت چپ عدد صحیح و سه رقم بعد از دات رقم اعشاری است و نمایش نماد کیلوگرم
من یه کد میخوام که عدد صحیح با سه رقم اعشاری رو از پورت بخونه و نمایش بده یعنی مساوی و صفر قبل عدد و نماد کیلوگرم حذف بشه
کدی که من درحال حاضر دارم استفاده میکنم تو پست شماره یک هست

----------


## farhad_shiri_ex

> سلام به اساتید گرامی خصوصا جناب شیری که همیشه به ما لطف دارن
> تو پست شماره 5 خروجی ترازو روی هایپرترمینال نمایش داده شده که به اینصورت هست (پست شماره 5 )
> =015.120(kg)
> کاملا واضح است که سه رقم اول از سمت چپ عدد صحیح و سه رقم بعد از دات رقم اعشاری است و نمایش نماد کیلوگرم
> من یه کد میخوام که عدد صحیح با سه رقم اعشاری رو از پورت بخونه و نمایش بده یعنی مساوی و صفر قبل عدد و نماد کیلوگرم حذف بشه
> کدی که من درحال حاضر دارم استفاده میکنم تو پست شماره یک هست


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

*wight_tar = FOPEN('COM1', 12)
*wight_c = FREAD(wight_tar, 8)
*FCLOSE(wight_tar)

*!* if unsigned number
wight_c = "015.120(kg)"
*21.510
?getWeight(wight_c)

*!* if signed number
wight_c ="015.12-(kg)"
*-21.510
?getWeight(wight_c) 

FUNCTION getWeight
PARAMETERS wight_c 
    PUBLIC bufStr[7] as byte,result as double
    str_weight = ""
    FOR i=1 TO LEN(wight_c)-5
        bufStr[i] = SUBSTR(wight_c, AT("(kg)",wight_c)-i, 1)
        str_weight = str_weight +bufStr[i]
    ENDFOR 
    result = VAL(str_weight)
RETURN result 
ENDFUNC

----------

