nochmal: der Com-Port (Bitfolgen)
-
Wollte wissen, wie ich bestimmte Bitfolgen zur Com rausschicken kann (z.B. 01110101, 11100010, ...). Hab auch etwas rumgesucht, und bin auf WriteFile und WriteFileEx gestossen. Hab aber ein paar probs mit den Parametern (oder mit dem Englisch ?)
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWritehab nicht ganz verstanden, was er hier verlangt. also lpBuffer verlangt er ja ein Zeiger auf einen Buffer, nur: Was ist ein Buffer (eben doch das Englisch)??
nNumberOfBytesToWrite ist im Grunde genommen klar, nur dass ich nicht ganz verstehe wieso er das braucht, da er ja die File kennt, und so auch deren Grösse...Bräuchte hier also nun eure Hilfe, ev. reicht schon die Erklärung von "Buffer", wobei ich einem kleinen Beispiels Code natürlich nicht abgeneigt wäre.
big thx 4 answers
simon[ Dieser Beitrag wurde am 21.10.2002 um 18:25 Uhr von simon_210 editiert. ]
-
Hallo,
das mit dem English muss Dir nicht peinlich sein. Nicht jeder wird englisch-sprechend geboren....wie ich. Ist aber nur ein kleiner Vorteil, der nütz Dir echt nix wenn Du die konzepte nicht verstehst.
Also was ist ein Puffer?
Stell Dir mal eine Brief vor den Du bekommst, dieser Brief wird doch in deinen
Briefkasten geworfen. Dabei kannst Du Dir vorstellen das dein Briefkasten eine art Buffer, ein Zwischenlager ist, bevor Du den Brief aus dem Kasten nimmst verweilt er da.
Nun zu der Windows API:Der Brief stellt die Daten dar, die Du bekommen möchtest oder die Du senden willst. Sendest Du den Brief bracuht der Empfänger einen PUFFER um die Daten(Brief) zwischenzu speicher damit diese nicht verloren gehen. Auch bei dem Senden benötigt man einen PUFFER um die Daten aus diesem zu lesen. Wichtig ist aber das dein Breifkasten großgenug ist, um auch das Päckhen(die Daten) zu empfangen. Von daher ist es wichtig das Du den Buffer groß genug auslegst. Ist der Puffer zu klein kommen die daten nicht alle rein oder werden erst garnicht genommen. Das ist die Logik eines Puffers....!
Nun zu deinem COM1 Problem:
Hier sind die Funktionen die Du brachen wirst um auf den COM-PORT zu schreiben:
Ich bin mir aber nicht mehr 100% sicher ob das nun aus dem stehgreif stimm
DCB dcb;
HANDLE hCom;
DWORD dwError;
BOOL fSuccess;hCom = CreateFile( "COM1",
GENERIC_READ | GENERIC_WRITE,
0, // exclusiver Zugriff auf den COM1 Port
NULL, // Keine SECURITY_ATTRIBUTES
OPEN_EXISTING, // öffne ein vorhandenes COM1
0, // Keine überlappende Ein/Ausgabe
NULL // hTemplate erfordert NULL für Communications Devices
);if (hCom == INVALID_HANDLE_VALUE)
{
dwError = GetLastError();// handle error
}Und mit WriteFile kannst Du dann auf den PORT schreiben....
Solltest Du noch Fragen haben kannst Du mir geren Mailen...
Gruß Ken
-
mir ging es vor allem um den Gebrauch von WriteFile, und wo ich nun sagen kann welche Bitfolge er verschicken soll und auch wie die Parameter von WriteFile aussehen.
simon
-
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