RS232 - Übertragung
-
Hallo,
keksekekse schrieb:
#include <malloc.h> // wegen malloc() und free() //Startfunktion muß heißen: int main() { ... // '' ist die Fehlerquelle aus Zeile 59 // '8' -> 0x38 hex // 'A' -> 0x41 hex // 8 -> 0x08 hex ... return 0; }
vielen Dank für die Antwort.
Allerdings läuft es leider immer noch ganz.Hier mein Code:
int res = initcomport('0', 19200.0, 'E', '7', '2', '0', '4', 1600); printf("Rückgabe: %d", res);
Als Rückgabe, erhalte ich immer -1. Warum?
Welche Verbindungsdaten?
19200
7 Bits
Gerade
2 Stoppbits
Flusssteuerung: "Kein"Irgendwie komme ich überhaupt nicht weiter.
Vielleicht ist jemand so nett. Hier das Handbuch zum Mainboard:
http://www.purematic.de/JUMPtec_Manual_PC104_MOPSplus_181004.pdf
Was ist falsch? Wo könnte der Fehler liegen?
Irgendwie fühle ich mich gerade als purer Anfänger.Vielen Dank für Eure bisherige Hilfe!!!
Michael
-
psYkomaN schrieb:
int initcomport(char port, long baudrate, char paritaet, char wortlaenge, char stopbits, char handshake, char irq, int bufferlaenge){ int tmp=0; if(port<0||port>=MAX_COM) { return(-1); } if(irq>15) { return(-2); } if(irq<0) { irq=intnr[port]; }
int res = initcomport('0', 19200.0, 'E', '7', '2', '0', '4', 1600); printf("Rückgabe: %d", res);
Da hast Du was in ganz falscher Erinnerung: char bedeutet 8 Bit Breite, d.h. Zahl von 0-255, eigentlich -128 bis +127, aber das ist Ansichtssache.
Dementspechend wird '0' als "char constant" mit dem Hexwert 0x30, dez 48 interpretiert. Was Du übergeben mußt, ist die Zahl 0, ohne irgendwas davor oder dahinter. 19200.0 ist eine Fließkommazahl (float), die vom Compiler selbständig in den geforderten Typ long verwandelt (gecastet) wird (also keine Fehlermeldung, soweit ich das gesehen habe).
Fazit: Das Ergebnis -1 wird bereits beim ersten if der Funktion initcomport() zurückgeliefert, weil die Konstante MAX_COM aller Wahrscheinlichkeit 2 ist und '0' = 48 eben deutlich darüber liegt.
Richtiger müßte der Aufruf so aussehen:
int res; res = initcomport(0, 19200, 0xE/*?*/, 7, 2, 0, 4, 1600);
-
Hallo,
vielen Dank. Aber jetzt bekomme ich das einlesen und absenden nicht hin.
Kann doch nicht so schwer sein, oder?Hier meine Routine
void main(void){ int comportResult; // Result of COM-Initialisation int comport = 0; // Comport int receivedByte; // Received byte int sendByte; // Received byte int received_i=0; // Iterator // Zeige die IRQ-Adresse // printf("IRQ-Adresse ist: %d", holintadresse(0)); // Initialisiere den COM-Port comportResult = initcomport(comport, 19200, 0xE, 7, 2, 0, 4, 1600); printf("Initialisierung: %d\n", comportResult); // Setze DTR setzdtr(comport, 1); // Status DCD printf("Status DCD: %d\n", holdcd(comport)); // Status CTS printf("Status CTS: %d\n", holcts(comport)); /* // Hole Byte printf("Lese Zeichen aus Buffer\n"); while(1){ receivedByte=holbyte(comport); if (receivedByte != -1){ printf("%d", receivedByte); } received_i++; } printf("Einlesen beendet!\n"); */ // Setze RTS setzrts(comport, 1); // Sende Zeichen 'a' printf("Sende Zeichen %d", 'a'); sendebyte(comport, 'a'); return; }
Ich musste in der FAQ noch den Rückgabewert von holbyte auf -1 ändern, da dieser -2 zurück gegeben hat. Habe den Author der FAQ schon informiert.
Michael
-
Ich weiß zwar nicht, ob es zielführend ist, aber die Parität wird nicht auf 0x18 oder 0x08 gesetzt.
psYkomaN schrieb:
if((toupper(paritaet) == 'E')||(paritaet==3)) tmp = 0x18; if((toupper(paritaet) == 'O')||(paritaet==1)) tmp = 0x08;
Anstatt 0xE sind gemäß dem Code 'E', 'e', 3 (für tmp = 0x18), '0', 0 oder 1 (für tmp = 0x08) gültige Werte.
-
Hallo Keksekekse,
vielen Dank für Deine zahlreiche Hilfe.
keksekekse schrieb:
Ich weiß zwar nicht, ob es zielführend ist, aber die Parität wird nicht auf 0x18 oder 0x08 gesetzt.
psYkomaN schrieb:
if((toupper(paritaet) == 'E')||(paritaet==3)) tmp = 0x18; if((toupper(paritaet) == 'O')||(paritaet==1)) tmp = 0x08;
Anstatt 0xE sind gemäß dem Code 'E', 'e', 3 (für tmp = 0x18), '0', 0 oder 1 (für tmp = 0x08) gültige Werte.
// Main-Function void main(void){ int comportResult; // Result of COM-Initialisation int comport = com[0]; // Comport int receivedByte; // Received byte int sendByte; // Received byte int received_i=0; // Iterator // Initialisiere den COM-Port comportResult = initcomport(0, 19200, 'E', 7, 2, 0, 4, 1600); printf("Initialise: %d\n", comportResult); // Setze DTR // printf("Set DTR to 1\n"); // setzdtr(comport, 1); // Status DCD printf("Get Status DCD\n"); printf("Status DCD: %d\n", holdcd(comport)); // Status CTS printf("Get Status CTS\n"); printf("Status CTS: %d\n", holcts(comport)); /* // Hole Byte printf("Lese Zeichen aus Buffer\n"); while(1){ receivedByte=holbyte(comport); if (receivedByte != -1){ printf("%d", receivedByte); } received_i++; } printf("Einlesen beendet!\n"); */ // Setze RTS printf("Set RTS to 1\n"); setzrts(comport, 1); // Sende Zeichen 'a' printf("Send char %d to comport %d\n", 'a', comport); sendebyte(comport, 'a'); // Setze RTS // printf("Set RTS to 0\n"); // setzrts(comport, 0); return;
Aber obiges funktioniert leider immer noch nicht.
Das mit dem 'E' hatte ich ja früher richtig. Hatte es dann wegen Deinem vorletzen Beitrag wieder rausgenommen.Wo könnte der Fehler liegen?
Viele Grüße
Michael
-
psYkomaN schrieb:
Wo könnte der Fehler liegen?
Gegenfrage: Welche Ausgaben macht das Programm?
-
Hallo Michael,
wie ich dir schon per Mail geschrieben habe, ist der Rückgabewert -2 durchaus richtig, nur hatte ich ihn damals nicht dokumentiert. Er bedeutet, dass der angegebene COM-Port nicht verfügbar ist (der FAQ-Eintrag ist auch schon aktualisiert).
Die richtige IRQ-Nummer solltest du über das BIOS deines DOS-Rechners herausbekommen oder auch entsprechend setzen können.
Warum das Programm jetzt nicht funktioniert?
Du initialisierst deine Variable comport mit com[0]. Das ist falsch. comport sollte eine Zahl zwischen 0 und MAX_COM - 1 sein (0 = COM1, 1 = COM2, ...).
Wie genau sieht deine Verkabelung eigentlich aus? Sind die COM-Ports der beiden Rechner gleich eingestellt?
Am Ende deiner main() solltest du noch deinitcomport() aufrufen, sonst kann es zu unerwünschtem, ungewöhnlichem Verhalten kommen.
Deine main() passt auch noch nicht:
int main(void)
Das void vor main() wird zwar von MS-Compilern akzeptiert, ist aber, was den Standard angeht, falsch. Außerdem ist der Aufrufer oftmals froh, wenn er weiß, ob das aufgerufene Programm richtig gearbeitet hat oder nicht.
Grüße
AJ
-
Hallo zusammen,
ich habe genau das gleiche Problem wie der Kollege und bringe den Code einfach nicht zum Laufen. Kann mir jemand den fertigien Code mailen, mit folgenden Einstellungen:
9600, 8 datenbits, keine Paritaet, 1 Stopbit und kein Handshake...
Danke
-
Für DOS?
Für XP und Co. versuch's mal damit:
http://www.transistornet.de/download.php?id=1126
-
Der Link geht nicht, auch nicht wenn man sich durch die Registrierung gequält hat.
Unter Windows XP muss man doch sowieso einen Kernel-Mode Treiber schreiben um auf die Ports zugreifen zu können, oder?
Oder man hat eine dll die das für einen macht, zB die port.dll von Herrn Kainka und Berndt, siehe http://www.b-kainka.de/schnitt.htmAuf der Seite gibt es sie auch (irgendwo) zum runterladen. Einfach mal googeln.
Das Problem mit der DLL: Sie kann keine Interrupts an mein C-Programm weitergeben.