請教各位大大,幫小弟一個問題 |
答題得分者是:seaturn99
|
wychen57
一般會員 發表:32 回覆:77 積分:21 註冊:2003-10-04 發送簡訊給我 |
小弟寫一個crc16的function,但要如何運用,main form要呼叫crc16,但出現一項錯誤 "undeclared identifier :crc16", 請大大指導一下,感激萬分,原始碼如下 unit Main; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls; type
TfrmMain = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
btnSend: TButton;
btnRecive: TButton;
procedure FormCreate(Sender: TObject); private
{ Private declarations }
public
{ Public declarations }
end; var
frmMain: TfrmMain; implementation uses Math; {$R *.dfm} procedure TfrmMain.FormCreate(Sender: TObject);
var
a: array[0..7] of Byte;
b: array[0..1] of Byte;
CRC_Lo,CRC_Hi: Byte;
begin
b:=crc16(a,5);
CRC_Lo:=b[0];
CRC_Hi:=b[1];
end; function CRC16(CRCData: array of Byte; Datalen: Integer):Word;
var
CRC16Lo: Byte;
CRC16Hi: Byte;
SaveLo:Byte;
SaveHi:Byte;
GLo:Byte;
GHi:Byte;
i:Integer;
Flag:Integer;
begin
CRC16Lo:=$ff;
CRC16Hi:=$ff;
GLo:=$01;
GHi:=$a0;
for i:=0 to Datalen -1 do
begin
CRC16Lo:=CRC16Lo xor CRCData[i];
for Flag :=0 to 7 do
begin
SaveLo:=CRC16Lo;
SaveHi:=CRC16Hi;
CRC16Hi:=CRC16Hi shr 1;
CRC16Lo:=CRC16Lo shr 1;
if (SaveHi and $01) = $01 then
CRC16Lo:=CRC16Lo or $80;
if (SaveLo and $01) = $01 then
begin
CRC16Hi:=CRC16Hi xor GHi;
CRC16Lo:=CRC16Lo xor GLo;
end; end; end;
CRC16 := CRC16Lo * 256 CRC16Hi;
end; end.
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 小弟寫一個crc16的function,但要如何運用,main form要呼叫crc16,但出現一項錯誤 "undeclared identifier :crc16", 請大大指導一下,感激萬分,原始碼如下 unit Main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; function CRC16(CRCData: array of Byte; Datalen: Integer):Word; type TfrmMain = class(TForm) Edit1: TEdit; Edit2: TEdit; btnSend: TButton; btnRecive: TButton; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var frmMain: TfrmMain; implementation uses Math; {$R *.dfm} procedure TfrmMain.FormCreate(Sender: TObject); var a: array[0..7] of Byte; b: array[0..1] of Byte; CRC_Lo,CRC_Hi: Byte; begin b:=crc16(a,5); CRC_Lo:=b[0]; CRC_Hi:=b[1]; end; function CRC16(CRCData: array of Byte; Datalen: Integer):Word; var CRC16Lo: Byte; CRC16Hi: Byte; SaveLo:Byte; SaveHi:Byte; GLo:Byte; GHi:Byte; i:Integer; Flag:Integer; begin CRC16Lo:=$ff; CRC16Hi:=$ff; GLo:=$01; GHi:=$a0; for i:=0 to Datalen -1 do begin CRC16Lo:=CRC16Lo xor CRCData[i]; for Flag :=0 to 7 do begin SaveLo:=CRC16Lo; SaveHi:=CRC16Hi; CRC16Hi:=CRC16Hi shr 1; CRC16Lo:=CRC16Lo shr 1; if (SaveHi and $01) = $01 then CRC16Lo:=CRC16Lo or $80; if (SaveLo and $01) = $01 then begin CRC16Hi:=CRC16Hi xor GHi; CRC16Lo:=CRC16Lo xor GLo; end; end; end; CRC16 := CRC16Lo * 256 CRC16Hi; end; end.wychen57 您好 請在 interface 區段,宣告即可(如同紅色的示範....) 如果只在 implementation ,就只有其下的 function 或是 member function 才能呼叫使用 另外一個方法 : 把 CRC16 function 放到 TfrmMain.FormCreate 之前 ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/03/05 08:49:14 |
wychen57
一般會員 發表:32 回覆:77 積分:21 註冊:2003-10-04 發送簡訊給我 |
引言: 再請問大大 procedure TfrmMain.FormCreate(Sender: TObject); var a: array[0..7] of Byte; b: Word; CRC_Lo: Byte; CRC_Hi: Byte; begin b:= crc16(a,6); CRC_Hi:= b div 256; CRC_Lo:= b mod 256; Edit1.Text:=IntToStr(CRC_Hi); Edit2.Text:=IntToStr(CRC_Lo); end; 以上這段程式有更好的寫法嗎,因為陣列A是來自MODBUS的查詢命令,但SPCOMM或MSCOMM的OUT只接受STRING格式資料說 function CRC16(CRCData: array of Byte; Datalen: Integer):Word; var CRC16Lo: Byte; CRC16Hi: Byte; SaveLo:Byte; SaveHi:Byte; GLo:Byte; GHi:Byte; i:Integer; Flag:Integer; begin CRC16Lo:=$ff; CRC16Hi:=$ff; GLo:=$01; GHi:=$a0; for i:=0 to Datalen -1 do begin CRC16Lo:=CRC16Lo xor CRCData[i]; for Flag :=0 to 7 do begin SaveLo:=CRC16Lo; SaveHi:=CRC16Hi; CRC16Hi:=CRC16Hi shr 1; CRC16Lo:=CRC16Lo shr 1; if (SaveHi and $01) = $01 then CRC16Lo:=CRC16Lo or $80; if (SaveLo and $01) = $01 then begin CRC16Hi:=CRC16Hi xor GHi; CRC16Lo:=CRC16Lo xor GLo; end; end; end; CRC16 := CRC16Lo * 256 CRC16Hi; end; |
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 再請問大大 procedure TfrmMain.FormCreate(Sender: TObject); var a: array[0..7] of Byte; b: Word; CRC_Lo: Byte; CRC_Hi: Byte; begin b:= crc16(a,6); CRC_Hi:= b div 256; CRC_Lo:= b mod 256; Edit1.Text:=IntToStr(CRC_Hi); Edit2.Text:=IntToStr(CRC_Lo); end; 以上這段程式有更好的寫法嗎,因為陣列A是來自MODBUS的查詢命令,但SPCOMM或MSCOMM的OUT只接受STRING格式資料說wychen57 您好 : 大大都是五星上將,我還差得遠... 這段 |
wychen57
一般會員 發表:32 回覆:77 積分:21 註冊:2003-10-04 發送簡訊給我 |
引言:引言: 再請問大大 procedure TfrmMain.FormCreate(Sender: TObject); var a: array[0..7] of Byte; b: Word; CRC_Lo: Byte; CRC_Hi: Byte; begin b:= crc16(a,6); CRC_Hi:= b div 256; CRC_Lo:= b mod 256; Edit1.Text:=IntToStr(CRC_Hi); Edit2.Text:=IntToStr(CRC_Lo); end; 以上這段程式有更好的寫法嗎,因為陣列A是來自MODBUS的查詢命令,但SPCOMM或MSCOMM的OUT只接受STRING格式資料說wychen57 您好 : 大大都是五星上將,我還差得遠... 這段 >>< face="Verdana, Arial, Helvetica"> 大大,您可能誤會我意思了,我是問說SPCOMM的OUT只能餵給它STRING型態資料,但小弟的CRC16算出來的是ARRAY型態資料,要如何餵給SPCOMM呀,盼請指導,感恩喔 |
wychen57
一般會員 發表:32 回覆:77 積分:21 註冊:2003-10-04 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: ] 再請問大大,如果我想把所有的>> >>< face="Verdana, Arial, Helvetica"> wychen57 您好 : File -> New -> Unit 將實作的程式碼寫在(貼在) implementation 區段,在 interface 區段加入 宣告(全域變數也宣告於此)即可...unit Unit1; interface uses SysUtils, Classes, Windows, FileCtrl, Dialogs; function Func1: string; implementation function Func1:string; begin end;main form 要使用 Unit1 ,只要在 main form 的 uses 宣告內加入 Unit1 至於 SPCOMM [Out] 只接受 String 的部分.. 您可以使用 IntToStr ,如果長度不符合.. 可以使用 copy 這個 function ,指定從 Index ,到指定長度的 copy 字串結果... 將 Array 資料轉成 string 的 pesudo codevar i:integer; Str : string; .. Str := ''; for i:=Low(CRC16Arr) to High(CRC16Arr) do Str := Str IntToStr(CRC16Arr[i]);至於資料結果是否正確,就要看您 CRC16 function 是否有邏輯上判斷的錯 誤了... PS. 對了,標題要改一下,要能表現問題的摘要... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- 發表人 - SouthWind 於 2004/03/11 16:09:16 |
wychen57
一般會員 發表:32 回覆:77 積分:21 註冊:2003-10-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |