Autor Téma: Nastavení virtuálního sériového portu  (Přečteno 201 krát)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 148
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Nastavení virtuálního sériového portu
« kdy: 11-04-2019, 21:12:23 »
Dobrý den,
nerad zase otravuji, potřeboval bych nakopnout co se týče nastavování comportu. Mám jakýsi hardware který komunikuje přes USB rozhraní. Už mi to léta běží pod Delphi, software načte přes Enumerate seznam portů, postupně je projde a zkusí poslat povel pro návrat sériového čísla hardwaru. Pokud přijde správná odezva - začíná to S00 a pokračuje sériovým číslem, pak se dějou další potřebné věci. Kód pro začátek komunikace je
Kód: Delphi [Vybrat]
  1.   procedure TfrmMain.NajdiKartu(var TypKarty: byte; var portik: string);
  2.   var     i, ii, j: integer;
  3.           porty: TStringList;
  4.           starttime, endtime: TTime;
  5.   begin
  6.     typkarty:=0;
  7.     if frmstart.chkSimulace.Checked then
  8.     begin     // typkarty = 3 - simulace
  9.         typkarty:=3;
  10.         Statusbar1.Panels[1].Text:='Režim simulace měření..';
  11.     end else
  12.     begin     // typkarty <> 3 - simulace
  13.     frmMain.txtRX.Text:='';
  14.     rx:='';
  15.     frmMain.Memo1.Lines.Add('Seznam nalezených portů:') ;
  16.     porty := TStringList.Create;
  17.     EnumComPorts(Porty);
  18.     frmMain.memo1.Lines.AddStrings(porty);
  19.     hlaska:='Prohledávám porty..';
  20.     Statusbar1.Panels[1].Text:=hlaska;
  21.     frmMain.Memo1.Lines.Add(hlaska);
  22.     j:=0;
  23.     if portik <> '' then
  24.     begin
  25.         for i:=0 to porty.Count-1 do
  26.         begin
  27.           ii:=pos(chr(0), porty[i]);
  28.           if copy(porty[i], 0, ii-1)=port then j:=i
  29.         end;
  30.     end;
  31.     for i:=j to porty.Count-1 do
  32.     begin
  33.       if comport1.Connected then comport1.Close;
  34.       application.ProcessMessages;
  35.       comport1.Port:= porty[i];
  36.       comport1.CustomBaudRate:=230400;
  37.       hlaska:='Otevírám port ' + porty[i];
  38.       Memo1.Lines.Add(hlaska);
  39.       Statusbar1.Panels[1].Text:=hlaska;
  40.       try
  41.       comport1.Open;
  42.       comport1.WriteStr('I_PS' + #13);
  43.       endtime:=time+0.5*1/(24*60*60);
  44.       Memo1.Lines.Add('Odeslán dotaz na sériové číslo 35954U..');
  45.       Statusbar1.Panels[1].Text:='Odeslán dotaz na sériové číslo interfejsu..';
  46.       repeat
  47.         application.ProcessMessages;
  48.       until ((time)>endtime) or (rx <> '');
  49. //      Memo1.Lines.Add('Odeslán dotaz na sériové číslo 35954U..');
  50.       sleep(200);
  51.       if pos('S00', rx)<>0 then
  52.       begin
  53.         cisloportu:=i;
  54.         comport1.Port:= porty[i];
  55.         portik:= copy(porty[i], 1, pos(chr(0), porty[i])-1);
  56.         hlaska:='Nalezen SNET interfejs 35954U sn: ' +rx + ' na ' + porty[i];
  57.         Memo1.Lines.Add(hlaska);
  58.         Statusbar1.Panels[1].Text:=hlaska;
  59.         porty.free;
  60.         cmdGo.Enabled:=true;
  61.         TypKarty:=1;
  62.         comport1.WriteStr('I_IN' + #13);
  63.         exit;
  64.       end;
  65.       except
  66.         beep;
  67.       end;
  68.     end;
  69.     porty.free;
  70.     Memo1.Lines.Add('Interfejs nenalezen, zkontroluj připojení k počítači!');
  71.     Statusbar1.Panels[1].Text:='Interfejs nenalezen, zkontroluj připojení k počítači!';
  72.     TypKarty:=0;
  73.   end;   // typkarty <> 3 - simulace
  74.   end;
  75.  

Používám TComPort, nastavení všech eventů je na True, controDTR a RTS je Enable, OutCTSFlow=True, OutDSRFlow=False, EventChar je #13, TrigersOnRxChar je true.

A teď nastala potřeba ovládat ten hardware a nastavit ten Com z Excelu. Vygooglil jsem, že ke comportu se dá přistupovat jako k souboru a našel jsem příklad:

Kód: Delphi [Vybrat]
  1.     Debug.Print "Open COM port 9"
  2.     Open "COM9:230400,E,8,1" For Binary Access Read Write As #1
  3.     transmit$ = "I_PS" + Chr(13)
  4.     receiveDummy$ = "~~~"
  5.  
  6.     ' transmit a message
  7.    Put #1, , transmit$
  8.    Debug.Print "Message sent."
  9.  
  10.    ' wait a bit for a response
  11.     Sleep 200
  12.  
  13.     ' check for received message
  14.    Debug.Print "Look for incoming message."
  15.    On Error Resume Next
  16.    Do While True
  17.        receive$ = receiveDummy$  'dummy value
  18.         Input #1, receive$
  19.         If receive$ = receiveDummy$ Then Exit Do  'the string didn't change, so move on
  20.         Debug.Print receive$
  21.     Loop
  22.     On Error GoTo 0
  23.  

Pokud předtím provedu nastavení portu aspoň jednou z původního programu v Delphi, tak to s drobnýma vadama funguje a vrátí to sériové číslo i když na začátku místo S00 jenom 00, ale pokud to spustím po připojení hardwaru přímo z Excelu, tak to zatuhne na prvním Input #1.
Tuším, že potíž je v nastavení buď EventChar, nebo Flowcontrol, ale nevím jak mám DCB z VBA nastavit.

Znovu se omlouvám za mimo platformovou otázku a pokud někdo poradí, klidně na dalikf@volny.cz.


Díky - Dalibor.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 148
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Nastavení virtuálního sériového portu
« Odpověď #1 kdy: 11-04-2019, 22:23:11 »
Jednoduše to asi nepůjde, myslím jsem našel příslušné funkce ve winapi (au au), tak to zkusím a dám vědět.

Dalibor.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 176
  • Karma: 15
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Nastavení virtuálního sériového portu
« Odpověď #2 kdy: 12-04-2019, 06:54:56 »
Z Delphi kódu mi není jasné, jestli vůbec nastavuje s všechny parametry komunikace, jako počet bitů, parita a stopbity.

V Excelu to ale nějak nastavujes... Určitě správně?

Offline geby

  • Plnoletý
  • ***
  • Příspěvků: 176
  • Karma: 15
    • Verze Delphi: 7, 2007, XE2, 10.2
    • Synapse
Re:Nastavení virtuálního sériového portu
« Odpověď #3 kdy: 12-04-2019, 07:13:23 »
Ještě jedna myšlenka... Neznamená hodnota 1 u stopbitu náhodou 1.5 stopbitu, což není zrovna obvyklá hodnota? Pokud chceš 1 stopbit, zkus tam dát hodnotu 0.

Ve Windows API se to tak používá, ostatně v mém SynaSer také. Je dost možné, že to ten Excel má stejné.

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 148
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Nastavení virtuálního sériového portu
« Odpověď #4 kdy: 12-04-2019, 10:59:39 »
Citace
Z Delphi kódu mi není jasné, jestli vůbec nastavuje s všechny parametry komunikace, jako počet bitů, parita a stopbity.

Parametry nastavuji kromě čísla portu rovnou ve vlastnostech komponenty TComPort: Rychlot 230400, lichá parita, 8 bitů, 1 stopbit.

Citace
Neznamená hodnota 1 u stopbitu náhodou 1.5 stopbitu,

No to by byl gól, vyzkouším.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline Faltynek

  • Plnoletý
  • ***
  • Příspěvků: 148
  • Karma: 2
    • Verze Delphi: D5 Enterprise, D2009
Re:Nastavení virtuálního sériového portu
« Odpověď #5 kdy: 13-04-2019, 21:14:26 »
Změna parametru počtu stopbitů na 0 je bez efektu, pořád to tuhne na inputu a to tak, že je nutné zavření excelu přes manažera aplikací.
Dalibor (D2009 Enterprise, dřív D5Enterprise)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2441
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:Nastavení virtuálního sériového portu
« Odpověď #6 kdy: 13-04-2019, 22:00:51 »
Změna parametru počtu stopbitů na 0 je bez efektu, pořád to tuhne na inputu a to tak, že je nutné zavření excelu přes manažera aplikací.
No a neni to proto, ze ceka na prijem nejakych bytu a nic neprichazi resp. jich prijde min?

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1646
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Nastavení virtuálního sériového portu
« Odpověď #7 kdy: 13-04-2019, 22:14:32 »
Me zarazi pozadavek obsluhy COM portu z Excelu. Je k tomu realny duvod? Prijde mi to jako drbat se v uchu pres analni otvor. Netvrdim, ze by to teoreticky nebylo mozne, ale pripada mi to extremne neohrabane (clumsy).

Sluzba (dejme tomu psana v Delphi) generujici data Excelu (pripadne do jejich Access databaze) by mi znela rozumneji.
« Poslední změna: 13-04-2019, 22:44:14 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1646
  • Karma: 65
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:Nastavení virtuálního sériového portu
« Odpověď #8 kdy: 13-04-2019, 22:48:30 »
Me zarazi pozadavek obsluhy COM portu z Excelu. Je k tomu realny duvod? Prijde mi to jako drbat se v uchu pres analni otvor. Netvrdim, ze by to teoreticky nebylo mozne, ale pripada mi to extremne neohrabane (clumsy).

Doba, kdy se Excel snazil byt vyhradnim nastrojem manazeru zrejme neopadl, coz ovsem neznamena jim programovat vse co si preji. Pevne verim, ze mohou existovat i jina reseni v ramci jejich oblibeneho kancelarskeho baliku MS Office (byt mam v teto sfere dost velke mezery).
« Poslední změna: 13-04-2019, 22:50:29 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Daniel_Andrascik

  • Hrdina
  • ****
  • Příspěvků: 459
  • Karma: 19
    • Verze Delphi: D2007, XE3
Re:Nastavení virtuálního sériového portu
« Odpověď #9 kdy: 15-04-2019, 21:42:34 »
Ked sa ti to nebude moc darit, napis si vlastnu dll v delphi s TComPortom a volaj ju z excelu ;)

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Jméno: E-mail:
Ověření:
Křestní jméno zpěváka Gotta: