nochmal: der Com-Port (Bitfolgen)
-
Hallo nochmal!
Ich habe hier mal was schnelles zusammengeschuster. DU müsstest es aber mal testen, da ich meine COM1 deaktiviert habe(wegen Ressourcen)
#include<windows.h> //#include<ras.h> //#include<raseapif.h> int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { long DATA; DATA = 0x007; long Err; ULONG D_WRITTEN; HANDLE fHandle = CreateFile("COM1", GENERIC_READ|GENERIC_WRITE, NULL, NULL, OPEN_EXISTING, NULL, NULL); WriteFile(fHandle, //Handle der Datei oder was auch immer &DATA, Daten die Du schreiben willst (Puffer) sizeof(DATA), //Die grösse der Daten zum schreiben &D_WRITTEN, //Gibt zurück wieviel geschrieben wurde NULL); Err = GetLastError(); //Letzten Fehler ermitteln return 0; }
Check das mal und schreib zurück!!
-
Hallo, kleiner Fehler in der Darstellung des Codes!
SO muß es aussehen:WriteFile(fHandle, &DATA, sizeof(DATA), &D_WRITTEN, NULL);
Gruß Ken
-
vielen dank für die Antwort, das wars was ich suchte
habs auch gleich versucht und MSVC hat keine Fehler gemeldet, allerdings konnte ich noch nicht testen, was ausgegeben wird, da ich die dafür gedachte Schaltung noch nicht komplett habe, werde das aber heute abend noch nachholen.
nochmal big thx
simon
-
Hallo nochmal,
machst Du was mit Hardware..............klingt interessant!
Würde mich mal interessieren was das fuer eine Hardware ist.
Habe auch viel Diagnosewerkzeuge für Hardware gemacht....
ist aber schon laaaaaaaaaaaaaaaaaaaaange herGruß Ken
-
ich häng über einen MAX232 ein µController an die Com, um dann Schieberegister anzusteuern, damit ich möglichst viele Lämpchen (oder einfach Schalter, Transistoren etc.) mit dem PC steuern kann.
simon
-
Hallo,
ah ha, also eine Art Schaltstation. Da kann ich Dir aber was feines
empfehlen: Da gibt es etwas von Conrad Electronic, einen Microcontroler
der Spitzenklasse, I2C-Bus und und und...Das Teil heist C-Control und ist die Bombe von Microcontroler!
Programmierbar in Assembler und C.
-
hab jetzt endlich die Schaltung, um das auch zu versuchen, und siehe da:
Es klappt NICHT
ich hab zum Test ein kleines MFC proggie gemacht (hatte ich z.T. schon, desshalb). Die Schnittstelle hab ich bestimmt richtig initialisiert, da sie in anderen Fällen (nur setzten/löschen) bereits einwandfrei funktioniert hat.
diese Funktion hab ich einfach an eine Schaltfläche "gekoppelt":
void CComtestDlg::Onsend00() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen data = 0x00; WriteFile(hCom, //Handle der Datei oder was auch immer &data, //Daten die Du schreiben willst (Puffer) sizeof(data), //Die grösse der Daten zum schreiben &D_WRITTEN, //Gibt zurück wieviel geschrieben wurde NULL); }
data hab ich als Member-Variable des Typs long erstellt
D_WRITTEN hab ich als Member-Variable des Typs ULONG erstellt
ach und als handle hab ich hCom (wie du siehst), wie gesagt richtig initialisiertbeim Ausführen gibt der MSVC keine Fehler zurück, und dennoch scheint die Bitfolge nicht beim µC anzukommen.
hab ich da was falsch gemacht? Oder gibt es vielleicht eine einfachere Lösung um zu schauen was zur COM rauskommt ?
simon
[ Dieser Beitrag wurde am 23.10.2002 um 22:21 Uhr von simon_210 editiert. ]
-
muss ich da vielleicht irgendwas bei den Einstellungen des Com-Ports ändern ?
simon
-
Hallo,
sicherlich hast Du die Möglichkeit die Einstellungen des COM Portes zu ändern, aber ich habe momentan nicht die Doku verfügbar(MSDN Files korrupt!)
Aber es gibt einen Weg, ich schaue mal nach.......
Gruß Ken
-
Original erstellt von simon_210:
**
(...)
hab ich da was falsch gemacht? Oder gibt es vielleicht eine einfachere Lösung um zu schauen was zur COM rauskommt ?simon
**Portmon
Copyright (C) Mark Russinovich
Freeware
http://www.sysinternals.com
-
hab portmon laufen lassen, aber leider meldete das nur Length: 4: .... anstatt Length: 8: 11111111 (wie bei einem Terminal-Prog)
irgendwas ist also falsch...
nur was????simon
0.00013760 Comtest VCOMM_OpenComm COM1 SUCCESS
0.00000400 Comtest VCOMM_EscapeCommFunction COM1 SUCCESS CLRTIMERLOGIC
0.00000240 Comtest VCOMM_EscapeCommFunction COM1 SUCCESS IGNOREERRORONREADS
0.00000480 Comtest VCOMM_SetupComm COM1 SUCCESS RxSize: 4096 TxSize: 0
0.00000240 Comtest VCOMM_GetCommState COM1 SUCCESS Baud: 9600 Bits: 8 Stop: 1 Parity: None
0.19935680 Comtest VCOMM_SetCommState COM1 SUCCESS Mask: fff Baud: 9600 Bits: 8 Stop: 1 Parity: None
0.00000400 Comtest VCOMM_GetCommQueueStatus COM1 SUCCESS RX: 0 TX: 0
0.00000400 Comtest VCOMM_SetWriteCallBack COM1 SUCCESS Trigger: 1
0.00000720 Comtest VCOMM_WriteComm COM1 SUCCESS Length: 4: ....
0.00000400 Comtest WriteNotifyProc COM1 VOID TRANSMIT: TXCHAR
0.00000320 Comtest VCOMM_SetWriteCallBack COM1 SUCCESS Trigger: -1
0.00000320 Comtest VCOMM_GetCommQueueStatus COM1 SUCCESS RX: 0 TX: 0
0.00000480 Comtest VCOMM_GetCommQueueStatus COM1 SUCCESS RX: 0 TX: 0
0.00000320 Comtest VCOMM_SetWriteCallBack COM1 SUCCESS Trigger: 1
0.00000720 Comtest VCOMM_WriteComm COM1 SUCCESS Length: 4: ....
0.00000400 Comtest WriteNotifyProc COM1 VOID TRANSMIT: TXCHAR
0.00000320 Comtest VCOMM_SetWriteCallBack COM1 SUCCESS Trigger: -1
0.00000320 Comtest VCOMM_GetCommQueueStatus COM1 SUCCESS RX: 0 TX: 0
0.00000720 Comtest VCOMM_EscapeCommFunction COM1 SUCCESS CLRDTR
0.00105280 Comtest VCOMM_CloseComm COM1 SUCCESS
-
na ja, wenn da 4 Zeichen ankommen, dann schiebst du auch nur 4 Zeichen rein bzw. sagts bei WriteFile() er soll 4 Zeichen schreiben.
Was steht denn in LPDWORD lpNumberOfBytesWritten von WriteFile nach dem Schreibzugriff?
...oder Protokollproblem??
aber mal generell: Bitfolge? Zeichen?
1 Zeichen sind doch bereits 16 Bit ... oder hab ich hier was generelles überlesen??[ Dieser Beitrag wurde am 24.10.2002 um 22:01 Uhr von Ulli editiert. ]
-
Hallo @simon_210,
wo genau ist Dein Problem?
Length 4 heißt doch nur, daß 4 Zeichen (in Deinem Fall je 8 Bit lang) gesendet worden sind. Jedes Zeichen noch vornedran mit Startbit und einem Stopbit hinten dran. Also genau 10 "bits" pro Zeichen und das 4 mal. Wenn der Controller den Inhalt der so eingerahmten 8 Bits nicht versteht, liegt es am Inhalt der von Dir gesendeten 4 Bytes, nicht an der Programmierung des COM-Ports.
In Deiner Eingangsfrage war von "bestimmten Bitfolgen" die Rede, die Du senden willst. Kann Dein Controller denn das serielle Format (9600 Bits:8 Stop:1 Parity:None + Stopbit) verarbeiten? Hat also einen "echten" seriellen Port? Oder wird nur an einem Pin eine Bitfolge erwartet? Wann das so ist, kannst Du den Tx-Ausgang des PC-COM-Ports nicht verwenden (wegen dem zusätzlichen Start- und Stopbit), sondern solltest DTR oder RTS verwenden, um "bestimmte Bitfolgen" zu generieren.EscapeCommFunction (hCom, CLRDTR); // DTR Rücksetzen
EscapeCommFunction (hCom, CLRRTS); // RTS Rücksetzen
und
EscapeCommFunction (hCom, SETDTR); // Setzten der DTR
EscapeCommFunction (hCom, SETRTS); // Setzten der RTSNatürlich muß der COM-Port wie immer erst geöffnet und am Ende aller Kommunikation auch wieder geschlossen werden.
Blackbird
-
klar versteht der µC das UART-Protokoll
zu dem length 4, habs das ganze mit nem terminal-prog gemacht, und da kam length 8: 11111111, irgendwas stimmt da also wirklich nicht, ich denke, das sich das length auf die anzahl Bits bezieht, und nicht auf die Anzahl Zeichen...
simon