
Ergebnis 1 bis 11 von 11
-
Mich gibt's schon länger
- 23.09.2003, 09:20
- #1
hallo leute
hat jemand von euch schon mal ne schnittstelle programmiert? ich habe schon die page www.svenketel.de besucht, doch so richtig schlau werde ich nicht daraus. ich wäre froh wenn mir jemand sowohl hardware wie auch softwaremässig ein wenig starthilfe geben könnte...
hardware: möchte gerne die com schnittstelle des cradles gebrauchen
software: verwende embedded visual c++ und habe eigentlich mein programm fertig, aber es will und will nicht funktionieren
vielen dank im voraus
-
- 23.09.2003, 11:36
- #2
nun, ich habe schon mal die schnittstelle des cradles benutzt. das geht eigentlich ohne Probleme und lästiges umbauen desselbigen, wenn du einen null-modemaddapter benutzt. Damit kannst du dann ein beispielsweise ein Modem an den seriellen Stecker des Cradles hängen und der PocketPC benutzt dieses einwandfrei.
ich denke, das wird dein problem sein, dass die kommunikation nicht klappt aufgrund des rsr232 protokolls. du benötigst wohl einen männlich-männlich nullmodemaddapter. gib´t überall, bei mediamarkt, bening etc.
wenn du dir einen selber basteln willst, das geht auch, kommt aber nicht viel billiger.
und zur software, nunja, kommt halt drauf an was die machen soll. da kann ich dir nur insoweit helfen, dass ich mir das programm ansehen kann wenn du möchtest.
mfg
yves
-
Mich gibt's schon länger
- 23.09.2003, 12:21
- #3
erst mal vielen dank für deine antwort..
ich habe dir hier mal meinen code, mit welchem ich versuche eine com schnittstelle zu eröffnen. ich habe com1 gewählt, weil das meines erachtens nach diejenige des cradles ist.. stimmt das? ach ja übrigens ich verwende einen ipaq 3950..
Code:#include <fstream.h> #include "stdafx.h" #include "serial.h" #include <commctrl.h> #include <atlbase.h> /CSerial::CSerial() : hComm(INVALID_HANDLE_VALUE) { } /*Destruktor: CSerial::~CSerial() { Close (); } BOOL CSerial::ModeSet (int nBaud, int nBits, int nStopp, int nParity) { if (INVALID_HANDLE_VALUE == hComm) // COM-Port überhaupt geöffnet? return (FALSE); DCB dcb; // Struktur vom Typ DCB erzeugen ZeroMemory (&dcb, sizeof(dcb)); // ..und schön löschen (wichtig!) // Die bestehenden Parameter holen. Bei Fehler ist hier Schluss! if (!GetCommState (hComm, &dcb)) { Close (); MessageBox (NULL, L"Fehler beim Ändern der COM-Port Parameter\nGetCommState()", NULL, NULL); return (FALSE); } // neue Parameter in die Struktur kopieren (Baud: z.B. 9600) dcb.BaudRate = nBaud; dcb.ByteSize = (BYTE)nBits; dcb.Parity = (BYTE)nParity; //Parität (siehe MSDN) dcb.StopBits = (BYTE)nStopp; //Stoppbits (siehe MSDN) // neue Parameter setzen. Bei Fehler ist hier Schluss! if (!SetCommState (hComm, &dcb)) { Close (); MessageBox (NULL, L"Fehler beim Ändern der COM-Port Parameter\nSetCommState()", NULL, NULL); return (FALSE); } return (TRUE); // fertig } BOOL CSerial::Open (int nPort, int nBaud, int nBits, int nStopp, int nParity) { if (INVALID_HANDLE_VALUE != hComm) // COM-Port überhaupt geöffnet? return (TRUE); char szPort[15] = "\\\\.\\COM1"; hComm = CreateFile (LPCTSTR(szPort), // COM-Port öffnen GENERIC_READ | GENERIC_WRITE, // wir wollen lesen und schreiben 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // nicht OVERLAPPED, wir holen uns den Port exclusiv if (hComm == INVALID_HANDLE_VALUE) // hat es geklappt? Bei Fehler ist hier Schluss! { MessageBox (NULL, L"Fehler beim Öffnen des COM-Ports!\nCreateFile()", NULL, NULL); return (FALSE); } // Alte Timeouts merken. Bei Fehler ist hier Schluss! if (!GetCommTimeouts(hComm, &timeouts_alt)) { Close (); MessageBox (NULL, L"Fehler beim Öffnen des COM-Ports!\nGetCommTimeouts()", NULL, NULL); return (FALSE); } // Eine Struktur vom Typ COMMTIMEOUTS erzeugen und neue Timeouts setzen COMMTIMEOUTS timeouts; timeouts.ReadIntervalTimeout = 3000; timeouts.ReadTotalTimeoutMultiplier = 3000; timeouts.ReadTotalTimeoutConstant = 3000; timeouts.WriteTotalTimeoutMultiplier = 3000; timeouts.WriteTotalTimeoutConstant = 3000; // Neue Timeouts setzen. Bei Fehler ist hier Schluss! if (!SetCommTimeouts(hComm, &timeouts)) { Close (); MessageBox (NULL, L"Fehler beim Öffnen des COM-Ports!\nSetCommTimeouts()", NULL, NULL); return (FALSE); } DCB dcb; // Struktur vom Typ DCB erzeugen ZeroMemory (&dcb, sizeof(dcb)); // ..und schön löschen (wichtig!) // Die bestehenden Parameter holen. Bei Fehler ist hier Schluss! if (!GetCommState (hComm, &dcb)) { Close (); MessageBox (NULL, L"Fehler beim Öffnen des COM-Ports!\nGetCommState()", NULL, NULL); return (FALSE); } dcb_alt = dcb; // alte Parameter sichern dcb.DCBlength = sizeof(DCB); dcb.fBinary = TRUE; // muss immer "TRUE" sein! dcb.fParity = TRUE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; //dcb.fDtrControl = DTR_CONTROL_ENABLE; //XXXXXXXXXXX //dcb.fRtsControl = RTS_CONTROL_ENABLE; //XXXXXXXXXXX dcb.fRtsControl=RTS_CONTROL_HANDSHAKE; //XXXXXXXXXXX dcb.fDtrControl=DTR_CONTROL_HANDSHAKE; //XXXXXXXXXXX dcb.fDsrSensitivity = FALSE; dcb.fTXContinueOnXoff = TRUE; dcb.fOutX = FALSE; dcb.fInX = FALSE; dcb.fErrorChar = FALSE; dcb.fNull = FALSE; dcb.fAbortOnError = FALSE; dcb.wReserved = 0; // muss immer "0" sein! // neue Parameter in die Struktur kopieren (Baud: z.B. 9600) dcb.BaudRate = nBaud; dcb.ByteSize = (BYTE)nBits; dcb.Parity = (BYTE)nParity; //Parität (siehe MSDN) dcb.StopBits = (BYTE)nStopp; //Stoppbits (siehe MSDN) dcb.fParity = (dcb.Parity != NOPARITY); // neue Parameter setzen. Bei Fehler ist hier Schluss! if (!SetCommState (hComm, &dcb)) { Close (); MessageBox (NULL, L"Fehler beim setzen der COM-Port Parameter\nSetCommState()", NULL, NULL); return (FALSE); } return(TRUE); } /*Schließen des COM-Ports: Wie erwartet wird das Handle, was uns CreateFile() geliefert hat, mit CloseHandle() geschlossen. Die alten Parameter der DCB-Struktur und die alten Timeouts werden zurückgeschrieben. */ BOOL CSerial::Close (void) { if (INVALID_HANDLE_VALUE == hComm) // COM-Port überhaupt geöffnet? return(TRUE); if (!SetCommTimeouts(hComm, &timeouts_alt)) { MessageBox (NULL, L"Fehler beim Schließen des COM-Ports\nSetCommTimeouts()", NULL, NULL); return (FALSE); } // alte Parameter zurückschreiben. Bei Fehler ist hier Schluss! if (!SetCommState (hComm, &dcb_alt)) { MessageBox (NULL, L"Fehler beim Schließen des COM-Ports\nSetCommState()", NULL, NULL); return (FALSE); } CloseHandle (hComm); // Port schließen hComm = INVALID_HANDLE_VALUE; // das Handle zurücksetzen return (TRUE); } int CSerial::ReadData (char *buffer,HWND statusBar) // Buffer (*buffer), der die Zeichen bekommt { if (INVALID_HANDLE_VALUE == hComm) // COM-Port überhaupt geöffnet? return(0); DWORD dwRead = 0; char chRead; int i = 0; SendMessage(statusBar,PBM_SETRANGE, 0,MAKELPARAM(0, 850)); SendMessage(statusBar,PBM_SETSTEP, (WPARAM) 3, 0); while (ReadFile(hComm, &chRead, 1, &dwRead, NULL)) // wurde ein Zeichen gelesen? { if (dwRead != 1) // ..wenn nicht, dann ist hier Schluß break; buffer[i++] = chRead; // wann ja, dann das Zeichen in den Buffer schreiben SendMessage(statusBar,PBM_STEPIT, 0, 0); } return (i); // die Anzahl der gelesenen Bytes zurückgeben }
vielen dank und hoffentlich bis bald..
liebe grüsse marc
-
- 23.09.2003, 19:27
- #4
ich habe gerade urlaub und keinen zugriff auf meine entwicklungsumgebung, aber der code scheint bei kurzem überfliegen ein problem zu haben und nicht die hardware.
char szPort[15] = "\\\\.\\COM1";
öffnen können sollte der iPAQ den COM1 immer, egal ob da etwas dran angehängt ist oder nicht.
wie dem auch sei, versuch mal den korrekten bezeichner zu finden für den COM1 (vielleicht >COM1??) und wenn das nicht hilft, nimm mal die kommentare aus der open() anweisung. wer weis, manchmal ist der M$ compiler nicht so zuverlässig wie er sein sollte.
wenn ich wieder zurück in ausm urlaub kann ich nachsehen, ich hatte schon mal ein paar anwendungen mit serieller schnittstelle geschustert, das würde dir bestimmt weiterhelfen.
mfg
yves
-
- 23.09.2003, 19:41
- #5
hier hab ich was du brauchst:
versuch mal nur COM1: einzugeben als dateinamen.
hier ein snipplet aus einem meiner älteren projekte:
Code:strPort.Format(_T("COM%d:"), uiPort); m_irPort = CreateFile((LPCTSTR) strPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (m_irPort == INVALID_HANDLE_VALUE)
mfg yves
-
Mich gibt's schon länger
- 24.09.2003, 06:38
- #6
vielen dank, werde es mal so versuchen...
was mir aber sonst noch aufgefallen ist, ist dass ich keine verbindung zum pc herstellen kann, aber nur per com, mit der usb schnittstelle funktioniert es...
melde mich später wieder
-
Mich gibt's schon länger
- 24.09.2003, 09:51
- #7
es geht noch immer nicht....
muss ich noch etwas am ipaq einstellen?
wäre sehr froh wenn du dir nochmals kurz zet nehmen könntest, bin ziemlich aufgeschmissen...
wie kann ich möglichst einfach testen ob mein comport geöffnet werden kann? am besten wäre ein kleiner code dazu...
-
- 24.09.2003, 11:17
- #8
nun, ich würde mal ein einfaches programm schreiben was irgend einen string an den com1 ausgibt. nun könntest du den COM1 an deinem computer anschliessen und mit hyperterminal oder einer anderen software diesen string einlesen quasi als bestätigung. dazu gehst du wie folgt vor:
ht öffnen (ist bei start,zubehör,kommunikation oder so) einen profilnamen eingeben, nenne es test oder so.(wenn du kein modem auf einem winXP rechner installiertt hast, wird dir hyperterminal ein tapi fehler auswerfen, tut er bei mir zumindest, einfach drüber hinwegsehen und ok clicken) dann com1 auswählen, oder com2 wenn du den benutzt, die einstellungen welche du auch in deinem code benutzt hast, parität und baud müssen natürlich gleich sein. dann kommst du in ein terminalfenster. drt könntest du dann also auch text an deinen iPAQ schicken via serielle verbindung und eben text empfangen. nun lässt du das fenster einfach offen und sagst dem iPAQ er soll den text nun senden.
oh, mir viel grad was wichtiges ein. mach vorher ctrl-alt-del und beende WCEMGR oder so, also den das activesynch programm. oder aber du gehst in activeSynch unter einstellungen-verbindungsarten und wählst sowohl USB als auch COM ab, damit der iPAQ nicht in versuchung gerät sich zu synchen. tut er das nähmlich, so wird er keine serielle verbindung mehr aufbauen wollen. ich würde AS beenden und nicht die einstellungen ändern, aber eigentlich müsste das auch klappen.
-
Mich gibt's schon länger
- 24.09.2003, 12:59
- #9
tolle idee, habs soeben versucht, aber ich kann noch immer keinen comport eröffnen... scheisse! hast du mir vielleicht bei gelegenheit eine kleine software zur ansteuerung des comports? nur mit open send und close.. wär huere guet
-
Mich gibt's schon länger
- 30.09.2003, 07:56
- #10
hallo leute
ich habs geschafft...
mein code zum öffnen der comschnittstelle sieht so aus:
ich habe jetzt mal das gemacht:
HANDLE hComm = CreateFile (L"COM1:", // COM-Port öffnen
GENERIC_READ | GENERIC_WRITE, // wir wollen lesen und schreiben
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL); // nicht OVERLAPPED, wir holen uns den Port exclusiv
um das peripheriegerät überhaupt am com des cradles anschliessen und vorallen ansteuern zu können, habe ich einen nullmodemadapter gebraucht und das funktioniert bestens..
wenn jemand fragen hat zu diesem thema, dann helfe ich ihm gerne:
thomm1@hta-bi.bfh.ch
bis dann
-
Gast_neu Gast
hallo,
ich habe das serielle Beispiel (CPP- und H-Datei) von Winapi-net runtergeladen und wüsste gerne, wie dieses mt VS2005_Pro ausführen kann!
Danke
Pixel 10 Serie mit Problemen:...