Konsole unter DOS
-
Hallo,
ich verwende DecC++ und programiere zur Zeit ein DOS Console.
Die Konsole komuniziert mit einem Gerät über die serielle Schnittstelle. COM1.Nun, ich habe den folgenden Systembefehle in einer Funktion benutzt:
int serFopen(long baud){
char s[128];
sprintf(s,"mode com1: baud=%d parity=n data=8 stop=1 dtr=on rts=on",baud);
system( s );
}Trozsdem funktionieren die Einstellungen der COM-Port nicht.
Ich muss immer ein Terminal mit meiner Einstellungen öffnen, erst dann übernimmt mein PC die Konsoleeinstellungen.Ich möchte aber mit dem Start meiner Konsole. dass der PC (Win 2000) die Einstellungen übernimmt.
Kann jemand mir da weiter hilfen.Vielen Dank
-
Hails!
Guckst du MSDN!?
MSDN schrieb:
Configuring a Communications Resource
The following example opens a handle to COM1 and fills in a DCB structure with the current configuration. The DCB structure is then modified and used to reconfigure the device.
DCB dcb; HANDLE hCom; DWORD dwError; BOOL fSuccess; hCom = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, // comm devices must be opened w/exclusive-access NULL, // no security attributes OPEN_EXISTING, // comm devices must use OPEN_EXISTING 0, // not overlapped I/O NULL // hTemplate must be NULL for comm devices ); if (hCom == INVALID_HANDLE_VALUE) { dwError = GetLastError(); // handle error } // Omit the call to SetupComm to use the default queue sizes. // Get the current configuration. fSuccess = GetCommState(hCom, &dcb); if (!fSuccess) { // Handle the error. } // Fill in the DCB: baud=9600, 8 data bits, no parity, 1 stop bit. dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; fSuccess = SetCommState(hCom, &dcb); if (!fSuccess) { // Handle the error. }
Viel Spaß damit...
-
-
Oder du schaust in die Konsolen-FAQ unter Ströme lenken :).
Und jetzt noch die Erklärung, warum das bei dir nicht so funktioniert hat, wie du dachtest:
Wenn du dein Programm startest, dann wird sozusagen eine Instanz der Konsole geöffnet. Innerhalb dieser "Instanz" änderst du nun die Einstellungen für COM1. Wenn dein Programm wieder beendet wird, wird auch die Instanz beendet und die Einstellungen gehen wieder verloren.
-
Hallo,
versuche gerade, über eine serielle Schnittstelle ein Gerät anzusteuern.
Habe dazu den Beitrag unter FAQ - Konsole (Ströme lenken) gelesen und wollte darauf aufbauen.
funktioniert aber leider nicht unter VS .net., zumindest mach ich wohl irgendwas
falsch. ich schicke Euch mal den aktuellen Stand. Vielleicht kann mir ja jemand helfen.Würde mir wirklich weiterhelfen.Ich würde gerne an ein Gerät ein Statusrequest senden. Das ist im letzten Codeausschnitt unter data_status_req zu finden, nur antwortet das Gerät nicht.
Wie kann ich denn überprüfen, ob ich auch das richtige Sende. Irgendwie sagt mir eine Ausgabe nur, dass data_status_req nur 1 BYte groß sei. aber wieso?
vielen Dank Jowerunsigned long ComPort::Send(const char *text) { if(hCom!=INVALID_HANDLE_VALUE) { unsigned long sent; if (WriteFile(hCom, text, (DWORD) strlen(text), &sent, NULL)){ std::cout << "Send OK" << " Daten: " << text << " gesendete Bytes " << sent << std::endl; std::cout << std::endl; return(sent); } else return(0); } else return(0); }
//Status Request - STX, NUL, SOH, NUL, 1, NAK, DC2 char data_status_req[7]; data_status_req[0] = 0x02; data_status_req[1] = 0x00; data_status_req[2] = 0x01; data_status_req[3] = 0x00; data_status_req[4] = 0x31; data_status_req[5] = 0x15; data_status_req[6] = 0x12; DWORD dwBytesWRITE = 0; dwBytesWRITE = comport.Send(data_status_req); std::cout << "Status Request Daten gesendet - gesendete Bytes:" << std::showbase << std::dec << dwBytesWRITE<< std::endl;
-
Schau dir mal an was du data_status_req[1] zuweist.
Da wirst du dir noch eine zusätzliche Methode schreiben müssen, damit das richtig funktioniert.
Kleiner Tipp: Du wirst zwei Parameter brauchen. Der eine enthält die Daten und der andere wie lange die Daten sind.
-
Danke, hab den Fehler mittlerweile gefunden. strlen terminiert natürlich bei '\0' bzw. 0x00, funktioniert auch inzwischen.
Gruß Jower