PDA

View Full Version : سوال: تبدیل کد متلب به سی شارپ



elahe1393
شنبه 27 دی 1393, 14:22 عصر
سلام
من برای ارتباط با دستگاهی که میتونم با پورت سریال باهاش در ارتباط باشم می خوام یه برنامه سی شارپ بنویسم من نه از اصول ارتباطات سخت افزاریش سر در میارم نه اینکه کد متلب بلدم الان تنها یه کد متلب دارم که با دستگاه در ارتباط هست و تنظیماتی ارسال میکنه و اطلاعاتی دریافت میکنه حالا می خوام این کد متلب رو به کد سی شارپ تبدیل کنم تا حدودی این تبدیل انجام شده الان در یک بخشی تو کد متلب کد زیر استفاده شده
DesMemAdd_Byte = typecast(uint16(DesMemoryAddress), 'uint8');

Write_Frame = [DestinationID, SourceID, CMD, DesMemoryType, ...
double(DesMemAdd_Byte(1)), double(DesMemAdd_Byte(2)), length(Data), Data];

CRC = CRC16_Ram(Write_Frame);
CRC_Byte = typecast(uint16(CRC), 'uint8');

Write_Frame = [DestinationID, SourceID, CMD, DesMemoryType, ...
DesMemAdd_Byte(1), DesMemAdd_Byte(2), length(Data), Data, ...
CRC_Byte(2), CRC_Byte(1)];
معادل این کد در سی شارپ چی میشه لطفا راهنمایی کنید ممنون

elahe1393
شنبه 27 دی 1393, 15:35 عصر
در ضمن کدی برای الگوریتم CRC به زبان متلب دارم که برای نوشتن برنامه نیاز دارم به سی شارپ تبدیلش کنم لطفا کد زیر که مربوط به همون CRC میشه رو راهنمایی کنید که چطور به سی شارپ تبدیل کنم

function CRC = CRC16_Ram(pointer)
%
% pointer
%

CRC_Table = ...
['0000'; 'C1C0'; '81C1'; '4001'; '01C3'; 'C003'; '8002'; '41C2'; ...
'01C6'; 'C006'; '8007'; '41C7'; '0005'; 'C1C5'; '81C4'; '4004';...
'01CC'; 'C00C'; '800D'; '41CD'; '000F'; 'C1CF'; '81CE'; '400E';...
'000A'; 'C1CA'; '81CB'; '400B'; '01C9'; 'C009'; '8008'; '41C8';...
'01D8'; 'C018'; '8019'; '41D9'; '001B'; 'C1DB'; '81DA'; '401A';...
'001E'; 'C1DE'; '81DF'; '401F'; '01DD'; 'C01D'; '801C'; '41DC';...
'0014'; 'C1D4'; '81D5'; '4015'; '01D7'; 'C017'; '8016'; '41D6';...
'01D2'; 'C012'; '8013'; '41D3'; '0011'; 'C1D1'; '81D0'; '4010';...
'01F0'; 'C030'; '8031'; '41F1'; '0033'; 'C1F3'; '81F2'; '4032';...
'0036'; 'C1F6'; '81F7'; '4037'; '01F5'; 'C035'; '8034'; '41F4';...
'003C'; 'C1FC'; '81FD'; '403D'; '01FF'; 'C03F'; '803E'; '41FE';...
'01FA'; 'C03A'; '803B'; '41FB'; '0039'; 'C1F9'; '81F8'; '4038';...
'0028'; 'C1E8'; '81E9'; '4029'; '01EB'; 'C02B'; '802A'; '41EA';...
'01EE'; 'C02E'; '802F'; '41EF'; '002D'; 'C1ED'; '81EC'; '402C';...
'01E4'; 'C024'; '8025'; '41E5'; '0027'; 'C1E7'; '81E6'; '4026';...
'0022'; 'C1E2'; '81E3'; '4023'; '01E1'; 'C021'; '8020'; '41E0';...
'01A0'; 'C060'; '8061'; '41A1'; '0063'; 'C1A3'; '81A2'; '4062';...
'0066'; 'C1A6'; '81A7'; '4067'; '01A5'; 'C065'; '8064'; '41A4';...
'006C'; 'C1AC'; '81AD'; '406D'; '01AF'; 'C06F'; '806E'; '41AE';...
'01AA'; 'C06A'; '806B'; '41AB'; '0069'; 'C1A9'; '81A8'; '4068';...
'0078'; 'C1B8'; '81B9'; '4079'; '01BB'; 'C07B'; '807A'; '41BA';...
'01BE'; 'C07E'; '807F'; '41BF'; '007D'; 'C1BD'; '81BC'; '407C';...
'01B4'; 'C074'; '8075'; '41B5'; '0077'; 'C1B7'; '81B6'; '4076';...
'0072'; 'C1B2'; '81B3'; '4073'; '01B1'; 'C071'; '8070'; '41B0';...
'0050'; 'C190'; '8191'; '4051'; '0193'; 'C053'; '8052'; '4192';...
'0196'; 'C056'; '8057'; '4197'; '0055'; 'C195'; '8194'; '4054';...
'019C'; 'C05C'; '805D'; '419D'; '005F'; 'C19F'; '819E'; '405E';...
'005A'; 'C19A'; '819B'; '405B'; '0199'; 'C059'; '8058'; '4198';...
'0188'; 'C048'; '8049'; '4189'; '004B'; 'C18B'; '818A'; '404A';...
'004E'; 'C18E'; '818F'; '404F'; '018D'; 'C04D'; '804C'; '418C';...
'0044'; 'C184'; '8185'; '4045'; '0187'; 'C047'; '8046'; '4186';...
'0182'; 'C042'; '8043'; '4183'; '0041'; 'C181'; '8180'; '4040' ];

CRC_Table_dec = hex2dec(CRC_Table);
CRC = hex2dec('FFFF');

for i = 1:length(pointer)
CRC = bitxor(bitand(uint32(bitshift(CRC,8)),65535), ...
CRC_Table_dec(bitxor(bitshift(CRC,-8), pointer(i))+1));
end



لطفا راهنمایی کنید :افسرده:

elahe1393
یک شنبه 28 دی 1393, 07:59 صبح
لطفا اگه کسی راهنمایی میتونه بکنه دریغ نکنه ممنون
اصلا میشه بگید میشه اینکارو کرد یا نه؟

rahnema1
یک شنبه 28 دی 1393, 11:01 صبح
لطفا اگه کسی راهنمایی میتونه بکنه دریغ نکنه ممنون
اصلا میشه بگید میشه اینکارو کرد یا نه؟

کد سی شارپ را از همون شرکت بگیرید!
http://www.fararopaya.com/download/view/8.aspx

elahe1393
یک شنبه 28 دی 1393, 12:31 عصر
مرسی از راهنماییتون
الان تو یه بخشی برام سوال ایجاد شده تو کد متلبم باید یه مقدار داده رو که می خواد به دستگاه ارسال کنه رو با توجه به یک سری محاسبات تبدیل به ورودی byte[] Data تابع SerialWrite بکنه کدهای متلب بصورت زیر هست من این کدها رو بخوام تبدیل به سی شارپ کنم چطوری میشه البته تا حدودی تبدیل کردم ولی نوع متغیرهامو نمیدونم چطوری تعیین کنم که مقدار بدست آمده نهاییم byte[] بشه

function setLvL(stepnow)
global rowlvl;
global vfirstlvl vlastlvl vdiff;
global addressformotorwritetovassl;

%needs check
vmid=((rowlvl(stepnow)-1)*(vlastlvl-vfirstlvl)/(10-1))+vfirstlvl;

vforvasl=vmid-vdiff

p1=vforvasl;%v
p2=((p1+2.5)*2^24)/5;
d3=floor((p2)/(2^16));
p3=p2-d3*(2^16);
d2=floor((p3)/(2^8));
p3=p3-d2*(2^8);
d1=floor(p3);
dataformotorwritetovassl=[d1 d2 d3 0];

کدهای تبدیلیم مشابه زیر هست فقط نوع داده هامو میخوام مشخص کنم که double تبدیل به byte بشه اصلا تبدیلم درسته؟ چیکار باید بکنم؟

double vfirstlvl = 0.3, vlastlvl = 1.4, vdiff = 0.1;
double vmid, vforvasl;
double p1, p2, d3, p3, d2, d1;

vmid= ((rowlvl * stepNow -1)*(vlastlvl-vfirstlvl)/(10-1))+vfirstlvl;

vforvasl=vmid-vdiff;

p1=vforvasl;
p2=((p1+2.5)*(2^24))/5;
d3= Math.Floor((p2)/(2^16));
p3=p2-d3*(2^16);
d2=Math.Floor((p3)/(2^8));
p3=p3-d2*(2^8);
d1=Math.Floor(p3);

double[] dataformotorwritetovassl={d1, d2, d3, 0};

rahnema1
یک شنبه 28 دی 1393, 14:07 عصر
اونها که global هستند خارج از تابع تعریف میشن
rowlvl هم معلوم نیست نوعش چیه احتمالا یک جای دیگه مقدار دهی شده

double[] rowlvl;
int[] rowlvl;//??
double vfirstlvl, vlastlvl, vdiff;
double[] addressformotorwritetovassl;
void setLvL(int stepnow)
{
double vmid, vforvasl;
double p1, p2, d3, p3, d2, d1 ;
//needs check
vmid =((rowlvl[stepnow]-1)* (vlastlvl-vfirstlvl)/(10-1))+vfirstlvl;
vforvasl =vmid-vdiff
p1 =vforvasl;//v
p2 =((p1+2.5)*Math.Pow(2,24))/5;
d3 =Math.Floor((p2)/(Math.Pow(2,16)));
p3 =p2-d3*(Math.Pow(2,16));
d2 =Math.Floor((p3)/(Math.Pow(2,8)));
p3 =p3-d2*(Math.Pow(2,8));
d1 =Math.Floor(p3);
dataformotorwritetovassl=new double[]{d1, d2, d3, 0.0};
}

elahe1393
سه شنبه 30 دی 1393, 14:35 عصر
سلام
نرم افزاری با زبان متلب برای دستگاه نوشته شده من می خوام اون نرم افزار را با تغییراتی با کد سی شارپ بنویسم زمانیکه به تابع SerialRead و SerialWrite می رسم برنامه خطای زیر رو میده

http://s4.picofile.com/file/8165026500/27.jpg

مشکل کجاست؟
درایور سخت افزار رو نصب کردم شناسایی شده، نام پورت مشخصه مقداردهی شده، BaudRate هم مقداردهی شده 38400 تنها مشکل احتمال میدم به PAC ID که نمیدونم چیه؟
برای SerialRead مقادیر بصورت زیر است:


1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

//------------- Define Serial Port ----------------
private SerialPort InitializeSerialPort(string portName)
{
serialPort.PortName = portName;
serialPort.BaudRate = 38400;
serialPort.DataBits = 8;
serialPort.Parity = Parity.None;
serialPort.Handshake = Handshake.None;
serialPort.RtsEnable = true;
serialPort.StopBits = StopBits.One;
serialPort.Encoding = Encoding.ASCII;
return serialPort;
}
byte[] receiveData;
ErgometerSettings settings = new ErgometerSettings();
receiveData = pac.SerialRead(serialPort.PortName, serialPort.BaudRate, 1, 56, 4);








برای SerialWrite هم مقادیر بصورت زیر است:


1
2
3

byte[] dataformotorwritetoghat = { 94, 172, 220, 0 };
acknowledgeFrame = pac.SerialWrite(serialPort.PortName, serialPort.BaudRate, 1, 84, dataformotorwritetovassl);