[Alg, Delphi] Parallelle poort aansturing

Pagina: 1
Acties:

  • MisterE
  • Registratie: April 2002
  • Laatst online: 19-04 12:43
Mischien dat een paar mensen dit al bekend voorkomt van NLDelphi (http://www.nldelphi.com/Forum/showthread.php?t=21807), maar daar kom ik op dit moment niet verder. Hopelijk dat iemand anders nog hulp kan bieden.

Ik heb eigenlijk 2 problemen.

1: Ik kan de verstuurde data niet waarnemen met PortMon. Ik gebruik de "Inpout32.dll" plugin. Ik heb een computer met 2000 verbonden met een computer met 98. Ik kan op beide de data niet zien langskomen. (ik gebruik natuurlijk de juiiste versie van PortMon op het juiste systeem)

Ook als ik de oude manier gebruik van verzenden/ontvangen (assembly code) op de 98 bak(op 2000 mag dat niet meer) dan zie ik dezelfde data weer terug in mijn testprogramma. Maar PortMon ziet echter niets.

Weet iemand hoe dit komt, of een ander programma die wel data kan monitoren? Ik wil namelijk de data van een ander proces onderscheppen.

2: Met beide bovenstaande genoemde manieren kan je maar 1 integer verzenden. Hoe moet ik dan bijvoorbeeld een String verzenden? Zouden 2 timers (1 voor het verzenden en 1 voor het ontvangen) voldoende zijn? Maar hoe weet ik dan dat ze tegelijk starten. Ik zou zeggen laat de ontvanger net wat sneller draaien om geen pakketjes te missen. Maar dan heb je weer kans dat je pakketjes dubbel waarneemt.
Daar is vast wel een oplossing voor te vinden. Maar dan ben ik bang dat je een heel protocol moet schrijven en pakketjes moet gaan nummeren etc. (net als tcp) maar dant word het echt teveel werk.
Het lijkt me toch dat Windows die poorten wel doet pollen? En dan een event moet kunnen geven? Eventueel met error controle al erin gebouwd.

ps: de bovengenoemde code voorbeeldjes zijn op het NLDelphi forum te downloaden.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23:02

Creepy

Tactical Espionage Splatterer

Gebruik de andere pinnen (de strobe bijv.) om de "timing" te regelen.
Wat je bijv. bij LCD schermen ziet die via de LPT poort worden aangestuurd dat de Strobe pin even hoog/laag gemaakt wordt om aan te geven dat er data klaarstaat (8 bits dus). Vervolgens wordt er een bepaalde tijd gewacht, nieuwe data klaargezet en de strobe weeg hoog/laag gemaakt om aan te geven dat er nieuwe data is. etc. etc. etc.
Eventueel zou je met een andere pin (pinnen genoeg, bekijk de control port en de status port maar eens in de specs van de lpt poort) nog aan kunnen geven dat de andere kant nog aan het lezen is.

[ Voor 20% gewijzigd door Creepy op 16-09-2005 09:58 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 28-04 18:15

Tomatoman

Fulltime prutser

Op het moment dat je een parallelle poort gaat aansturen/uitlezen, ben je zelf verantwoordelijk voor het te gebruiken communiatieprotocol. Dat betekent dat je moet uitvogelen hoe je dingen als strings verstuurt en ontvangt. Om het wat gemakkelijker te maken zou je op zoek kunnen gaan naar een driver die hiervoor al wat functionaliteit heeft ingebouwd. In combinatie met de juiste pinbezetting zou je dat een hoop werk besparen.

Los daarvan moet je er heel goed over nadenken waarom je eigenlijk voor een parallelle poort zou kiezen. Dat ding is dusdanig verouderd (storingsgevoelig, traag, korte kabels), dat hij op veel moderne computers niet eens meer aanwezig is. Het werkt nog wel, maar de parallelle poort is 'deprecated'.

In veel gevallen is USB de aangewezen vervanger. Vind je dat te ingewikkeld (het is ook ingewikkeld), dan kun je ethernet overwegen. Bij ethernet kun je dan een standaardprotocol zoals TCP of UDP gebruiken voor de dataoverdracht. Daarmee omzeil je het hele probleem met signaaltiming, polling, interrupts en soortgelijke ellende.

[ Voor 5% gewijzigd door Tomatoman op 16-09-2005 12:56 ]

Een goede grap mag vrienden kosten.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23:02

Creepy

Tactical Espionage Splatterer

Kleine toevoeging nog: er zijn ook USB devices die een serial poort nadoen, en dat is wel erg simpel te implementeren. Alleen heb je dan dus niet genoeg aan een USB kabeltje om 2 PC's aan elkaar te knopen.

[ Voor 27% gewijzigd door Creepy op 16-09-2005 13:54 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19-04 12:43
Anderen oplossingen zijn helaas niet aan de orde. Het gaat namelijk om labaratorium apparatuur. Er bestaat een oudere met een (zeer oude, 25 pins?) com poort. Dat wou ik met Async pro gaan oplossen.

Er is ook een nieuwe versie van, deze werkt via een parallelle laplink kabel. Er zit wel een standaard programma bij (dos) voor communicatie.
Ik weet dus ook niet welk protocol deze applicatie gebruikt.

Ik zat er aan te denken deze applicatie helemaal te bypassen. Maar ik vrees dat dit teveel werk gaat worden. Maar het zou opzich ook geen probleem zijn deze applicatie te ingreren voor de cummunicatie. Punt is alleen dat de applicatie maar half werkt (dumpen naar de pc werkt, andersom niet). Maar daarover ga ik contact opnemen met de leverancier.

  • MisterE
  • Registratie: April 2002
  • Laatst online: 19-04 12:43
Probleem in deze is dat ik al een applicatie heb voor de communicatie. Dit gebruikt PortTalk onder de NT varianten van Windows. Het mooiste zou zijn als ik deze applicatie totaal kan weglaten. Ik kan dus ook niet zelf mijn protocol verzinnen. Ik had wel gehoopt dat ik alles kon afluisteren met PortMon.
Dit werkt echter niet. Onder 98 werkt deze applicatie gedeeltelijk, maar daar is mss wel een oplossing voor te vinden (ga nog met de leverancier overleggen). Mijn volgende vragen zijn dan ook meer prive dan echt voor dit project :)


Wat ik alleen raar vind (en afvraag) of er geen driver onder xp oid zit die je kan aanroepen. Iets waar dus al error controle inzit en die gewoon een event geeft wanneer er iets binnenkomt.

De oplossing van Creepy is opzich een goed idee maar zover ik weet kan ik die pin niet met "Inpout32.dll" uitlezen. Daarmee is het alleen mogelijk een waarde naar een Poort te sturen, en niet specifiek een pin. Ten tweede moet je dan nog steeds een timer constant laten kijken of er wat veranderd.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23:02

Creepy

Tactical Espionage Splatterer

Je kan prima die waarde aansturen. Pak de specs van de LPT poort er eens bij zou ik zeggen. Je stuurt nu data naar poort 0x0378 (888 decimaal). Dit is de dataport. Echter zijn 0x0379 en 0x037A (889 en 890 decimaal) ook nog te gebruiken.

En reken de waarde die je nu stuurt naar de datapinnen eens om naar binair. En vergelijk dat eens met de toestant van de datapinnen, dat komt verassend met elkaar overeen :)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • MisterE
  • Registratie: April 2002
  • Laatst online: 19-04 12:43
goed, ik heb hetvolgende gemaakt.
Ik heb ze geupload op het NLDelphi forum:
http://www.nldelphi.com/F...ent.php?attachmentid=2848

Ik verzend met de ene op 378 en luister met de andere op 379
Ik lijk binair wat te zien wat lijkt op een telling, maar dit zijn maar
4 bits.Ik run een Sender op 98 en een client op 2000.

0 - 0000000010000000
15 - 0000000001111000

Ik lijk dus nog 4 bitjes te missen?

Wie kan me vertellen hoe ik nou de sync in orde krijg? Moet ik naar een bepaalde
waarde luisteren op een bepaalde poort?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 19:41
Probleem van dat soort oude applicaties draaien onder windows is dat de timing absoluut niet meer klopt.
In die goede oude tijd probeerde men met man en macht dat extra bitje in dezelfde tijd te versturen, wat als gevolg heeft dat de timing van die protocollen retestrak moet zijn. Dat redt je iha niet als je applicatie onder Windows2k en daarboven draait. ( Win9X wil soms nog wel eens lukken door lekker alle cpu tijd op te vreten ) En een nog leuker detail is dat sommige protocollen ook de handshake lijnen en weet ik veel wat gebruiken om dat extra bitje mee te sturen. Het makkelijkste is om dit op een dos machine te doen, want daar ben je in je eentje met je applicatie en mag je lekker snel rondrennen, en kun je direct in je registers poke'n en peek'en. :)

