Autor Téma: Komunikace (prosíím pomoct)  (Přečteno 4950 krát)

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Komunikace (prosíím pomoct)
« kdy: 30-12-2014, 01:17:34 »
Přeji hezký den.

Už několikátý den si hraji s komunikací přes sériový port.
Program mám udělán v Delphi 7 a chtěl bych ho převést do Delphi XE3 .
V Delphi 7 jsem používal komponentu AsyncFree104  ,
kterou se mi už nepodařilo dostat do XE3 .

Do XE3 se mi podařilo nacpat komponentu comport411f  (ComPort Library version 4.11 )
Bohužel načítání komunikace nefunguje jak by mělo.

Správná funkce je při odesílání :     Ahodnota  - funguje jak má
                              Při načítání :     BhodnotaXhodnota     nebo       BhodnotaThodnotaXhodnota
viz. obrázky dole ...

Nevěděl byste někdo jak tento problém vyřeším??
Hrozně moc mi na tom záleží !!!

za jakoukoli radu mockrát děkuji ( klidně i jako zakázku (zaplatím ))



Původní komunikace Delphi 7
Kód: Delphi [Vybrat]
  1. procedure TForm1.AfComPort1DataRecived(Sender: TObject; Count: Integer);
  2. var
  3. s, data, text, ID_zar, ID : string ;
  4. begin
  5. sleep (100);
  6.  
  7. try
  8.  
  9. s:=AfComPort1.ReadString; //ХtenМ textu z portu
  10. If s<>'' then begin
  11.                 data := s;
  12.                 s:=' ';
  13.                 end
  14.                 else
  15.                 begin
  16.                 data :=' ';
  17.                 s:=' ';
  18.                 exit;
  19.                 end;
  20.  
  21.                  
  22. if data[1] = 'B' then begin
  23. ...
  24. if  data[3] = 'T' then begin
  25. ...
  26. if  data[3] = 'X'  then Begin
  27. ...
  28. ...
  29.  
  30.  


Nová komunikace Delphi XE3
Kód: Delphi [Vybrat]
  1. procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
  2. var
  3. s, data, text, ID_zar, ID : string ;
  4.  
  5. begin
  6. sleep (100);
  7.  
  8. try
  9.  
  10. ComPort.ReadUnicodeString(S, Count);
  11.  
  12. If s <> '' then begin
  13.                   data := s;
  14.                   s := ' ';
  15.                 end
  16.                 else
  17.                 begin
  18.                   data := ' ';
  19.                   s := ' ';
  20.                   exit;
  21.                 end;
  22.  
  23.  
  24. if data[1] = 'B' then begin
  25. ...
  26. ...
  27.  
  28.  



děkuji

Milan

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Komunikace (prosíím pomoct)
« Odpověď #1 kdy: 30-12-2014, 13:39:45 »
Dej sem jak puvodni, tak novou verzi komponenty. Nebo se na to vykaslej a pouzij treba synaser.
Embarcadero MVP - Czech republic

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Komunikace (prosíím pomoct)
« Odpověď #2 kdy: 30-12-2014, 14:22:56 »
Nová komponenta :

http://temp.zaru.cz/comport411f.zip

Stará komponenta :

http://temp.zaru.cz/asyncfree104.zip

PS: komponenta synaser mi házela aspoň 4 chyby u XE3
« Poslední změna: 30-12-2014, 14:40:45 od AlienStar »

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Komunikace (prosíím pomoct)
« Odpověď #3 kdy: 30-12-2014, 16:27:31 »
No jen tak letem, zkus misto ReadUnicodeString pouzit ReadStr. V tom prvnim autor totiz dela ruzne konverze.

Ad SynaSer - zkus http://sourceforge.net/p/synalist/code/HEAD/tree/trunk/synaser.pas , ta funguje pod XE dobre.
Embarcadero MVP - Czech republic

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Komunikace (prosíím pomoct)
« Odpověď #4 kdy: 30-12-2014, 16:38:15 »
To ReadStr jsem zkoušel, ale výsledek byl úplně stejný.

Další varianta by byla převést komponentu asyncfree104 do XE3 , tam to hlásí asi 3 chyby ...

Synaser mi hlásí chyby :

Kód: Delphi [Vybrat]
  1. if Value = AnsiUppercase(MyMonthNames[n, Index]) then
[dcc32 Warning] synautil.pas(529): W1057 Implicit string cast from 'AnsiString' to 'string'

Kód: Delphi [Vybrat]
  1.   Value := AnsiUppercase(Value);
[dcc32 Warning] synautil.pas(537): W1058 Implicit string cast with potential data loss from 'string' to 'AnsiString'

Kód: Delphi [Vybrat]
  1.   Value := ReplaceString(Value, ':', TimeSeparator);
[dcc32 Error] synautil.pas(555): E2003 Undeclared identifier: 'TimeSeparator'

Kód: Delphi [Vybrat]
  1.     CustomMonthNames[n] := ShortMonthNames[n];
[dcc32 Error] synautil.pas(1766): E2003 Undeclared identifier: 'ShortMonthNames'

Kód: Delphi [Vybrat]
  1.     MyMonthNames[0, n] := ShortMonthNames[n];
[dcc32 Error] synautil.pas(1767): E2003 Undeclared identifier: 'ShortMonthNames'

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Komunikace (prosíím pomoct)
« Odpověď #5 kdy: 30-12-2014, 16:47:12 »
ještě dodatek:

stará komponenta mi háže chyby:

Kód: Delphi [Vybrat]
  1.    
  2.   FXOnChar := FDCB.XonChar;
  3.   FXOffChar := FDCB.XoffChar;
  4.  
[dcc32 Error] AfComPort.pas(655): E2010 Incompatible types: 'Char' and 'AnsiChar'
[dcc32 Error] AfComPort.pas(656): E2010 Incompatible types: 'Char' and 'AnsiChar'


Kód: Delphi [Vybrat]
  1. unit AfRegister;
  2.  
  3. interface
  4.  
  5. {$I PVDEFINE.INC}
  6.  
  7. uses
  8.   Classes, AfComPort, AfDataDispatcher, AfDataTerminal, AfPortControls;
  9.  
  10. procedure Register;
  11.  
  12. implementation
  13.  
  14. uses
  15.   {$IFDEF PV_D6UP}
  16.   DesignIntf, DesignEditors;
  17.   {$ELSE}
  18.   DsgnIntf;
  19.   {$ENDIF}

[dcc32 Fatal Error] AfRegister.pas(61): F1026 File not found: 'DsgnIntf.dcu'

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 957
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:Komunikace (prosíím pomoct)
« Odpověď #6 kdy: 30-12-2014, 19:08:02 »
Zkusil jsem to nastřelit (ale teď mám po ruce jen XE5). Nutno vyzkoušet (vše šlo přeložit, na optimalizace jsem neměl čas).

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Komunikace (prosíím pomoct)
« Odpověď #7 kdy: 30-12-2014, 19:55:18 »
JaroB   super ,, dostal jsem to tam ,, mockrát ti děkuji za ochotu pomoct.

Jen je v tom zase nějaký háček.

Zobrazuje to nějaké divné znaky,, jak kdyby bylo špatný kódování ?? nevím


Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2329
  • Karma: 102
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:Komunikace (prosíím pomoct)
« Odpověď #8 kdy: 30-12-2014, 20:37:20 »
Synaser mi hlásí chyby :

Kód: Delphi [Vybrat]
  1.   Value := ReplaceString(Value, ':', TimeSeparator);
[dcc32 Error] synautil.pas(555): E2003 Undeclared identifier: 'TimeSeparator'

Kód: Delphi [Vybrat]
  1.     CustomMonthNames[n] := ShortMonthNames[n];
[dcc32 Error] synautil.pas(1766): E2003 Undeclared identifier: 'ShortMonthNames'

