Go Down

Topic: Kommunikation zwischen PC und Arduino Uno? (Read 11730 times) previous topic - next topic

__NitramX__

Oct 17, 2010, 04:13 pm Last Edit: Oct 17, 2010, 04:35 pm by __NitramX__ Reason: 1
Hallo, ich erkunde grade die Serielle Kommunikation und komme alleine nicht weiter:

EDIT: Kurzbeschreibung / Was will ich tun:
C++ Anwendung sendet char über usb an Arduino, Arduino gibt den empfangenen char mit Serial.println(x) aus.

Es gibt ein kleines C++ Programm, das zu Testzwecken ein char an den Arduino sendet. Hier der Quelltext (SerialClass habe ich von hier: http://www.arduino.cc/playground/Interfacing/CPPWindows):
Code: [Select]

#include <cstdlib>
#include <iostream>
#include <windows.h>
#include "SerialClass.h"
using namespace std;

int main(int argc, char *argv[])
{
   char c;
   c = 'h';
       while(1) {
           printf("%c",c);
           Serial mySerial("\\\\.\\COM17");
           mySerial.WriteData(&c,1);
           mySerial.~Serial();
           Sleep(5000);
       }
   return EXIT_SUCCESS;
}


Der Sketch auf dem Arduino ist auch ganz einfach und sieht so aus:
Code: [Select]

char inChar;

void setup() {
 Serial.begin(9600);
}

void loop() {
 if(Serial.available() > 0) {
   inChar = Serial.read();
   Serial.println(inChar);    
 }
 else {
   Serial.println("nichts...");    
 }
 delay(3000);  
}


Das Problem:
Sobald ich den "Serial Monitor" in der Arduino IDE aufrufe gibt die c++ Anwendung "ERROR!!!" aus.  >:( (TX blinkt aber in korrekten Zeitabständen vor sich hin).

Anmerkungen:
Vor dem Start von Serial Monitor und gestarteter C++ Anwendung läuchten die LEDs RX und TX auf dem Arduino anscheinend korrekt auf.
In Regelmäßigen Abständen blinkt auch die Test-LED (Pin 13) 3x schnell hintereinander auf... was bedeutet denn das?  :-?
Auch wenn der Serial Monitor nach dem Start wieder geschlossen wird, blinken RX und TX wieder korrekt.

Kann mir jemand bei dem Problem helfen? Was passiert da? Was mache ich falsch?

MaFu

Wenn Du den Serial Monitor der IDE aufrufst, dann belegt dieser ja die serielle Schnittstelle. Für Dein C++ Programm ist sie dann blockiert.
Es kann immer nur ein Programm zugreifen.
_______
Manfred

saw0

#2
Oct 17, 2010, 04:53 pm Last Edit: Oct 17, 2010, 04:53 pm by saw0 Reason: 1
Dein C Programm belegt doch schon die Serielle Schnittstelle...


/EDIT, ah da war jemand schneller.

__NitramX__

Das immer nur ein Programm zugreifen kann enttäuscht mich grade ein wenig... ich bin aber auch noch etwas feucht hinter den Ohren :D
Ich habe mir das so ausgemalt, dass der Serial Monitor eigentlich ständig läuft, und nur das Formular geöffnet wird wenn ich ihn aufrufe.

So wie ich das nun verstehe, kann ich in beide Richtungen senden, es muss nur an die selbe Anwendung wieder "zurückgesendet" werden, die Anfangs auch die Verbindung hergestellt hat. Korrigiert mich bitte wenn ich wieder falsch liege.

saw0

Richtig. Seriell bedeutet eben, das der COM-Port belegt ist, und für diese Anwendung reserviert wird.

__NitramX__

Ok Danke.
Super wie schnell einem hier geholfen wird!

saw0

Du könntest den fiesen Weg gehen, und zwei Arduinos benutzen, ich weiss  ja nicht was du machen möchtest und ob sich das lohnt.

Dan könntest du Arduino1 über das C-Programm füttern, über i2c auf Arduino2 das Signal schicken, und Arduino2 spuckts wieder auf den SerialMon.

MaFu

Erweiter halt einfach Dein C++ Programm, so dass es auch Daten von der seriellen Schnittstelle empfängt und anzeigt. Dann bist Du nicht auf den Serial Monitor der IDE angewiesen.
_______
Manfred

__NitramX__

#8
Oct 17, 2010, 06:20 pm Last Edit: Oct 17, 2010, 06:22 pm by __NitramX__ Reason: 1
@apogee
Naja ich bin quasi grade eben in die Physical Computing eingestiegen und erfinde mir so kleine Übungsprojekte und wollte hiermit schauen, wie die serielle Kommunikation funktioniert - I2C kommt später bestimmt noch dran aber im Moment besteht meine Ausrüstung aus Arduino Uno, USB Kabel, Breadboard, paar LEDs, paar Widerständen, Pushbuttons und so´n Kleinkram :)

Ich brauche die Serielle Kommunikation zum Übertragen von Daten aus einem Rennsimulator (lfs.net) an den Arduino um die Motordrehzahl über LEDs anzuzeigen - dafür brauche ich die USB Grundlagen und dafür habe ich mir grade dieses kleine Programm gebastelt, damit ich einen kleinen Debugger habe und weiß, was beim Arduino ankommt.

Funktioniert übrigens!
@MaFu
Habs grade geändert:
C++:
Code: [Select]
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include "SerialClass.h"
using namespace std;

int main(int argc, char *argv[])
{
   
   char c;
   c = 'h';
   char buffer;
   Serial mySerial("\\\\.\\COM17");
           
       while(mySerial.IsConnected()) {
           mySerial.WriteData(&c,1);
           Sleep(5);
           if(mySerial.ReadData(&buffer, 1) == -1) {
               printf("nichts...\n");            
           }
           else {
               printf("%c\n",buffer);
           }              
           //Sleep(4000);
       }
   mySerial.~Serial();
   printf("Verbindung abgebrochen");
   system("PAUSE");
   return EXIT_SUCCESS;
}


Arduino:
Code: [Select]
char inChar;

void setup() {
 Serial.begin(9600);
}

void loop() {
 if(Serial.available() > 0) {
   inChar = Serial.read();
   Serial.write(inChar);
 }    
}


Darauf kann ich gut aufbauen. Danke nochmal! :)

Go Up