NULL CHAR RS232 delphi

C,C++,C#

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
dxr
Ultimate člen
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

Príspevok od používateľa dxr » 12 Feb 2014, 13:52

Aha divaj malo by to ist priamo ak si otvoris specialny device napr COM1 COM2 COM5 a tak dalej

Kód: Vybrať všetko

procedure  SendChars(myport: string[20],sToSend:string);
begin
hCommFile := CreateFile(PChar(myport;),
                          GENERIC_WRITE,
                          0,
                          nil,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          0);
WriteFile(hCommFile,
            PChar(sToSend)^,
            Length(sToSend), { tu by sa programator mal zamysliet}
            NumberWritten,
            nil);                      
CloseHandle(hCommFile);               
end;

Akurat si oprav ten Length(sToSend), na nieco ako parameter funkcie lebo ty musis mat
inak detekovanu dlzku retazca SendChars('COM1',data,10); a zmenis Length(sToSend) na kolko :)

Mne nieco podobne bezi v lazarovi :) ozaj a nepises program Remimu do sutaze :roll:
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Používateľov profilový obrázok
balki
Ultimate člen
Ultimate člen
Príspevky: 1553
Dátum registrácie: 09 Jan 2007, 00:00
Bydlisko: Bratislava

Re: NULL CHAR RS232 delphi

Príspevok od používateľa balki » 12 Feb 2014, 14:19

dxr
už to prekladá a nemá problém s typom integer lebo 0 je ten typ. Ale preloží to že 0=44 z ASCII. Ja však potrebujem preložiť
x00 na NULL znak.
A komunikácia cez serial port je v poriadku iné znaky to odošle vidím to na tektronixe.
0

Používateľov profilový obrázok
balki
Ultimate člen
Ultimate člen
Príspevky: 1553
Dátum registrácie: 09 Jan 2007, 00:00
Bydlisko: Bratislava

Re: NULL CHAR RS232 delphi

Príspevok od používateľa balki » 12 Feb 2014, 14:21

Ešte skúsim ten druhý zápis čo si poslal a dám vedieť.

Kto je Remi? nepoznám takého človeka...
0

wwlado

Re: NULL CHAR RS232 delphi

Príspevok od používateľa wwlado » 12 Feb 2014, 15:14

Som sice Pascalista, ale naposledy som robil este s Delphi7 (aj ked Delphi6 sa mi videla lepsia). Teraz som na FPC alebo Lazarus (to je podobne ako Delphi, len je zadarmo a dokaze riesit nie-len prostredia Windows, ale aj Linux (gnome, Kde, QT,..)). Ma svoju kniznicu serial. Osobne ju pouzivam a nula v nej pekne funguje.

Vynatok z konzoly pre ovladanie auticka.

Kód: Vybrať všetko

uses Serial, Crt, Sysutils;

Const USB0 = '/dev/ttyUSB0'; // To je adresa v Linuxe na seriovy port cez USB. v tvojom pripade napr. COM1

Var 
    sDev  : String;
    sPort : TserialHandle;
    sPar  : TParityType;
    sSpeed: LongInt;
    sBit  : Integer;
    sStop : Integer; 
    Buf   : Array [0..255] of char;
    BufP  : Integer;