De enige manier is naar mijn weten een derde PC eraan te hangen met een 'afluisterkabel', al heb ik geen idee of dit met de LPT poort ook kan, electrisch gezien.
Een andere optie is om iets in een embedded omgeving te doen, daar kun je de timing vaak op (sub)microseconde regelen, of op interrupt basis gaan werken.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 23:02

Creepy

Tactical Espionage Splatterer

Eh? Lees de specs van de LPT poort nu eens door.
Je zet data op poort 378. Dus op je andere PC check je ook poort 378 om zo de data door te geven.

Op je ontvangende kant poll je steeds een andere pin (de strobe bijv. Dit is bit 0 van de control port). Check wel even of je die pin zowel kunt lezen als kan schrijven. Vervolgens laat je dit bit even van hoog/laag schakelen.

Check ook even hier: http://www.repairfaq.org/...RALLEL5.html#PARALLEL_010. Daarin vertellen ze onder andere welke pinnen gebruikt alsje ene laplink kabel o.i.d. gebruikt.

@farlane: je kan rustig een andere pin gebruiken om te signallen dat er data klaarstaat. Vervolgens kan je een minimale tijd wachten voordat je nieuwe data zend, of je kan ene andere pin gebruiken om te signallen dat de ontvangende kant ana het lezen is en dat je dus geen nieuwe data op de datapinnen moet zetten. Zo werken bijv. LCD's die je aan je LPT poort kan aansluiten ook.

[ Voor 26% gewijzigd door Creepy op 19-09-2005 15:57 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 19:41
Creepy schreef op maandag 19 september 2005 @ 15:56:
Eh? Lees de specs van de LPT poort nu eens door.
Je zet data op poort 378. Dus op je andere PC check je ook poort 378 om zo de data door te geven.
@farlane: je kan rustig een andere pin gebruiken om te signallen dat er data klaarstaat. Vervolgens kan je een minimale tijd wachten voordat je nieuwe data zend, of je kan ene andere pin gebruiken om te signallen dat de ontvangende kant ana het lezen is en dat je dus geen nieuwe data op de datapinnen moet zetten. Zo werken bijv. LCD's die je aan je LPT poort kan aansluiten ook.
Dat snap ik, maar volgens mij wil de topicstarter de communicatie tussen twee bestaande applicaties afluisteren. Hij kan dus niet zelf een protocol verzinnen, maar wil een bestaande nabouwen. Tenminste dat is wat ik ervan begrijp.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1