NULL CHAR RS232 delphi
Moderátori: psichac, Moderátori
- balki
- Ultimate člen
- Príspevky: 1548
- Dátum registrácie: 09 Jan 2007, 00:00
- Bydlisko: Bratislava
NULL CHAR RS232 delphi
Caute
Nevie niekto skúsenejší ako poslať nulový znak (NULL CHAR) cez externú knižnicu rs232 v DELPHI?
Pomocou externe volanej funkcie dokážem odoslať alebo prijať jedine celé znaky alebo jeden znak, teda "string". Mám problém pretože potrebujem poslať \x00. Delphi mi vytvorí z hex string ale nevie urobiť z 00 niečo čo by sa na druhej strane prenieslo ako 00000000b. Skúšal som:
PChar = ^@; #0; ^@ a iné ale nechce to preniesť ani len previesť ten tvar do stringu.
Ďakuejm za každú pomoc, verím že je tu kopa skúsených programátorov
Nevie niekto skúsenejší ako poslať nulový znak (NULL CHAR) cez externú knižnicu rs232 v DELPHI?
Pomocou externe volanej funkcie dokážem odoslať alebo prijať jedine celé znaky alebo jeden znak, teda "string". Mám problém pretože potrebujem poslať \x00. Delphi mi vytvorí z hex string ale nevie urobiť z 00 niečo čo by sa na druhej strane prenieslo ako 00000000b. Skúšal som:
PChar = ^@; #0; ^@ a iné ale nechce to preniesť ani len previesť ten tvar do stringu.
Ďakuejm za každú pomoc, verím že je tu kopa skúsených programátorov
0
- petersno
- Ultimate člen
- Príspevky: 2774
- Dátum registrácie: 06 Aug 2011, 00:00
- Bydlisko: ba
- Vek: 63
Re: NULL CHAR RS232 delphi
ci nieje problem v tom, ze #0 { char(0) } sa vyuziva ako ukoncovaci znak retazca. tzn. ze ak das len #0 pokusas sa odoslat prazdny retazec, co je nezmysel. ak das "cokolvek " + #0, retazec bude iba "cokolvek". nemozes to odosielat ako string. nepoznam moznosti tej ext. kniznice, ale snad ma aj nejake ine
0
- djwiktor
- Ultimate člen
- Príspevky: 1624
- Dátum registrácie: 01 Júl 2010, 00:00
- Bydlisko: Šaľa
- Vek: 36
- Kontaktovať používateľa:
Re: NULL CHAR RS232 delphi
Problem je so samotnym PChar , kedze je to null terminated.
Co ma v rychlosti napada, nemozes to poslat ako serial.sendbytes(); ? Samozrejme pre 0x00 si najskor zisti hodnotu bytes cez GetBytes(0x00);
Ak ani to nepomoze, nezabudaj ze default serial port komunikuje ako ASCII - teda vsetko co je nad hodnotou 127 berie ako #63 tusim.
Preto budes musiet najskor zmenit encoding --> SerialPort1.Encoding = System.Text.Encoding.GetEncoding(28605)
Potom by to mohlo pretlacit aj 0x00.
Ak nie, skus este poslat na vystup 'NUL' .
Co ma v rychlosti napada, nemozes to poslat ako serial.sendbytes(); ? Samozrejme pre 0x00 si najskor zisti hodnotu bytes cez GetBytes(0x00);
Ak ani to nepomoze, nezabudaj ze default serial port komunikuje ako ASCII - teda vsetko co je nad hodnotou 127 berie ako #63 tusim.
Preto budes musiet najskor zmenit encoding --> SerialPort1.Encoding = System.Text.Encoding.GetEncoding(28605)
Potom by to mohlo pretlacit aj 0x00.
Ak nie, skus este poslat na vystup 'NUL' .
0
- balki
- Ultimate člen
- Príspevky: 1548
- Dátum registrácie: 09 Jan 2007, 00:00
- Bydlisko: Bratislava
Re: NULL CHAR RS232 delphi
petersno
Ono to nefunguje ani pri tom ked to je na konci ani medzi ani na začiatku.
Ja to samozrejme potrebujem aby to bolo na začiatku a niekde v strede.
Príklad správy čo potrebujem odoslať:
\x00\x14\x40\xAD\x7F\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09
WriteString('string');
djwiktor:
Nedá sa send.bytes pretože taká funkcia v tej knižnici ani nie je. Nedá sa mi z prijímaného zariadenia nič vyslať do PC. Ono dokáže len čítať a niečo nastavovať podľa toho. Jedine by som to skúsil preprogramovať to picko aby niečo ako 0x00 skúsilo odoslať.
V podstate sa mi nedá na tom sérovom porte nič zmeniť okrem základného nastavenia v systéme.
Jedno viem ale určite že to tá knižnica dokáže lebo ju využíva aj iná exe aplikácia a tá to bez problémov 0x00 odošle. Je ale kodena v c a zdroják samozrejme nemám.
Ono to nefunguje ani pri tom ked to je na konci ani medzi ani na začiatku.
Ja to samozrejme potrebujem aby to bolo na začiatku a niekde v strede.
Príklad správy čo potrebujem odoslať:
\x00\x14\x40\xAD\x7F\x09\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09
WriteString('string');
djwiktor:
Nedá sa send.bytes pretože taká funkcia v tej knižnici ani nie je. Nedá sa mi z prijímaného zariadenia nič vyslať do PC. Ono dokáže len čítať a niečo nastavovať podľa toho. Jedine by som to skúsil preprogramovať to picko aby niečo ako 0x00 skúsilo odoslať.
V podstate sa mi nedá na tom sérovom porte nič zmeniť okrem základného nastavenia v systéme.
Jedno viem ale určite že to tá knižnica dokáže lebo ju využíva aj iná exe aplikácia a tá to bez problémov 0x00 odošle. Je ale kodena v c a zdroják samozrejme nemám.
0
- djwiktor
- Ultimate člen
- Príspevky: 1624
- Dátum registrácie: 01 Júl 2010, 00:00
- Bydlisko: Šaľa
- Vek: 36
- Kontaktovať používateľa:
Re: NULL CHAR RS232 delphi
Takze ak som to teraz dobre pochopil, PIcko ti posiela hentaku spravu,, ako si napisal... takze ty v delphi potrebujes tu spravu celu prijat ?
Lebo z uvodneho zadania som si myslel, ze tu spravu posielas z pc tomu picku.
Skus to PIc prepalit aby miesto 0x00 skusilo poslat napriklad NUL, reps NIL string.
BTW, co je to za serial interface v tom delphi ? Je mi divne ze nevie pracovat s bytes.
Postni sem cast kodu, ktoru pouzivas na citanie portu.
Lebo z uvodneho zadania som si myslel, ze tu spravu posielas z pc tomu picku.
Skus to PIc prepalit aby miesto 0x00 skusilo poslat napriklad NUL, reps NIL string.
BTW, co je to za serial interface v tom delphi ? Je mi divne ze nevie pracovat s bytes.
Postni sem cast kodu, ktoru pouzivas na citanie portu.
0
- dxr
- Ultimate člen
- Príspevky: 3968
- Dátum registrácie: 05 Aug 2013, 20:21
- Bydlisko: V strede nicoho
- Kontaktovať používateľa:
Re: NULL CHAR RS232 delphi
Pouzi Synapse kniznicu tam urcite ide poslat nullchar ak ides 8bit mode
ak kniznica ktoru pouzivas pouziva nullchar ako terminator stringu tak urcite bude mat
aj funkciu ktora dovoli poslat nullchar cize pozri dokumentaciu
Ja to Synapse pouzivam sice nie Delphi ale Lazaruse ale api je rovnake len kompilator iny
ak kniznica ktoru pouzivas pouziva nullchar ako terminator stringu tak urcite bude mat
aj funkciu ktora dovoli poslat nullchar cize pozri dokumentaciu
Ja to Synapse pouzivam sice nie Delphi ale Lazaruse ale api je rovnake len kompilator iny
0
-
- Ultimate člen
- Príspevky: 2328
- Dátum registrácie: 25 Jún 2013, 21:06
- Bydlisko: Krajné
- Vek: 57
- Kontaktovať používateľa:
Re: NULL CHAR RS232 delphi
síce delphi som nikdy neprogramoval, ale google na všetko. Niečo čo sa na tvoje najviac podobá som v rýchlosti našiel toto:
http://www.delphi-central.com/serial.aspx
konkrétne to rieši WriteFile funkcia z windows API (ak teda ide o win aplikáciu). Ako parameter čo poslať tam môže byť pole bytov, miesto string. Do toho poľa si dáš čo chceš (aj hodnotu 0) a potom len zavoláš WriteFile.
http://www.delphi-central.com/serial.aspx
konkrétne to rieši WriteFile funkcia z windows API (ak teda ide o win aplikáciu). Ako parameter čo poslať tam môže byť pole bytov, miesto string. Do toho poľa si dáš čo chceš (aj hodnotu 0) a potom len zavoláš WriteFile.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
- balki
- Ultimate člen
- Príspevky: 1548
- Dátum registrácie: 09 Jan 2007, 00:00
- Bydlisko: Bratislava
Re: NULL CHAR RS232 delphi
Ja potrebujem ako som napísal poslať ten hexa tvar \x00......\x09 do picka on niečo vykoná. Ale už neodpovedá do PC nie je to potreba.
Akurát pozerám tú knižnicu a je tam aj niečo také ako write:
.
.
.
// *********************************************************************//
// Interface: IAsyncMessage
// Flags: (256) OleAutomation
// GUID: {DB8CBF06-D6D3-11D4-AA51-00A024EE30BD}
// *********************************************************************//
IAsyncMessage = interface(IBaseMessage)
['{DB8CBF06-D6D3-11D4-AA51-00A024EE30BD}']
function Read(count: Integer; out pJobId: Integer): HResult; stdcall;
function Write(var buffer: PSafeArray; count: Integer; out pJobId: Integer): HResult; stdcall;
function WriteString(const buffer: WideString; out pJobId: Integer): HResult; stdcall;
function Terminate(jobId: Integer): HResult; stdcall;
end;
.
.
Myslíte že by to cez to šlo? Ja nie som nejak dobrý programátor a typ PSafeArray som ešte nikdy nevidel.
Akurát pozerám tú knižnicu a je tam aj niečo také ako write:
.
.
.
// *********************************************************************//
// Interface: IAsyncMessage
// Flags: (256) OleAutomation
// GUID: {DB8CBF06-D6D3-11D4-AA51-00A024EE30BD}
// *********************************************************************//
IAsyncMessage = interface(IBaseMessage)
['{DB8CBF06-D6D3-11D4-AA51-00A024EE30BD}']
function Read(count: Integer; out pJobId: Integer): HResult; stdcall;
function Write(var buffer: PSafeArray; count: Integer; out pJobId: Integer): HResult; stdcall;
function WriteString(const buffer: WideString; out pJobId: Integer): HResult; stdcall;
function Terminate(jobId: Integer): HResult; stdcall;
end;
.
.
Myslíte že by to cez to šlo? Ja nie som nejak dobrý programátor a typ PSafeArray som ešte nikdy nevidel.
0
- balki
- Ultimate člen
- Príspevky: 1548
- Dátum registrácie: 09 Jan 2007, 00:00
- Bydlisko: Bratislava
Re: NULL CHAR RS232 delphi
peterple dik za odkaz určite to vyskúšam niekedy, ale ja potrebujem rozbehať tú knižnicu čo mám lebo s ňou obsluhujem aj zariadenia ktoré by som sotva dokázal obslúžiť ak by som si to mal celé nakodiť.
0
- dxr
- Ultimate člen
- Príspevky: 3968
- Dátum registrácie: 05 Aug 2013, 20:21
- Bydlisko: V strede nicoho
- Kontaktovať používateľa:
Re: NULL CHAR RS232 delphi
Co keby si hodil kniznicu nech sa clovek moze pozret ako spracovava data a kam to posiela?
aspon nazov tej kniznice domovsku stranku a podobne
aspon nazov tej kniznice domovsku stranku a podobne
0
- balki
- Ultimate člen
- Príspevky: 1548
- Dátum registrácie: 09 Jan 2007, 00:00
- Bydlisko: Bratislava
Re: NULL CHAR RS232 delphi
Jedná sa o VISA knižnicu od firmy Agilent. Nič som v nej neupravoval je v pôvodnej podobe.
Je tam toho dosť husto popísané, ale priznám sa nie som programátor ktorý by tomu hned pochopil, skúste sa teda vy na to mrknúť
Je tam toho dosť husto popísané, ale priznám sa nie som programátor ktorý by tomu hned pochopil, skúste sa teda vy na to mrknúť
- Prílohy
-
- VisaComLib_TLB.zip
- Knižnica do delphi pre prístup na ASRL, BPIB, a pod.
- (7.81 KiB) 43 stiahnutí
0
- djwiktor
- Ultimate člen
- Príspevky: 1624
- Dátum registrácie: 01 Júl 2010, 00:00
- Bydlisko: Šaľa
- Vek: 36
- Kontaktovať používateľa:
Re: NULL CHAR RS232 delphi
PSafeArray som sice este nepouzival, ale co pozeram jeho definicie, viacmenej sa s nim pracuje ako s beznym array, s priamou podporou napriklad floating point.
Skus ho normalne nadefinovat cez premennu - napriklad si daj buffer ako array, a do neho potom zapis premenne
napriklad takto :
var
Data: Variant;
SafeArray: PSafeArray;
begin
Data := VarArrayCreate([0, 1, 0, 2], VT_VARIANT);
Data[0,0] := 'x00';
Data[0,1] := 'x09'';
Data[0,2] := 'x01';
Data[1,0] := 'x00';
Data[1,1] := 'x00';
Data[1,2] := 'x04';
SafeArray := PSafeArray(TVarData(Data).VArray);
end;
Tym by si mal mat v SafeArray ulozene vsetky hodnoty - a tie skus poslat pomocou prikazu Write(SafeArray,.... ); inak uz fakt neviem.
Skus ho normalne nadefinovat cez premennu - napriklad si daj buffer ako array, a do neho potom zapis premenne
napriklad takto :
var
Data: Variant;
SafeArray: PSafeArray;
begin
Data := VarArrayCreate([0, 1, 0, 2], VT_VARIANT);
Data[0,0] := 'x00';
Data[0,1] := 'x09'';
Data[0,2] := 'x01';
Data[1,0] := 'x00';
Data[1,1] := 'x00';
Data[1,2] := 'x04';
SafeArray := PSafeArray(TVarData(Data).VArray);
end;
Tym by si mal mat v SafeArray ulozene vsetky hodnoty - a tie skus poslat pomocou prikazu Write(SafeArray,.... ); inak uz fakt neviem.
0
- balki
- Ultimate člen
- Príspevky: 1548
- Dátum registrácie: 09 Jan 2007, 00:00
- Bydlisko: Bratislava
Re: NULL CHAR RS232 delphi
Dik skúsim to tak urobiť a dám vedieť ako to pracuje ale až zajtra v práci nakoľko tu neám potrebný hardvér
0
- dxr
- Ultimate člen
- Príspevky: 3968
- Dátum registrácie: 05 Aug 2013, 20:21
- Bydlisko: V strede nicoho
- Kontaktovať používateľa:
Re: NULL CHAR RS232 delphi
Kód: Vybrať všetko
function Get_TerminationCharacter(out pVal: Byte): HResult; stdcall;
function Set_TerminationCharacter(pVal: Byte): HResult; stdcall;
0
- balki
- Ultimate člen
- Príspevky: 1548
- Dátum registrácie: 09 Jan 2007, 00:00
- Bydlisko: Bratislava
Re: NULL CHAR RS232 delphi
Priznám sa neštudoval som celú tú knižnicu (nie som programátor len delphi personal ) a netuším ako by som to mal zapísať.
0
- petersno
- Ultimate člen
- Príspevky: 2774
- Dátum registrácie: 06 Aug 2011, 00:00
- Bydlisko: ba
- Vek: 63
Re: NULL CHAR RS232 delphi
prave som chcel navrhnut pouzit tu Write funkciu a vidim, ze uz ma djwiktor predbehol
0
- dxr
- Ultimate člen
- Príspevky: 3968
- Dátum registrácie: 05 Aug 2013, 20:21
- Bydlisko: V strede nicoho
- Kontaktovať používateľa:
Re: NULL CHAR RS232 delphi
ze by nejakobalki napísal:Priznám sa neštudoval som celú tú knižnicu (nie som programátor len delphi personal ) a netuším ako by som to mal zapísať.
Kód: Vybrať všetko
var
terminator : char;
text : string
begin
//
//
Get_TerminationCharacter(terminator);
Str(terminator, text);
memo1.lines.append('Znak je '+text); // ak mas na Tform1 nejaku memo1 componentu
// alebo showmessage('Znak je '+text);
// alebo hocico ine na vystup
end
0
- balki
- Ultimate člen
- Príspevky: 1548
- Dátum registrácie: 09 Jan 2007, 00:00
- Bydlisko: Bratislava
Re: NULL CHAR RS232 delphi
djwiktor
ten write(..) som skúsil ale nič mi to neodosiela. použiol som tento zápis:
dxr
skúsil som aj prevod pomocou STR(); ale do tej funkcie musím dať číslo a ja to deklarované ako char.
a dalej funkcia Get_TerminationCharacter píše, že má nejaké nesprávne deklarované alebo použité typy.
ten write(..) som skúsil ale nič mi to neodosiela. použiol som tento zápis:
Kód: Vybrať všetko
retCount:=6;
Data := VarArrayCreate([0, 1, 0, 2], VT_VARIANT);
Data[0,0] := '1';
Data[0,1] := '2';
Data[0,2] := '3';
Data[1,0] := '4';
Data[1,1] := '5';
Data[1,2] := '6';
SafeArray := PSafeArray(TVarData(Data).VArray);
io.Write(SafeArray,retCount,retCount);
dxr
skúsil som aj prevod pomocou STR(); ale do tej funkcie musím dať číslo a ja to deklarované ako char.
a dalej funkcia Get_TerminationCharacter píše, že má nejaké nesprávne deklarované alebo použité typy.
Kód: Vybrať všetko
terminator:=#0;
ib.Get_TerminationCharacter(terminator);
Str(terminator, text);
0
- dxr
- Ultimate člen
- Príspevky: 3968
- Dátum registrácie: 05 Aug 2013, 20:21
- Bydlisko: V strede nicoho
- Kontaktovať používateľa:
Re: NULL CHAR RS232 delphi
tak to pretypuj alebo proste to co ti vrati GetTerminator praskni to byte alebo integeru no ...
Tu mas ako sa pracuje so STR funkciou
Kód: Vybrať všetko
var
terminator : byte ;
abystrnepindal : integer;
text : string[20];
begin
abystrnepindal := 0;
terminator := #65 ; // dame si tam Acko nech vieme ci ho prepisalo :)
ib.GetTerminator(terminator); // ib. je co objekt / instancia triedy? asi ano
// toto by ti malo vratit nie nastavit terminator chceme vediet aky je ci je #0
abystrnepindal := terminator; // nazvi si to ako chces :)
str(abystrnepidal,text);
// vypis to niekde na vystup messagedialog alebo ina GUI komponenta
...
ShowMessage('GetTerminatorCharacter nam vratil : '+text);
end;
0
Naposledy upravil/-a dxr v 12 Feb 2014, 13:40, upravené celkom 4 krát.
- petersno
- Ultimate člen
- Príspevky: 2774
- Dátum registrácie: 06 Aug 2011, 00:00
- Bydlisko: ba
- Vek: 63
Re: NULL CHAR RS232 delphi
Err : HResult;
Err := io.Write(SafeArray,retCount,retCount);
nech vies navratovu hodnotu. mas ten port vobec otvoreny ?
Err := io.Write(SafeArray,retCount,retCount);
nech vies navratovu hodnotu. mas ten port vobec otvoreny ?
0