// Hlavny program
Begin		
 Echo:=True;	
	
 // Hlavicka ------------------------------------------------------- 1.
 ClrScr;
 WriteLn('wConsole Napisal: Vladimir Visnovsky (c)2013 Lipany');

 // Hladanie portu ------------------------------------------------- 2.
 sDev:='/dev/ttyS1';
 If FileExists(USB0) then
  Begin
   sDev:=USB0;
  End;
 // Nastavenia
 sPar  :=NoneParity;
 sSpeed:=4800;
 sBit  :=8;
 sStop :=1;
 // Nunulovanie bufera
 buf:='';
 // Vypis nastaveni
 sInfo;
 
 // Pripojenie ----------------------------------------------------- 3.
    sPort:=SerOpen(sDev);
    if sPort=0 Then
     Begin
      // chyba
      WriteLn(' - Neda sa pripojit na port '+sDev);
     End Else Begin
      WriteLn(' - Port '+sDev+' pripojeny, nastavujem zariadenie.');
      SerSetParams ( sPort, sSpeed, sBit, sPar, sStop, []);
      WriteLn(' - Handle '+IntToHex(sPort, 8)+'h');
     End; 
     
 // Cyklus --------------------------------------------------------- 4.
 WriteLn;
 Repeat
  
  // Slucka nacitania Portu do stisknutia klavesy ------------------ 5.
  Repeat
   BufP:=SerRead(sPort,Buf,256);
   If BufP>0 Then
    Begin
     If (Not((BufP=1) And (Buf[0]=#1)) or Echo) Then 
      Begin 
       WriteLn('Prijate: '+IntTostr(BufP)+'Byte.');
       BufWrite;
      End; 
    End;
  Until KeyPressed;
:
; Odoslanie
          Buf[0]:=#2;
          Buf[1]:=#5;
          BufP:=2;
          SerWrite(sPort, Buf, BufP);
          SerFlush(sPort);
: 
atd....     
Prílohy
serial.txt
Kniznica SERIAL z FPC
(5.4 KiB) 63 stiahnutí

Používateľov profilový obrázok
dxr
Ultimate člen
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

Príspevok od používateľa dxr » 12 Feb 2014, 18:46

x00 na NULL znak.
Toto je co :)? Cize nula (#0) (znak) $0 (hexa)
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Používateľov profilový obrázok
djwiktor
Ultimate člen
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

Príspevok od používateľa djwiktor » 12 Feb 2014, 19:28

prepac :) pomylil som sa :) som mal na mysli, aby miesto 0x00 posielal retazec NULL ( pripadne NIL, NUL, ako mu to zozerie) - a uz by v aplikacii ci uz pc alebo PIC, iba prijaty NUL retazec prehodil v premennej na 0x00. Viem ze je to navyse riadok kodu, a kusok v pameti, ale ak to inak nepojde, toto bude riesenie.
0
Tlacim na 3D tlaciarni Felix 3.0 dual
Stormchasers.sk

wwlado

Re: NULL CHAR RS232 delphi

Príspevok od používateľa wwlado » 12 Feb 2014, 20:39

Nechces si spravit racej bufer, ako array of char. A ten odoslat? Tak by ti malo poslat aj 0. Stale sa tocite oko toho isteho.

Používateľov profilový obrázok
dxr
Ultimate člen
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

Príspevok od používateľa dxr » 12 Feb 2014, 20:52

Aj tak niesom mudrejsi sprav to tak ako sme napisali proste ides pole znakov
a ides pokial niesi na konci pola alebo itterator je rovny dlzke pola ktoru mu das
lebo ak to nechas na funkcie ktore su Ascii-Z si keli :) tak to totiz nepojde
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Používateľov profilový obrázok
petersno
Ultimate člen
Ultimate člen
Príspevky: 2774
Dátum registrácie: 06 Aug 2011, 00:00
Bydlisko: ba
Vek: 63

Re: NULL CHAR RS232 delphi

Príspevok od používateľa petersno » 12 Feb 2014, 22:13

balki ako co citas prichadzjucu komunikaciu ?
ak si upravil odosielanie z PC z posielania retazca na posielanie pola znakov a neupravil si program v MCU, tak je tvoje snazenie na dve veci :wink: tzn. ze ak na strane MCU stale prijimas znaky ako char a ladujes nimi string, potom prva nula tento string ukoncuje bez ohladu nato, kolko dalsich znakov sa tam budes snazit pridat.
snad som to napisal zrozumitelne
0

Používateľov profilový obrázok
dxr
Ultimate člen
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

Príspevok od používateľa dxr » 12 Feb 2014, 22:18

ja to iba doplnim ze ak laduje pchar lebo ak laduje string - v pascale/delphi tak to ukoncuje hodnota v string[0]
string v pascale nieje ASCII-Z je to poleznakov ktore ma velkost v nultom prvku a max dlzka je 255znakov

a mam pocit ze sa to da nejako direktivou upravit ze ci je to old-pascal string alebo pchar
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

wwlado

Re: NULL CHAR RS232 delphi

Príspevok od používateľa wwlado » 12 Feb 2014, 23:03

Zo stringom by sa to dalo tak:

Kód: Vybrať všetko

var S : String
BufferPointer :=^S+1;
BufferLength  :=Ord(S[0]);
Ale stale nechapem, preco nepouzivas Array, alebo blok pamate, ale PChar. :roll:
Na priklade co ti DXR pisal, zmenis ulozisko dat na:

Kód: Vybrať všetko

WriteFile(hCommFile,
            Buffer,       { alebo BufferPointer^}
            BufferLength, { <- Ak to je  pocet odoslanych bytov }
            NumberWritten,
            nil);        
Su dva sposoby, ako si alokujes pamat. Bud napevno, alebo pocas programu:
Na pevno:

Kód: Vybrať všetko

Var: Buffer       : Array [0..1023] of char; {mas 1K pamate k dispozicii}
     BufferLength : Word; { alebo Integer. Tu je premena na kolko je je nacitany buffer}
Pocas programu:

Kód: Vybrať všetko

Var:
     BufferPointer : ^Buffer; {adresa nasho buffra}
     Buffer        : Array of char;
     BufferLength  : Word; { alebo Integer. Tu je premena na kolko je je nacitany buffer}

; Alokovanie pamate pocas jazdy
GetMem (BufferPointer, 1024); {alebo BufferPointer:=GetMem (1024) pre 1Kbyte}
if BufferPointer=0 Then WriteLn('Volna pamat uz nieje k dispozicii');

; Uvolnenie pamate
FreeMem (BufferPointer); {alebo Dispose (BufferPointer) }
Vlkadane znaku do Bufra a nulovanie:

Kód: Vybrať všetko

; Vlozit Byte
Procedure PushBuf (B : Byte); Overload;
 Begin
  Buffer [BufferLength] := Chr (B); {pre prvu alternativu}
  BufferPointer^[BufferLength] := Chr (B); {pre druhu alternanivu}
  Inc (BufferLength);
 End;

; Vlozit Znak
Procedure PushBuf (Ch : Char); Overload;
 Begin
  Buffer [BufferLength] := Ch; {pre prvu alternativu}
  BufferPointer^[BufferLength] := Ch; {pre druhu alternanivu}
  Inc (BufferLength);
 End;

; Vynulovanie
Procedure ClrBuf;
 Begin
  BufferLength:=0;
 End;
Na konci procedury je OVERLOAD; co znamena, ze bude este jedna procedura s tym istym menom, len iny parameter. Pascal a Delphi pouziva metodu presuvu parametrov v procedurach pomocov registrov. Windows v knizniciach pouziva Zasobnik (Stack). Preto, ked vola Delphi nejaku windowsacku kniznicu, musi byt metoda zmenena z registrovej na zasobnikovu. Preto sa pise za procedurov StdCall. Su aj ine metody volania procedury, ale to niekedy inokedy..

Musis mat nacitanu kniznicu SYSTEM. Co predpokladam, ze uz je tam automaticky. Podrobnosti najdes napr. tu:
http://docs.embarcadero.com/products/ra ... etMem.html

Používateľov profilový obrázok
balki
Ultimate člen
Ultimate člen
Príspevky: 1553
Dátum registrácie: 09 Jan 2007, 00:00
Bydlisko: Bratislava

Re: NULL CHAR RS232 delphi

Príspevok od používateľa balki » 13 Feb 2014, 08:27

Skúšal som skoro všetko ale nulový znak #0 mi proste neprenesie, ak ho použijem tak za ním sa už všetko ukončí.
V MCu problém nie je nakoľko pracuje čiste bitovo a hľadá začiatočnú dobežnú hranu UARTU a odtiaľ počíta bity.
Tzn. ak napočíta 8 núl je to pre neho $0. Lenže akokoľvek som sa pokúšal odoslať char #0 procedúra io.WriteString('Ş'+#0+'Ş', retCount); ten znak berie za ukončovací a nič za ním neprejde.

Nič na tom už asi nezmením, tú knižnicu budem i naďalej využívať nakoľko pre ASCII zanky funguje pekne. Budem musieť zmeniť program v MCU aby sa neriadil čiste bitovo ale bral to ako string tzn.: 0 bude brať ako "0110000" alebo 30 hex.

Problém je že ten prevod bude trvať dosť dlho pretože mcu to bude musieť konvertovať. Tomu som sa cchel vyhnúť ale asi nemám na výber nakoľko hex tvar 0x00 cez tú knižnicu neodošlem.

Ďakujem i tak za mnohé užitočné rady, vidno že máte toho "odkódené" viac než ja. :wink:
0
Naposledy upravil/-a balki v 13 Feb 2014, 08:28, upravené celkom 1 krát.

Používateľov profilový obrázok
dxr
Ultimate člen
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

Príspevok od používateľa dxr » 13 Feb 2014, 08:28

Pokial viem pouziva sa opacne poradie parametrov na stacku ako C-kompilator ;)
a preto je nutne davat ten keyword. A ja som mu nechal trosku kreativity nech to spravi cez to pole
obcas som hnusny nepisem just cely funkcny kod nech sa clovek trosicku posnazi a nieco nauci :)

Nechcel som ist tak do hlbky ale ked si to uz otvoril a aj peter to uz spominal tam je hlavny problem
to ze nuti pchar funkcie aby fungovali tak ako chce on pritom oni maju natvrdo #0 ako konec pola
a preto musi pouzivat inu metodu napriklad for alebo iny cyklus kde on bude vediet pokial su data.
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Používateľov profilový obrázok
dxr
Ultimate člen
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

Príspevok od používateľa dxr » 13 Feb 2014, 08:31

tak proste prejdi na "WriteFile" a zabudni na tu kniznicu mozno je napisana tak ze jednoducho
nulty znak neprenesies musel by si ho maskovat a to vyzaduje zmenu MCU programu
aj preto radi pouzivame HEXa znaky v ktore sice zvysia pocet zaslanych znakov ale posles hocico :)
a este sa to aj dobre parsuje :)

som komusi robil nieco podobne :)
Obrázok
0
Naposledy upravil/-a dxr v 13 Feb 2014, 08:35, upravené celkom 1 krát.
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Používateľov profilový obrázok
balki
Ultimate člen
Ultimate člen
Príspevky: 1553
Dátum registrácie: 09 Jan 2007, 00:00
Bydlisko: Bratislava

Re: NULL CHAR RS232 delphi

Príspevok od používateľa balki » 13 Feb 2014, 08:34

dxr
na tú knižnici nemôžem zabudnúť pretože cez ňu okrem tohto obsluhujem mnohé zariadenia ktoré by som sotva dokázal tak jednoducho ovládať. Myslím tým osciloskop cez GPIB, LAN, a pod. :)
0

Používateľov profilový obrázok
dxr
Ultimate člen
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

Príspevok od používateľa dxr » 13 Feb 2014, 08:39

Ok tak vyuzi vlastnosti OOP a overridni metodu (ak je virutalna) tej triedy a to sa robi tak
ze spravis novu ktora dedi po VISAcom a nahradis ten write_string.
Dalsia moznost je ze pridas novu metodu a ta bude pouzivat inu funkciu WINapi.
Priklad : ib.balkiSeria('com1',data,16); :wink:

Neviem ci chapes - ale ak kniznica nepocitala s null-charom a pouziva strlen/length ktore berie #0 ako END
ty stym nic nespravis pokial to neprepises alebo neprestanes pouzivat (minimalne tu seriovu cast)

To je ako keby si chcel v C-ecku od strlen() aby ti vratil dlzku a mas pole plne NULL-charov proste
aj ked sa obesis to nepojde s povodnou libc funkciou treba na to pouzit nieco ine vlastne.

Skus aspon tu funkciu co som ti dal dopis si to tak aby posielal dlzku ktoru ti definujes a posli ten paket
a das nam vediet ci ta moja funkcia poslala #0 a da sa pokracovat dalej ale pokial neposle tak je dalsi problem :)

Este jedna moznost hladaj v kniznici funkciu posli 1 znak a paket posli takto
sendchar('A';sendchar(#0);sendchar(#0);sendchar('Z'; :)
0
Naposledy upravil/-a dxr v 13 Feb 2014, 08:52, upravené celkom 1 krát.
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

wwlado

Re: NULL CHAR RS232 delphi

Príspevok od používateľa wwlado » 13 Feb 2014, 08:50

Preco WriteString? Ved retazec sa koncinulov. Skus to tak:

Kód: Vybrať všetko

Var Sended : Integer;
:
Write(Buffer, BufferCount, Sended);

Používateľov profilový obrázok
dxr
Ultimate člen
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

Príspevok od používateľa dxr » 13 Feb 2014, 09:10

som rezignoval dokopat ho je tam tazke ale uz peter na predoslej stranke to napisal

Kód: Vybrať všetko

var
data: string;
retcount: integer; // word byte whatever

data := #80+#81+#65+#0+#67+#0+#70;
ib.write(data,7,reCount);
napis co si videl na seriovom porte
0
Mahátma Ghándí: „Nejdřív tě budou ignorovat. Pak se ti budou smát. Pak proti tobě budou bojovat. Potom zvítězíš.“
čo viac dodať som taký a možeš to skúsiť vyhrať aj tak to vzdáš.. Obrázok
Arduino is popular becouse allow complex task with minimum investment

Používateľov profilový obrázok
balki
Ultimate člen
Ultimate člen
Príspevky: 1553
Dátum registrácie: 09 Jan 2007, 00:00
Bydlisko: Bratislava

Re: NULL CHAR RS232 delphi

Príspevok od používateľa balki » 13 Feb 2014, 10:36

dxr

Kód: Vybrať všetko

 retCount:=7;
data := #80+#81+#65+#0+#67+#0+#70;
io.WriteString(data,retCount);
toto som videl na osc:
Prílohy
data.png
0
Naposledy upravil/-a balki v 13 Feb 2014, 21:30, upravené celkom 1 krát.

Používateľov profilový obrázok
balki
Ultimate člen
Ultimate člen
Príspevky: 1553
Dátum registrácie: 09 Jan 2007, 00:00
Bydlisko: Bratislava

Re: NULL CHAR RS232 delphi

Príspevok od používateľa balki » 13 Feb 2014, 10:39

a toto je na výstupe UART:

Kód: Vybrať všetko

data := #80+#0+#67;
Doplním len že vertikálne kurzory označujú začiatok a koniec 8 bitových dát.
Prílohy
DSC02379.JPG
0

Napísať odpoveď