Forum: PC-Programmierung arduino <-> c++ programm


von fabi s. (fabske)


Lesenswert?

Hallo zusammen,

wenn das im falschen forum ist dann bitte verschieben.

ich wende mich aus verzweiflung hier her. (mein erste beitrag hier)

seit tagen/wochen versuche ich zu meine arduino (http://www.arduino.cc/) 
mit c++ (visual 2010) eine verbindung herzustellen. das heist, in der 
console von c++ eine zahl reinzuschreiben welche an den arduino gesendet 
wird und dieser dann zb eine led anschaltet. auf dem arduino 
funktioniert alles, getest mit dem tool serial monitor von arduino.

http://msdn.microsoft.com/de-de/library/733szwah%28v=vs.80%29.aspx
nach gefühlten 203761 anderen möglichkeiten geb ich nun auf und hoffe 
das ihr mir helfen könnt.

mit c++ kenn ich mit "gut" aus.
programmiere schon seit ca 5 jahre mit c++.

grüße

von Der Weise (Gast)


Lesenswert?

du musst ":COM1" o.ä. wie eine normale Datei mit "CreateFile" öffnen und 
mit WriteFile / ReadFile Daten ein/aus -geben. Kann man wissen mit 5 
Jahren C++ Erfahrung ... Google weiß so etwas auch.

von Washington I. (washington_i)


Lesenswert?

zuerst: ich bin kein windowsler..

hier gibts aber beispielcode
http://www.arduino.cc/playground/Interfacing/CPPWindows

wie das mit der console ist - keine ahnung. dafür nehm ich putty.

weitere beispielimplementierungen für c++ sammt zugriff auf den arduino 
findet man hier drinnen: http://www.openframeworks.cc/ - ne library 
sammlung für schnell-mal-ne-c++-anwendung machen

wenn die pc-seite mit einer mit der arduino-ide vergleichbaren IDE 
gemacht werden soll: processing, aber das ist java. hat auch beispiele.

von Peter II (Gast)


Lesenswert?

fabi s. schrieb:
> http://msdn.microsoft.com/de-de/library/733szwah%2...
> nach gefühlten 203761 anderen möglichkeiten geb ich nun auf und hoffe
> das ihr mir helfen könnt.

was willst du mit einen out oder inp befehlt?

Wie ist denn das Boad mit dem PC verbunden? Über netzwerk, wenn ja muss 
du ich mich sockets beschäfigen, wenn serial dann hilft das weiter

http://msdn.microsoft.com/en-us/library/windows/desktop/aa363201%28v=vs.85%29.aspx

von fabi s. (fabske)


Lesenswert?

danke für eure antworten. ich hoffe ich kann damit etwas anfangen.
hat so etwas noch niemand gemacht und kann ein paar codeschnippsel 
posten?
wie funktioniert das mit dem creatfile?
das board ist mittels usb verbunden.

von Peter II (Gast)


Lesenswert?

fabi s. schrieb:
> wie funktioniert das mit dem creatfile?

seht alles im dem link von MS sogar als Beispiel.

von fabi s. (fabske)


Lesenswert?

ok, es gibt keine fehler mehr aus oder ähnliches.

nur es "hackt" an dem hier: CreateFile failed with error 2.
das steht in der Konsole

von Peter II (Gast)


Lesenswert?

fabi s. schrieb:
> nur es "hackt" an dem hier: CreateFile failed with error 2.
> das steht in der Konsole

und was sollen wir jetzt machen?

Kenn du den Fehlercode für 2? Schon mal doku gelesen?

Tipp: ERROR_FILE_NOT_FOUND könnte es sein.

Hast du den richtigen COM port angegeben, und wie hast du es angegeben? 
Zeigt doch mal bitte den code.

von fabi s. (fabske)


Lesenswert?

> #include <Windows.h>

#include <tchar.h>
#include <stdio.h>

void PrintCommState(DCB dcb)
{
    //  Print some of the DCB structure values
    _tprintf( TEXT("\nBaudRate = %d, ByteSize = %d, Parity = %d, 
StopBits = %d\n"),
              dcb.BaudRate,
              dcb.ByteSize,
              dcb.Parity,
              dcb.StopBits );
}


int main()
{
   DCB dcb;
   HANDLE hCom;
   BOOL fSuccess;
   TCHAR *pcCommPort = TEXT("COM12"); //  Most systems have a COM1 port

   //  Open a handle to the specified com port.
   hCom = CreateFile( pcCommPort,
                      GENERIC_READ | GENERIC_WRITE,
                      0,      //  must be opened with exclusive-access
                      NULL,   //  default 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());
                                                  system("pause");
    return (1);
   }

   //  Initialize the DCB structure.
   SecureZeroMemory(&dcb, sizeof(DCB));
   dcb.DCBlength = sizeof(DCB);

   //  Build on the current configuration by first retrieving all 
current
   //  settings.
   fSuccess = GetCommState(hCom, &dcb);

   if (!fSuccess)
   {
      //  Handle the error.
      printf ("GetCommState failed with error %d.\n", GetLastError());
                                                  system("pause");
      return (2);
   }

   PrintCommState(dcb);       //  Output to console

   //  Fill in some DCB values and set the com state:
   //  57,600 bps, 8 data bits, no parity, and 1 stop bit.
   dcb.BaudRate = CBR_9600;     //  baud rate
   dcb.ByteSize = 8;             //  data size, xmit and rcv
   dcb.Parity   = NOPARITY;      //  parity bit
   dcb.StopBits = ONESTOPBIT;    //  stop bit

   fSuccess = SetCommState(hCom, &dcb);

   if (!fSuccess)
   {
      //  Handle the error.
      printf ("SetCommState failed with error %d.\n", GetLastError());
                                                system("pause");
      return (3);
   }

   //  Get the comm config again.
   fSuccess = GetCommState(hCom, &dcb);

   if (!fSuccess)
   {
      //  Handle the error.
      printf ("GetCommState failed with error %d.\n", GetLastError());
                                                 system("pause");
      return (2);
   }

   PrintCommState(dcb);       //  Output to console

   _tprintf (TEXT("Serial port %s successfully reconfigured.\n"), 
pcCommPort);
                                                system("pause");
   return main();
}


das system("pause") hab ich nur als "anhaltemodus" reingemacht das ich 
die ausgabe lesen kann.

von Peter II (Gast)


Lesenswert?

also hast du die doku nicht gelesen

> TCHAR *pcCommPort = TEXT("COM12"); //  Most systems have a COM1 port

ab COM10 muss man anders abeiten - darf diesmal selber lesen.

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> also hast du die doku nicht gelesen
>
>> TCHAR *pcCommPort = TEXT("COM12"); //  Most systems have a COM1 port
>
> ab COM10 muss man anders abeiten - darf diesmal selber lesen.

Wobei ich noch den Tip geben möchte, dass die grundsätzliche 
Vorgehensweise immer noch die gleiche ist. Lediglich der 'Dateiname' 
muss anders aussehen.

(Was sich die Jungs bei MS dabei gedacht haben, wird mir immer ein 
Rätsel bleiben)

von Peter II (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> (Was sich die Jungs bei MS dabei gedacht haben, wird mir immer ein
> Rätsel bleiben)

ist eigentlich kar, sie können nicht einfach diese DEVICE namen 
vergeben, weil sonst dateien COM10 nicht mehr lesbar sind.

von fabi s. (fabske)


Lesenswert?

IHR SET SPITZE!
es funktioniert!!
denn port muss man so angeben: \\\\.\\COM12

von Karl H. (kbuchegg)


Lesenswert?

Peter II schrieb:
> Karl Heinz Buchegger schrieb:
>> (Was sich die Jungs bei MS dabei gedacht haben, wird mir immer ein
>> Rätsel bleiben)
>
> ist eigentlich kar, sie können nicht einfach diese DEVICE namen
> vergeben, weil sonst dateien COM10 nicht mehr lesbar sind.

Das ist schon klar.
Aber die Krücke die sie anstelle eingeführt haben, ist auch nicht 
besser.

Aber ist egal. Solange sie nur mit "Dokumente und Einstellungen", 
welches manchmal "Benutzer" heißt und im Filetree als "Users" geführt 
wird, das Chaos weiterhin hoch halten können, spielt das auch keine 
Rolle mehr. Dafür kann ich als Administrator das 'Program' Verzeichnis 
im Netzwerk freigeben so viel ich will, interessiert doch Windows nicht.

(Ganz ehrlich: Manchmal muss man auf backward-Kompatibilität pfeifen. 
Wenn im DOS COM12 ein File war, dann ist derjenige selber Schuld. File 
auf einen vernünftigen Namen umnennen und die Sache ist erledigt.

von fabi s. (fabske)


Lesenswert?

Nur noch eine Frage, wie kann ich da jetzt zb den wert 2 senden? und 
auch empfangen?

von Peter II (Gast)


Lesenswert?

fabi s. schrieb:
> Nur noch eine Frage, wie kann ich da jetzt zb den wert 2 senden? und
> auch empfangen?

was hast du die 5 Jahre lang gemacht "Hallo World"
> programmiere schon seit ca 5 jahre mit c++.

lies doch entlich mal die doku wenn sie schon vorhanden ist, dort steht 
alles drin.

von Karl H. (kbuchegg)


Lesenswert?

fabi s. schrieb:
> Nur noch eine Frage, wie kann ich da jetzt zb den wert 2 senden? und
> auch empfangen?

Das ist ein File wie jedes andere auch.
ReadFile 
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx
WriteFile 
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747(v=vs.85).aspx

von fabi s. (fabske)


Lesenswert?

ja ok macht sinn ^^
aber wo schreib ich den wert, der gesendet werden soll, rein?
mein englisch ist schon eine weile her :(

von Karl H. (kbuchegg)


Lesenswert?

Tja, dann wirds Zeit.

Kann mich nur Peter II anschliessen: Was hast du 5 Jahre lang gemacht?

Wenn du aus dem hier
1
BOOL WINAPI WriteFile(
2
  __in         HANDLE hFile,
3
  __in         LPCVOID lpBuffer,
4
  __in         DWORD nNumberOfBytesToWrite,
5
  __out_opt    LPDWORD lpNumberOfBytesWritten,
6
  __inout_opt  LPOVERLAPPED lpOverlapped
7
);
nicht anhand der Paramaternamen wenigstens eine erste Idee kriegst, 
welches Argument höchst wahrscheinlich welchen Zweck erfüllt, dann ist 
Hopfen und Malz verloren.

von fabi s. (fabske)


Lesenswert?

nur konsolen anwendungen programmiert

von Der Weise (Gast)


Lesenswert?

fabi s. schrieb:
> nur konsolen anwendungen programmiert
Auch da muss man gelegentlich googlen und doku's lesen...

von fabi s. (fabske)


Lesenswert?

nicht unbedingt!
da ich von meinem programmier lehrer die notwendige referenzen bekommen 
habe!

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

fabi s. schrieb:
> da ich von meinem programmier lehrer die notwendige referenzen bekommen
> habe!

Tja; so ist das Leben, jetzt musst Du Dir die "notwendigen Referenzen" 
selbst zusammensuchen.

von Reinhard Kern (Gast)


Lesenswert?

Naja, bei der gesteigerten Lebenserwartung sind 5 verschenkte Jahre auch 
nicht mehr so schlimm.

Gruss Reinhard

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.