COM1 bis ...

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
kuhno
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Sa, 07. Jan 2006 17:30
Wohnort: Braunschweig
Kontaktdaten:

COM1 bis ...

Beitrag von kuhno »

Hallo XBase++ Gemeinde,

hat von Euch schon jemand mit der Seriellen-Schnittstelle über Win XP gearbeitet. Mit den ToolsIII geht das nicht wirklich. Unter Win98SE war das kein Problem. Mit Com_Open, Com_init und Com_send konnte man einen String an ein angeschlossenes Telefon senden. Bei XP bleibt die Anwendung bei Com_send einfach stehen. Wie siehts mit der TAPI32.DLL aus? Dort gibbet es ja ähnliche Funktionen für die Com-Schnittstelle. Gibt es irgendwo beispiele?

Gruß

Manfred
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

ein bekannter von mir hat mit den XbToolsIII ein Datenübertragungsprogramm gemacht, welches seit Jahren einwandfrei läuft. Ich meine der hätte auch XP Rechner.

Könnte es sein, dass eine andere Anwendung den Port blockiert ? Telefonsoftware oder die Firewall von SP2 ?

Ich selbst habe leider damit keine Erfahrung.
Gruß
Hubert
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Beitrag von thomas »

Hallo.

Ich habe eine Xbase++ Anwendung auf XP laufen, die sogar parallel auf COM1 und COM2 permanent Daten sendet und empfängt. Diese Anwendung ist im SPS-Umfeld integriert und steuert die Paketlogistik im Versand, dh. es werden permanent Daten vom Scanner und der Digitalwaage empfangen und verarbeitet. Bisher habe ich noch keine Probleme mit der Ansteuerung der Com-Ports gehabt. Vielleicht kannst du mal deine COM-Aufrufe
hier posten.

Gruß

Thomas
kuhno
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Sa, 07. Jan 2006 17:30
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von kuhno »

Hallo Thomas,

meine Aufrufe, die unter Win98 laufen, sehen so aus:

Code: Alles auswählen

		IF com_close(1,)
			comok:=com_open(1,,,,)
			if comok
				dtrok:=com_dtr(1,.T.)
				rtsok:=com_rts(1,.T.)
				comsh:=com_hard(1,.T.)
				initok:=com_init(1,9600,"N",8,1)
				if .not. initok
   	  			?"Schnittstelle 1 konnte nicht geöffnet werden."
		  			com_close(1)
					WACLOSE()
		  			RETURN(0)
				endif
			endif
		ENDIF

		millisec(100)
		sendstr="ATD"+sTemp1+CHR(13)
		comfl:=com_flush(1)
		rest:=com_send(1,sendstr)
		IF rest>0
			? "Es wurden nicht alle Zeichen gesendet!"
	  			com_close(1,)
				WACLOSE()
	  			return(0)
		ENDIF
		millisec(300)
		com_close(1,)
Unter XP klemmt es an der Stelle com_send(1,sendstr). Dort bleibt das Prog hängen.

Zu Funktion: In sendstr steht eine Rufnummer, die mit dem ATD-Commando an das Telefon gesendet wird.

Gruß
Manfred
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo,

geh mal in ein Terminalprogramm auf dem Rechner (z.B. Terminal oder Hyperterminal), stelle die Parameter genauso ein und gebe dann die Befehle per Hand ein. Du müstest immer ein OK sehen oder eben nichts und das vermute ich, ein anderes Programm blockiert deine Schnittstelle.
Zuletzt geändert von brandelh am Mi, 19. Apr 2006 9:07, insgesamt 1-mal geändert.
Gruß
Hubert
thomas
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 116
Registriert: Fr, 23. Sep 2005 16:07
Wohnort: Bad Oldesloe
Kontaktdaten:

Beitrag von thomas »

Hallo.

Der Tipp von Hubert ist genau richtig. Wahrscheinlich sitzt der Tapi-Service-Layer auf der COM-Schnittstelle und wartet auf Ereignisse. In diesem Fall solltest du den Openmode „COM_OPEN_NOINIT“ beim öffnen der Schnittstelle benutzten. Also => comok:=com_open(1,,,,COM_OPEN_NOINIT)

Gruß

Thomas
kuhno
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Sa, 07. Jan 2006 17:30
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von kuhno »

Hallo brandelh,
Hallo Thomas,

vielen Dank für die Antworten. Ich werde das morgen mal ausprobieren.

Gruß
Manfred
kuhno
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Sa, 07. Jan 2006 17:30
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von kuhno »

Hallo zusammen,

ich habe das mal ausprobiert. Über das Hyperterminal kann ich das Telefon ansprechen. Die Einstellungen sind identisch. Diesen Teil:

Code: Alles auswählen

comok:=com_open(1,,,,COM_OPEN_NOINIT) 
habe ich auch so eingebaut, aber kein Erfolg damit. Es werden aber auch keine Fehlermeldungen ausgegeben.

Über diesen Teil

Code: Alles auswählen

      millisec(100)
      sendstr="ATD"+sTemp1+CHR(13)
      comfl:=com_flush(1)
      rest:=com_send(1,sendstr)
      IF rest>0
         ? "Es wurden nicht alle Zeichen gesendet!"
              com_close(1,)
            WACLOSE()
              return(0)
      ENDIF 
läuft das Prog hinweg. Die Variable rest ist Null; es wurden also alle Zeichen übertragen.

Klemmt es da bei XP intern vielleicht? Kann man die TAPI umgehen?

Fragen über Fragen.

Gruß

Manfred
kuhno
UDF-Programmierer
UDF-Programmierer
Beiträge: 54
Registriert: Sa, 07. Jan 2006 17:30
Wohnort: Braunschweig
Kontaktdaten:

Beitrag von kuhno »

Hallo zusammen,

ich habe inzwischen die Lösung gefunden und das Problem beseitigt. Schuld an diesem Fehlverhalten war eine IF-Abfrage. Es geht nicht so:

Code: Alles auswählen

       IF com_close(1,)
         comok:=com_open(1,,,,)
         if comok
            dtrok:=com_dtr(1,.T.)
            rtsok:=com_rts(1,.T.)

sondern nur so:

Code: Alles auswählen

	com_close(1,0)
		comok:=com_open(1,,,,)  //COM_OPEN_FASTUART  + COM_OPEN_NOINIT
		if comok =.T.
			dtrok:=com_dtr(1,.T.)
			rtsok:=com_rts(1,.T.)
Com_close(1,) verträgt anscheinend kein IF.

Nun wählt es fleissig unter Win98SE und XP.

Schönen Abend noch.

Manfred
Antworten