Kód: Delphi [Vybrat]
  1.     MyMonthNames[0, n] := ShortMonthNames[n];
[dcc32 Error] synautil.pas(1767): E2003 Undeclared identifier: 'ShortMonthNames'

Warningy ignoruj a pred ty ostatni napis FormatSettings.
tj. FormatSettings.ShortMonthNames a FormatSettings.TimeSeparator
Embarcadero MVP - Czech republic

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Komunikace (prosíím pomoct)
« Odpověď #9 kdy: 30-12-2014, 21:05:48 »
děkuji za info.

jenže přes synaser neexistuje moc návodů, google toho moc nenašel
jak bych v něm přijal z COM portu data? (odesílání bych zvládnul)

PS: ještě jedna chyba se tam vyskytla:
Kód: Delphi [Vybrat]
  1.         x := PosCRLF(s, t);
[dcc32 Error] synaser.pas(1289): E2033 Types of actual and formal var parameters must be identical

------------------------------------------------------------------------------------------

JaroB pro mě udělal, za což mu jsem hrozně vděčný, předělávku staré komponenty pro XE3

jen se zobrazuje divně text , a to posílání textu na COM port taky nefunguje jak by mělo :-(

proč je text takto divný a jak to opravit ??

« Poslední změna: 30-12-2014, 21:44:18 od AlienStar »

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 20
    • Verze Delphi: D2007, XE3
Re:Komunikace (prosíím pomoct)
« Odpověď #10 kdy: 31-12-2014, 01:02:04 »
v tomto vlakne http://forum.delphi.cz/index.php/topic,14052.msg83781.html sa rozoberal synaser a je tam uvedena kratka ukazka ako prijimat cez synaser

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 208
  • Karma: 16
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Komunikace (prosíím pomoct)
« Odpověď #11 kdy: 01-01-2015, 15:18:50 »
Na synaser je třeba stáhnout celý poslední snapshot,  ne jen jednu unitu z něj. Navíc mas tu na foru i jeho autora.  8)

Offline AlienStar

  • Plnoletý
  • ***
  • Příspěvků: 101
  • Karma: 2
Re:Komunikace (prosíím pomoct)
« Odpověď #12 kdy: 02-01-2015, 16:52:10 »
Nakonec jsem vše vyřešil, že jsem na netu někde sehnal komponentu TMS Async32 v1.4.5.0 full source

Přes ní se mi komunikace načítala až na pár problémů správně.

Problém jsem měl s tímto:

Původní kód - Delphi 7
Kód: Delphi [Vybrat]
  1. AfComPort1.WriteString('A'+ ((Chr(StrToInt(hexa))))+ ((Chr(StrToInt(hexa_1)))));

Předělal jsem ho do XE7 takto:  (bohužel  nefungoval na 100%)
Kód: Delphi [Vybrat]
  1. VaComm1.WriteText('A'+ ((Char(StrToInt(hexa))))+ ((Char(StrToInt(hexa_1)))));
  2.  

Pak mě náhodou napadlo posílat to takto:
Kód: Delphi [Vybrat]
  1. VaComm1.WriteText('A'+ ((AnsiChar(StrToInt(hexa))))+ ((AnsiChar(StrToInt(hexa_1)))));
  2.  

Toto už funguje na 100% ,, jak to???


Dále pak načítání :

