Ansteuerung eines Gerätes... virtueller COM-Port
-
OK, ich danke erstmal für die Starthilfe. ich versuch das mal zu verstehen bei weiteren Fragen melde ich mich nochmal.
Vielen Dank nochmal!
Gruß NexXxuS
-
Hallo, also ich bin jetzt wieder etwas stehen geblieben...
Ich habe jetzt unteranderem diesen Befehl gesendet://Write Factor1 to 10000 std::stringstream ss; ss << std::hex << 0x04 << 0x31 << 0x031 << 0x02 << 0x30 << 0x30 << 0x31 << 0x30 << 0x30 << 0x30 << 0x30 << 0x03 << 0x32 << std::endl; lLastError = serial.Write(ss.str().c_str()); if (lLastError != ERROR_SUCCESS) return ::ShowError(serial.GetLastError(), _T("Unable to write factor1"));Dieser müsste den Faktor1 verändern: Die Hexa Zahlen sind so vom Hersteller generiert.
Dannach kommt zwar noch das Aktivieren von diesem Wert, in dem Programm solls keine fehler geben aber der Faktor1 verändert sich nicht.
Jetzt gibt es auch vom Hersteller von diesem Gerät auch einen HexaCode wie ich des abfragen kann ob einfach ein ungültiger Wert gesendet wurde oder einfach dieser HexaCode nicht stimmt, aber ich weiss nicht wie ich es abfragen soll. Es müsste etwas ähnliches mit serial.Read geben und wo ich dann auch Diesen HexaCode übergebe...Könnte mir mal da jemand helfen?
MfG NexXxuS
-
NexXxuS schrieb:
Es müsste etwas ähnliches mit serial.Read geben und wo ich dann auch Diesen HexaCode übergebe...
Hab grad nicht so viel Zeit...
Es gibt ja ein serial.Read. Du musst erst deinen Befehl zur Abfrage mit Write senden und im Anschluss mit Read alles einlesen, was so am Port anliegt (ist bei codeproject auch erwähnt).
-
Ja es ist etwas schwer, und des klappt nicht so wirklich, aber wenn du keine Zeit gerade hast ist ok. Vielleicht versuche ich bis dahin ob die Write methode geht...
-
Moin!

Ok, nochmal etwas ausführlicher:
Es gibt keine Read-Methode, der du den Befehl deines Geräts zum Lesen eines Wertes übergeben kannst. Das funktioniert so, dass dein Gerät zwar irgendeinen bestimmten Get-Befehl hat, du diesen aber erstmal per Write senden musst. Im Anschluss musst du alles Lesen, was am COM-Port ankommt. Auf der codeproject-Seite wird das auch beschrieben. Nachdem dein Get-Befehl gesendet wurde, führst du folgenden Code aus:
codeproject.com schrieb:
// Read data, until there is nothing left
DWORD dwBytesRead = 0;
BYTE abBuffer[100];
do
{
// Read data from the COM-portserial.Read(abBuffer,sizeof(abBuffer),&dwBytesRead);
if (dwBytesRead > 0)
{
// TODO: Process the data}
}
while (dwBytesRead == sizeof(abBuffer));Sieh es dir am besten nochmal genau auf der Seite an. Die Puffergröße hängt natürlich davon ab, wie groß die Antwort des Geräts maximal sein kann (und darf ruhig großzügig gewählt werden, damit unter keinen Umständen über den Puffer hinausgeschrieben wird).
Warum dein Befehl zum Setzen des Faktor1 nicht funktioniert hat, kann ich dir nicht sagen. Woran machst du das fest, wenn du bislang nicht einlesen konntest? Zeigt das Gerät etwas an?
Jedenfalls sind typische Fehler einfach falsche Einstellungen der Kommunikation (Baudrate, Parität, Datenbits, abschließendes Zeichen für jeden Befehl wie z.B. Carriage Return...). Diese Werte solltest du also nochmal überprüfen. Am besten sehen, dass da alles stimmt, kannst du vielleicht beim Lesen. Du hast ja eine Doku zum Gerät und weißt, welche Antwort auf einen bestimmten Befehl folgen sollte. Bekommst du etwas Passendes, weißt du, dass wahrscheinlich Baudrate usw. stimmen. Bekommst du nur Datenmüll, musst du die Settings anpassen.
-
Ah ok, das ist klar, nur antwortet mir er trotzdem nicht. Ja das Gerät hat ein 2zeilöen Display so kann ich zumindest ablesen ob etwas sich verändert hat. Tut sich aber nichts. Wieso er nicht schreibt weiss ich nicht genau, die Werte stimmen aber überrein, habe die Baudrate, Databits, Stopbits und Parity auch im Gerät selber eingestellt. Also müssten die Einstellungen eigentlich stimmen. Habe jetzt das eigentlich alles überarbeitet, und die beiden Dateien aus Codeproject zusammengesetzt.
Vielleicht hilft es dir ja wenn ich dir ja mal das ganze Programm schicke, wobei jetzt das Programm nicht zum stehen kommt. Weil ich bis auf des was du mir geschrieben hast noch einiges eingefügt habe, was auf codeproject, unter der Datei Listener war. Vielleicht fällt ja dir etwas auf bei der Gelegenheit.Als Antwort müsste ja eigentlich auch bei mir ein Hexa Wert rauskommen, den man mit Hilfe des Datenblattes entziffern kann, ob der Faktor1 geschrieben wurde, oder es Fehler gab.
-
Hm, was sagt denn die Doku, wie du einen Befehl abschließen musst? Du packst ein std::endl in deinen String, also ein Line Feed ('\n'). Ist das so gefordert?
-
Hab den Fehler gefunden... undzwar hat er es ganz einfach nicht ganz richtig den Befehl übertragen... man musste vor jede Hex Zahl ein char setzen.. char(0x04) erstt dann hat es funktioniert mit der übertragung, da das Symbol ja für die Steuerzeichen nicht anzeigbar sind.
Beim Read befehl bin ich mir aber trotzdem noch net so sicher... Bis jetzt gibt er bei mir auch noch nichts aus in der Konsole.
Aber vielleicht bastel ich da noch etwas rum! Vielleicht klappt es ja.
Bis jetzt danke dass es soweit funktioniert!
-
NexXxuS schrieb:
Bis jetzt danke dass es soweit funktioniert!
Wofür? Du hast ja eigentlich alles selbst gemacht...

-
Naja du hast mir wenigstens die Richtung gezeigt...
Trotzdem Danke!