Toon posts:

Probleem met COM poort

Pagina: 1
Acties:

Verwijderd

Topicstarter
Kunnen twee programma's gelijktijdig dezelfde com poort gebruiken.

Voorbeeld:
Programma 1: Wel verbinding met com poort maar geen actieve verbinding(Dus niks verzenden of versturen).
Programma 2: Wil verbinding maken met de com poort.

Is dit mogelijk of niet(Dat programma 2 de andere overruled)?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op donderdag 03 januari 2002 13:09 schreef Avater het volgende:
Kunnen twee programma's gelijktijdig dezelfde com poort gebruiken.

Voorbeeld:
Programma 1: Wel verbinding met com poort maar geen actieve verbinding(Dus niks verzenden of versturen).
Programma 2: Wil verbinding maken met de com poort.

Is dit mogelijk of niet(Dat programma 2 de andere overruled)?
Ja.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Ik denk dat Avatar dan wel wilt weten hoe. En ik trouwens ook. Heb al regelmatig een hoop fratsen uit moeten halen om dit probleem te omzeilen.

Verwijderd

Topicstarter
Ja dat zou ik graag willen weten.

Verwijderd

Het antwoord is: nee

Voorbeeld: maak een verbinding met internet over de juiste COM poort, bel daarna met, bv, dialer, of schrijf in Delphi/Visual Basic FF iets wat dezelfde poort opent, en zie de foutmelding.

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

het kan niet, maar mijn vraag aan de topicstarter: waarom moet Programma 1 wel een verbinding hebben als het programma toch geen activiteit op de poort veroorzaakt?

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Iets meer info zou prettig zijn, vooral over platform en OS.

Over 't algemeen geldt: low-level compoorten aanspreken kan tegelijk, al moet je daarvoor wat beveiligingen overrulen (iets wat normale programma's niet doen). Dit kan alleen bij OS-en die dat ondersteunen (Linux, dos, win95/98/me).

Windows NT/2000/XP (en 95/98/ME eventueel) houden de aanspreking van de compoorten zelf in de hand. Voor de gebruiker is de compoort niets meer of minder dan een file, die dus maar 1-malig geopend kan worden. Een goed geschreven programma zal de poort niet langer openhouden dan noodzakelijk, andere programma's openen hem meteen bij 't staten, en geven 'm pas vrij bij afsluiten.

Als je alles zelf schrijft zou je de handle van de compoort door kunnen sluizen tussen je programma's, zodat je kunt lezen en schrijven met 1 programma, terwijl de ander bijvoorbeeld monitoring kan verzorgen.

Verwijderd

Topicstarter
Dat programma wordt opgestart bij het opstarten van windows en als dat programma dus gestart is werkt mijn programma niet meer.
Voorbeeld: maak een verbinding met internet over de juiste COM poort, bel daarna met, bv, dialer, of schrijf in Delphi/Visual Basic FF iets wat dezelfde poort opent, en zie de foutmelding.
Ik krijg geen foutmelding, maar ik zou er wel graag één willen krijgen. Dus ik ben erg benieuwd hoe jij die com poort opent.

Alvast bedankt voor de antwoorden.

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

Welk programma is het, en waarom moet die draaien?

Verwijderd

Topicstarter
Oke wat informatie

OS :Windows 98/95/ME/2000/XP
Programmeertaal :Delphi


Als het niet mogelijk is om die com poort aan te spreken zou ik graag willen weten hoe ik die foutmelding krijgt.

Verwijderd

code:
1
2
3
4
try
  //open COMport
except
  //genereer foutmelding

:?

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

of iets als (c++)
code:
1
2
3
4
5
6
7
8
HANDLE h;

h = OpenPort(.... );
if (h == HANDLE_NOT_AVAILABLE.. || h == HANDLE..)
{
}
else
...

(vraag me niet wat OpenPort() of Open() precies voor meldingen geven, zie daarvoor: http://msdn.microsoft.com

Verwijderd

Topicstarter
Welk programma is het, en waarom moet die draaien?
Het is een programma dat gegevens uit een samsung kassa haalt en opslaat in een database en dit via een com poort.

Het programma moet erg gebruiks vriendelijk zijn, dat is dus de reden waarom ik graag wil hebben dat de com poort wordt overruled of dat er een duidelijke foutmelding wordt gegenereerd.
code:
1
2
3
4
try
  //open COMport
except
  //genereer foutmelding

Ik krijg geen foutmelding hij gaat dus helemaal niet klappen en komt dus niet bij except.

Verwijderd

Topicstarter
Dit is een stuk code die gebruikt wordt voor het openen van de com poort.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  // Open the COM port
  StrPCopy( comName, 'COM' );
  comName[3] := chr( ord('1') + ord(FComPort) );
  comName[4] := #0;
  FComPortHandle := CreateFile(
                      comName,
                      GENERIC_READ or GENERIC_WRITE,
                      0, // Not shared
                      nil, // No security attributes
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
                      0 // No template
                    ) ;
  Result := Connected;

  • Pooh
  • Registratie: April 2001
  • Niet online

Pooh

Lees eens een boek

hmmz... rt*m!

van msdn: (over CreateFile)
Return Values
If the function succeeds, the return value is an open handle to the specified file. If the specified file exists before the function call and dwCreationDisposition is CREATE_ALWAYS or OPEN_ALWAYS, a call to GetLastError returns ERROR_ALREADY_EXISTS (even though the function has succeeded). If the file does not exist before the call, GetLastError returns zero.

If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.
dus:
code:
1
2
3
4
FComPortHandle := CreateFile(...

if (FComPortHandle = INVALID_HANDLE_VALUE)
  //genereer foutmelding, eventueel met GetLastError...

Verwijderd

Topicstarter
Hij geeft nou een foutmelding. Heel erg bedankt.


De code is nou zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  StrPCopy( comName, 'COM' );
  comName[3] := chr( ord('1') + ord(FComPort) );
  comName[4] := #0;
  FComPortHandle := CreateFile(
                      comName,
                      GENERIC_READ or GENERIC_WRITE,
                      0, // Not shared
                      nil, // No security attributes
                      OPEN_EXISTING,
                      FILE_ATTRIBUTE_NORMAL,
                      0 // No template
                    ) ;
  Result := Connected;
  if (FComPortHandle = INVALID_HANDLE_VALUE) then
    Result:=false;
  if not Result then
    exit;
Pagina: 1