v Delphi 7 to vypadalo takto :
Kód: Delphi [Vybrat]
  1. var data : string ;
  2.  
  3. if data[1] = 'B' then begin
  4.                      if ((Ord(data[2])) and 1) = 1     then Check1IN1.Checked := false
  5.                                                        else Check1IN1.Checked := true;
  6.                      if ((Ord(data[2])) and 2) = 2     then Check1IN2.Checked := false
  7.                                                        else Check1IN2.Checked := true;
  8.                      if ((Ord(data[2])) and 4) = 4     then Check1IN3.Checked := false
  9.                                                        else Check1IN3.Checked := true;
  10.                      if ((Ord(data[2])) and 8) = 8     then Check1IN4.Checked := false
  11.                                                        else Check1IN4.Checked := true;
  12.                      if ((Ord(data[2])) and 16) = 16   then Check1IN5.Checked := false
  13.                                                        else Check1IN5.Checked := true;
  14.                      if ((Ord(data[2])) and 32) = 32   then Check1IN6.Checked := false
  15.                                                        else Check1IN6.Checked := true;
  16.                      if ((Ord(data[2])) and 64) = 64   then Check1IN7.Checked := false
  17.                                                        else Check1IN7.Checked := true;
  18.                      if ((Ord(data[2])) and 128) = 128 then Check1IN8.Checked := false
  19.                                                        else Check1IN8.Checked := true;
  20.  
  21.  


Což při předělání do XE7 už nefungovalo vůbec .
Hlavně jsem ani pořádně nepochopil co znamená to and ve spojení s  if ((Ord(data[2])) and 128) = 128 then ....


Při dlouhých hodinách ladění jsem to vyřešil nakonec takto:

pozn.: s := data; v předchozím kódu
Kód: Delphi [Vybrat]
  1.  
  2. var s  :  AnsiString;
  3.  
  4. ...
  5.  
  6.                      i1   :=  Ord(s[2]) and 1 ;
  7.                      i2   :=  Ord(s[2]) and 2 ;
  8.                      i4   :=  Ord(s[2]) and 4 ;
  9.                      i8   :=  Ord(s[2]) and 8 ;
  10.                      i16  :=  Ord(s[2]) and 16 ;            // pokud je označeno = 0
  11.                      i32  :=  Ord(s[2]) and 32 ;
  12.                      i64  :=  Ord(s[2]) and 64 ;
  13.                      i128 :=  Ord(s[2]) and 128 ;
  14.  
  15.                      if i1 = 0   then Check1IN1.Checked := true
  16.                                  else Check1IN1.Checked := false;
  17.                      if i2 = 0   then Check1IN2.Checked := true
  18.                                  else Check1IN2.Checked := false;
  19.                      if i4 = 0   then Check1IN3.Checked := true
  20.                                  else Check1IN3.Checked := false;
  21.                      if i8 = 0   then Check1IN4.Checked := true
  22.                                  else Check1IN4.Checked := false;
  23.                      if i16 = 0  then Check1IN5.Checked := true
  24.                                  else Check1IN5.Checked := false;
  25.                      if i32 = 0  then Check1IN6.Checked := true
  26.                                  else Check1IN6.Checked := false;
  27.                      if i64 = 0  then Check1IN7.Checked := true
  28.                                  else Check1IN7.Checked := false;
  29.                      if i128 = 0 then Check1IN8.Checked := true
  30.                                  else Check1IN8.Checked := false;
  31.  


Proč mi původní kód nefungoval v XE7 ,, nevíte ?? Prosím poradíte mi ???

děkuji
« Poslední změna: 02-01-2015, 17:08:30 od AlienStar »

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 208
  • Karma: 16
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Komunikace (prosíím pomoct)
« Odpověď #13 kdy: 03-01-2015, 09:11:12 »
Protoze char od D2009 není totéž co char dříve,  je dvoubajtovy unicode.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2586
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Komunikace (prosíím pomoct)
« Odpověď #14 kdy: 03-01-2015, 09:28:49 »
Proč mi původní kód nefungoval v XE7 ,, nevíte ?? Prosím poradíte mi ???
Protoze ti chybi zakladni znalosti o datovych typech, se kterymi operujes.

S temi stringy/znaky pred/po unicodifikaci  je to, jak pise geby, porad dokola: stale existujici jedinci, kteri si neprecetli, jak se zmenili vlastnosti stringu ve verzich Delphi D2-D2007 a D2009+
Je treba si precist http://edn.embarcadero.com/article/40307. Davam to sem pri kazde prilezitosti, ale je to marny, je to marny  >:(