TXD von COM1 setzen
-
Cool Danke

Da ich nur Codeschnippsel hab (und _KEIN_ VB kann) wusste ich nicht das das über eine DLL geht.
1 Frage hab ich noch(außer ich komm dann mit der DLL nicht zurecht):
Wie schafft die DLL das setzen/löschen?Danke im voraus
-
COMCOM schrieb:
Wie schafft die DLL das setzen/löschen?
Das Frage ich mich allerdings auch... vermutlich setzt sie die Baudrate so hoch, dass man es mit dem normalen Auge nicht mehr sieht, dass es kein ständiges 1 bzw. 0 Signal ist. Mit dem Oszi wirst Du aber vermutlich feststellen, dass es kein stäündiges 1 bzw. 0 Signal ist.
-
Ok Danke

Naja jetzt kommt noch das nutzen der DLL
Mein Stümperhafter Versuch:#include <stdio.h> #include <windows.h> #include <conio.h> typedef void (LPFNDLLFUNC1(int)); LPFNDLLFUNC1 TXD; HINSTANCE hDLL; int main(int argc, char *argv[]) { hDLL = LoadLibrary("ELEXS.dll"); TXD = (LPFNDLLFUNC1)GetProcAddress(hDLL,"TXD"); while(1) { TXD(1); } return 0; }Nur meckert er immer:
13 invalid cast to function type `void ()(int)'
Weißt du was ich falsch mach?Bin total neu auf dem Gebiet DLLs verwenden

Danke im voraus
-
Du solltest folgendes nehmen:
typedef void (__stdcall *tTXD)(short iVal); tTXD pTXD = NULL; pTXD = (tTXD) GetProcAddress(hDLL, "TXD");
-
Vielen Dank

Ich habs jetzt aber ohne DLL gemacht.
Naja und jetzt hab ich aber noch ein paar Fragen,um sicherzustellen das ich alles verstanden hab,was die Ausgabe betrifft.TXD ist zum ausgeben gedacht und kann nur auf Strom gesetzt werden wenn man _ständig_ Daten sendet (in einem extra Thread)
DTR und RTS kann man mit
EscapeCommFunction(hCom, SETDTR | SETRTS);setzen/löschen.
Es gibt also NUR diese 3 Pins zu Ausgabe,oder?
Und zur Eingabe gibt es RI,DCD DSR und CTS,oder?
Und muss ich auf etwas achten wenn ich mit Framdspannung an den Eingängen Arbeite?
Ab +1.5V wird der Eingang ja als Logisch 1 erkannt.
Muss ich den - oder den + Pol mit einem der 4 Eingänge verbinden?Also bei Fremdspannung(ne 1.5V Batterie).
Und welchen Wiederstand sollte ich nutzen bei einer 9V Batterie?
Fragen über Fragen,ich hoffe du kannst sie mir beantworten
Schon mal vielen Dank,ohne dich wär ich verloren

P.S.:Darf ich diesen Thread pushen wenn ich Probleme mit der Eingabe oder anderen Sachen hab die mit dem COM Port zu tun haben??
-
Es gibt 2 Pins zur Ausgabe (DTR und RTS). TXD kann man ja nicht auf 1 setzen...
Um da was dran zu schakten solltest Du Grundgkenntnisse in Elektronik haben... und natürlich die Schnittstellenspezifikation kennen (+/- 3-12V; invertiert).
Aber dazu ist dieses Forum vermutlich nicht ganz richtig...
Pushen darfst Du den Thread immer wenn Du noch fragen hast...
-
Ok jetzt hab ich eine,imo speziell auf C/C++ bezogen:
Gerade hat
EscapeCommFunction(hCom, SETDTR | SETRTS);Noch Strom gegeben...Jetzt nichtmehr

Der ganze Code:#include <stdio.h> #include <windows.h> #include <conio.h> int main(int argc, char *argv[]) { DCB dcb; HANDLE hCom; BOOL fSuccess; char *pcCommPort = "COM1"; hCom = CreateFile( pcCommPort, GENERIC_READ | GENERIC_WRITE, 0, // must be opened with exclusive-access NULL, // no security attributes OPEN_EXISTING, // must use OPEN_EXISTING 0, // not overlapped I/O NULL // hTemplate must be NULL for comm devices ); if (hCom == INVALID_HANDLE_VALUE) { // Handle the error. printf ("CreateFile failed with error %d.\n", GetLastError()); getch(); return (1); } // Build on the current configuration, and skip setting the size // of the input and output buffers with SetupComm. fSuccess = GetCommState(hCom, &dcb); if (!fSuccess) { // Handle the error. printf ("GetCommState failed with error %d.\n", GetLastError()); getch(); return (2); } // Fill in DCB: 57,600 bps, 8 data bits, no parity, and 1 stop bit. dcb.BaudRate = CBR_57600; // set the baud rate dcb.ByteSize = 8; // data size, xmit, and rcv dcb.Parity = NOPARITY; // no parity bit dcb.StopBits = ONESTOPBIT; // one stop bit fSuccess = SetCommState(hCom, &dcb); if (!fSuccess) { // Handle the error. printf ("SetCommState failed with error %d.\n", GetLastError()); getch(); return (3); } printf ("Serial port %s successfully reconfigured.\n", pcCommPort); DWORD dwError, dwNumBytesWritten; BYTE Byte = 256; EscapeCommFunction(hCom, SETDTR | SETRTS); while (1) { WriteFile (hCom, // Port handle &Byte, // Pointer to the data to write 1, // Number of bytes to write &dwNumBytesWritten, // Pointer to the number of bytes // written NULL // Must be NULL for Windows CE ); } return (0); }Das ist doch nicht normal,oder??
Schon mal Danke
-
Wenn es gerade ging und jetzt nicht mehr ist Deine Schnittstelle kapput

-
Das ist ja das komische,das VB Programm funzt noch

cout << "CLR " << EscapeCommFunction(hCom, CLRDTR | CLRRTS ) << endl; cout << "SET " << EscapeCommFunction(hCom, SETDTR | SETRTS ) << endl;gibt auch beidemale 1 aus...
Und was mich noch sehr intressieren würde:Und muss ich auf etwas achten wenn ich mit Framdspannung an den Eingängen Arbeite?
Ab +1.5V wird der Eingang ja als Logisch 1 erkannt.
Muss ich den - oder den + Pol mit einem der 4 Eingänge verbinden?Also bei Fremdspannung(ne 1.5V Batterie).
Und welchen Wiederstand sollte ich nutzen bei einer 9V Batterie?
Schon mal Danke
-
Ok ich weiß jetzt was falsch ist:
EscapeCommFunction(hCom, SETDTR )
funzt...
Man darf sie also nicht mit | verbinden...
-
So

ICh hoffe es macht nichts wenn ich einen 3fach Post mache,aber es hat sich "einiges" getan.
Also ich hab mir jetzt ne Klasse geschrieben für den Port.
Naja ich hab dann versucht RI mit dem -(und auch mal mit dem +)Pol einer 9V
Batterie zu verbinden,aber er erkennt keine Spannung...Was muss ich tun um
Fremdspannung zu nutzen?
Und vorallem gibt es einen Trick/eine Möglichkeit wie ich dem Programm irgendwie mehr Daten mitteilen kann?
Bis jetzt kann es ja nur zwischen 4 verschiedene Anweisungen bekommen(jeweils einen Pin auf 1/0 für eine Anweisung)!
Aber ich möchte ca 20 verschiedene Anweisungen unterscheiden.
Also 20 Schalter die ich dann alle auslesen kann.Gibt es da nen Trick?Schon mal Danke

-
1. Du musst den GND natürlich auch noch mit der Spannungsquelle verbinden, damit überhaupt ein Strom fliessen kann.
2. Wenn Du viele Ein-/Ausgänge anschliessen willst, rate ich Dir prinzipiell zu einer vernüftigen Hardware die das kann (gibt es heute schon für ca. 20 Eur).
3. Wenn Du es doch selber machen willst, musst Du multiplexing machen... für 20 Eingänge brauchst Du aber 6 Leitungen
-
Ok thx

Welche Hardware meinst du?Hast du ein Stichwort oder gar nen Link für mich?
Würd mir echt helfen
Schon mal Danke
-
Z.B.
http://www.elv.de/Shopping/ArtikelDetail.asp?Referenz=418-04&Gruppe=ME-PC&Stufe=2da gibt es aber zig-Anbieter und Du solltest vielleicht mal in einem Hardware-Forum fragen...
-
Ok Danke!
Du kennst nicht zufällig ein Forum das für solche Fragen gut ist?
Google spuckt bei Hardware Forum leider nur irgendwelche Foren aus die z.B. beim
Kauf beraten
Danke im voraus
-
SETBREAKund
CLRBREAKin der Funktion
EscapeCommFunctionverwenden, um TxD zu setzen? Oder gleich
SetCommBreakund
ClearCommBreakverwenden?
Die serielle Schnittstelle liest und schreibt Daten seriell - will man also mehr als ein Bit setzen/abfragen, so muss das eben nacheinander passieren. Das geht ganz wunderbar mit Schieberegistern, die auch in den UARTs drin sind, z. B.: so: http://www.skilltronics.de/versuch/elektronik_pc/elektronik_pc.html
Die DLL port.dll kann man auch mit einem passenden Header unter W32-Systemen verwenden.
Blackbird
-
Danke dir ich schau mir mal die Schieberegister an...
Was meinst mit dem TxD-Zeugs?
Ich setz es mit SETBREAK,warum?Danke im voraus