Hallo zusammen,
ich versuche ein kleines Programm in C oder C++ zu schreiben das Daten
per RS232 versendet versendet.
Es geht darum einem Messgerät einen 4 Byte langen Datenrahmen zu senden,
wobei in jedem Byte ein Befehl in Form einer Dezimalzahl drinsteht.
Hat mir jemand einen Tipp wie ich auf die RS232-Schnittstelle zugreifen
kann und wie man einen sollchen Datenrehmen generiert ?
Danke schonmal vorab
Schönen Samstag noch
Gruß Michael
Michael schrieb:> Hat mir jemand einen Tipp wie ich auf die RS232-Schnittstelle zugreifen> kann
Ist google heute kaputt?
Aus einem anderen Programm zusammenkopiert sieht das etwa so aus, falls
du von Windows sprichst:
1
#include<windows.h>
2
3
typedefHANDLEfilehandle_t;
4
5
// erste serielle Schnittstelle als Defaultwert, wenn nichts anderes
6
// angegeben ist
7
// (unter Windows sind die seriellen Schnittstellen ab 1 durchnummeriert,
8
// also COM1:, COM2: etc.)
9
// 1, 2... für COM1, COM2...
10
constintDEFAULT_SERIAL=1;
11
12
13
14
voidinit_comm()
15
{
16
constchar*devicename="COM1:";
17
DWORDdwError;
18
BOOLfSuccess;
19
20
SerielleSchnittstelle=CreateFile(devicename,
21
GENERIC_READ|GENERIC_WRITE,
22
0,
23
NULL,
24
OPEN_EXISTING,
25
0,
26
NULL
27
);
28
29
if(SerielleSchnittstelle==INVALID_HANDLE_VALUE)
30
{
31
dwError=GetLastError();
32
// Fehlerbehandlung...
33
}
34
35
DCBdcb;// device control block: Parameter der ser. Schnittstelle
36
37
// aktuelle Einstellungen der seriellen Schnittstelle holen:
Das mit COM1: habe ich aus dem Gedächtnis geschrieben, kann auch sein,
daß der Doppelpunkt weg muß.
Wenn ich mich recht entsinne, gehört er aber hin - sonst könnte ja auch
eine Datei mit dem Namen COM1 gemeint sein.
Klaus Wachtler schrieb:> Wenn ich mich recht entsinne, gehört er aber hin - sonst könnte ja auch> eine Datei mit dem Namen COM1 gemeint sein.
und mit : könnte ein laufwerk gemeint sein, nein er muss weg.
Laufwerke haben doch nur einen Buchstaben; zumindest unter DOS waren die
Devices COM1:, COM2; LPT: etc..
Nachdem Windows doch eine DOS-GUI ist ...
Ich mache aber nicht viel mit Windows, insofern überlasse ich es
anderen, das zu probieren.
Es gibt übrigens noch weitere Namen mit ein paar Backslashes drin für
die Geräte in neueren Win-Versionen, irgendwas in der Art \\dev\com1
oder so; die würden sicher auch gehen.
(Habe aber gerade keine Lust, die genauen Namen herauszusuchen; ich
sitze vor einem Napf mit leckerstem Essen.)
@Klaus Wachtler
unter windows trennt der ":" hinter einen Dateiname den Streamnamen von
Dateinamen. Eine Datei kann mehrere Inhalte haben Datei:1 Datei:2. Keine
Ahnung für was das sinnvoll sein soll.
Bin mir aber sicher das es COM1 ohne : sein muss.
Besser ist gleich "\\.\COMx" zu verwenden, dann geht es auch mit x > 10
Peter II schrieb:> Bin mir aber sicher das es COM1 ohne : sein muss.
kann gut sein!
>> Besser ist gleich "\\.\COMx" zu verwenden, dann geht es auch mit x > 10
Genau das meinte ich; statt dev muß man natürlich einen Punkt nehmen,
damit es nicht zu sehr nach Unix aussieht.
Nur zur Sicherheit: die \ in den Namen müssen in einem C-String natrlich
gedoppelt werden, also z.B. "\\\\.\\COM1" im Quelltext.
Im Umkehrschluß heißt das aber dann doch, daß man keine Datei mit dem
schönen Namen COM1 erzeugen und verwenden kann?
Vielleicht gibt es dann in Windows10SP325 einen Workaround dafür...
Klaus Wachtler schrieb:> Im Umkehrschluß heißt das aber dann doch, daß man keine Datei mit dem> schönen Namen COM1 erzeugen und verwenden kann?
ja so ist es. (ebenso wie NUL, LPT1 ..
http://msdn.microsoft.com/en-us/library/aa365247.aspx
aber immerhin ist es gut dokumentiert.
> Vielleicht gibt es dann in Windows10SP325 einen Workaround dafür...
das es bis jetzt noch niemand wirklich gestört hat, glaube ich kaum das
sie auf diesen Feature verzichten.
Peter II schrieb:> aber immerhin ist es gut dokumentiert.
Das hilft einem durchschnittlichen Endanwender, der nach einem
Dateinamen gefragt wird, nur bedingt :-)
Naja, mich soll es nicht stören.
Hallo zusammen,
ich versuch im Moment das selbe und habe schon beim initialisieren des
Prots Probleme..
Ich programmiere unter Visual Studio mit C++
bei diesem Code
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <string>
HANDLE SerielleSchnittstelle;
void main(){
SerielleSchnittstelle = CreateFile(gszPort, GENERIC_READ |
GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (SerielleSchnittstelle == INVALID_HANDLE_VALUE);
// error opening port; abort
}
kommen die Fehler:
error C2065: 'gszPort': nichtdeklarierter Bezeichner
warning C4390: ';': Leere kontrollierte Anweisung aufgetreten; ist dies
beabsichtigt
IntelliSense: Der Bezeichner ""gszPort"" ist nicht definiert.
diesen Teil des Codes habe ich von MSDN..
Danke schonmal im Voraus
Gruß Lars
Lars schrieb:> SerielleSchnittstelle = CreateFile(gszPort, GENERIC_READ |> GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
Das sind aber erstmal C Grundlagen die da fehlern.
du verwendest eine variable gszPort die du überhaupt nicht deklarier
hast.
Wenn man schon kopiert, dann sollte man alles kopieren oder oder man
muss wirklich auch mal selber denken.
Bei Microsoft steht da auch nicht mehr.. also kopiert habe ist alles..
Ich habe auch schon zu deklarieren z.B. mit const char *gszPort =
"portname";
Darauf folgt die Meldung:
error C2664: 'CreateFileW': Konvertierung des Parameters 1 von 'const
char *' in 'LPCWSTR' nicht möglich
Lars schrieb:> Ich habe auch schon zu deklarieren z.B. mit const char *gszPort =>> "portname";> error C2664: 'CreateFileW': Konvertierung des Parameters 1 von 'const> char *' in 'LPCWSTR' nicht möglich
das ist doch schon mal der richtige ansatz.
das LPCWSTR zeigt dir das der compiler hier unicode will und ein char*
ist nun mal kein unicode. Stell das Projekt auf nicht unicode ein und
schon sollte es gehen. Wenn du unicode brachst dann darst du nicht char*
verwenden sonder musst wchar* (oder so ähnlich) verwenden.
Du mußt portname schon durch den korrekten Namen der seriellen
Schnittstelle ersetzen. Und damit sollte dann auch diese Frage
beantwortet sein
Lars schrieb:> Wie kann ich den festlegen welcher COM-Port angesprochen werden soll?
Wie die Namen aussehen steht im schon geposteten Link:
http://msdn.microsoft.com/en-us/library/aa365247.aspx
Jean Player schrieb:> Hi,> falls du char* verwenden willst , brauchst du CreateFileA
NEIN! man sollte immer CreateFile verwenden, der compiler entscheidet
welches für diesen Projekt das richtige ist. Man sollte nicht Unicode
und nicht unicode mischen.
also Projekt richtig einstellen dann geht es auch ohne das A.
Hi,
Peter II schrieb:> NEIN! man sollte immer CreateFile verwenden, der compiler entscheidet> welches für diesen Projekt das richtige ist.
Grundsätzlich schon richtig. Aber wenn ich den Namen des COM Ports als
UTF8 string bekommen hätte(aus welchem Grund auch immmer, sei jetzt
dahin gestellt) und UNICODE wäre an. Würde ich es mir auch schenken und
ein converting zu UTF16 machen und stattdessen CreateFileA benutzen
(solange man weiss was man macht ).
>Man sollte nicht Unicode und nicht unicode mischen.
Wie du schon sagst, man sollte nicht aber kann :-)
> also Projekt richtig einstellen dann geht es auch ohne das A.
Also im Visual Studio Menu :
-->Project
-->Properties
-->Configuration Properties
-->C/C++
-->Preprocessor
-->Preprocessor Definitions
Unicode abstellen.
GRUß
Hallo zusammen,
habe bei der Einstellung nun
WIN32
_DEBUG
_CONSOLE
%(PreprocessorDefinitions)
UNICODE, _UNICODE
drinstehen.
Leider nimmt er den Befehl ohne A immernochnicht an..
Ok Kommando zurück ;)
hab jetzt unter den Projekteinstellungen -> Konfigurationseigenschaften
-> Zeichensatz -> Multibyte Zeichensatz verwenden eingestellt und jetzt
gehts auch ohne A