Go Down

Topic: Seriell Kommunikation mit MS Visual C++ 2010 Express (Read 1 time) previous topic - next topic

McKay

Hallo Arduino-Gemeinde,

ich bin neu hier und seit einer Woche der glückliche Besitzter eines Arduino MEGA 2560, ich kam bis jetzt über zahlreiche tolle Tutorials mit dem guten Teil schon recht gut zurecht. Display Temperatursensoren LED's und Taster für eine Menüsteuerung auf dem Board konnte ich bereits umsetzen.

Jetzt wollte ich mich an die Kommunikation über die USB-Schnittstelle bzw. Serielle Schnittstelle machen. Vom Board her klappt auch alles wenn ich über den Serial Monitor etwas eingeben funktioniert alles.

Nun kommt mein Problem ich habe MS Visual C++ 2010 Express und möchte also ein kleines C++ Programm schreiben was mir einfach nur einen Char an mein Arduino überträgt. Ich habe vor längerer Zeit schon etwas mit C++ gearbeitet aber nichts großes habe also da nur Anfänger-Kenntnisse. Google habe ich nun 2h gequält und auch Beiträge dazu entdeckt aber nichts gefunden was ich zum laufen gebracht habe. Meist war es extrem umfangreich und ich habe es einfach nicht zum laufen gebracht. Ich möchte doch nur ein ganz kleines Programm was mir einen Char überträgt. Es ist sicher ganz einfach und ich stelle mich einfach nur zu blöd an...

Sicher hat jemand das Problem schon gelöst und kenn mir vielleicht ein kleines Beispielprogramm zur verfügung stellen.

Vielen Dank schon mal für eure Antworten


McKay

Ich möchte mal wissen ob man irgenwann in irgendeinem Forum keinen derartigen Kommentar findet -.-
Quote

Eine kurze Befragung der Glasgoogle ergab folgendes:


aber vielen Dank für
http://kasiarz.homelinux.com/news.php?extend.12.4
diese Seite habe ich leider nicht gefunden und sie hat mir echt weiter geholfen


MrMiyagi

#3
Jul 23, 2012, 01:21 pm Last Edit: Jul 23, 2012, 02:05 pm by MrMiyagi Reason: 1
Servus,

ich hatte mich vor einiger Zeit schon einmal mit dem gleichen problem befasst und schon ein fertiges Programm geschrieben.
Ich verwende einfach die windows.h lib die die Serielle komunikation für mich übernimmt.

Mein c++ Programm:

Code: [Select]
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include <string>
#include <iomanip>
#define maxBytes 32
#define DIM 100
using namespace std;

void Initialisierung_Port(HANDLE &hSerial);
void Port_auslesen(char Buffer[], int n,DWORD &dwBytesRead, HANDLE &hSerial);
void wait_while_connecting(void);
void Name(char Buffer[], int n);
void Port_senden(char Senden[], int n, DWORD &dwNumBytesWritten, HANDLE hSerial);

int main(void)
{
HANDLE hSerial;
char Buffer[10] = {0};

char Senden[10] = {0};
DWORD dwBytesRead, dwError, dwNumBytesWritten;
bool connected = false;
// Zähler für Funtkionen die nur einmal aufgerufen werden sollen
bool zähler = false;
dwBytesRead = 0;
int a = 0;
int i;


do
{
// Initialisierung des COM-Ports
Initialisierung_Port(hSerial);
// Wartet 2 sekunden bis zum nächsten Verbindungsaufbau
wait_while_connecting();
// Daten werden aus dem Buffer gelesen
Port_auslesen(Buffer, DIM , dwBytesRead, hSerial);

if(Buffer[0] == '#' && Buffer[1] == 'I' && Buffer[2] == 'N' && Buffer[3] == 'I' && Buffer[4] == 'T' &&
  Buffer[5] == '/' && Buffer[6] == '/')
{
connected = true;
}
}
while(connected != true);


// Einmalige Ausgabe des MC-Namen

Name(Buffer, DIM);


getch();



do
{
Initialisierung_Port(hSerial);

Port_auslesen(Buffer, 99 , dwBytesRead, hSerial);

cout << "schleife " << endl;
Sleep(100);
//if(dwBytesRead > 0)
{
cout << "Ausgabe : " << Buffer << " " << dwBytesRead << endl;
}

}
while(!kbhit());

system("cls");

CloseHandle(hSerial);

system("pause");
return 0;
}



void Port_auslesen(char Buffer[], int n, DWORD &dwBytesRead, HANDLE &hSerial)
{
ReadFile(hSerial, Buffer, n, &dwBytesRead, NULL);

Buffer [dwBytesRead] = 0;
}

void Initialisierung_Port(HANDLE &hSerial)
{
hSerial = CreateFile("COM3",
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if(hSerial==INVALID_HANDLE_VALUE)
{
if(GetLastError()==ERROR_FILE_NOT_FOUND)
{
//serial port does not exist. Inform user.
}
//some other error occurred. Inform user.
}

DCB dcbSerialParams = {0};

dcbSerialParams.DCBlength=sizeof(dcbSerialParams);

if (!GetCommState(hSerial, &dcbSerialParams))
{
//error getting state
}
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;

if(!SetCommState(hSerial, &dcbSerialParams))
{
//error setting serial port state
}

COMMTIMEOUTS timeouts={0};
timeouts.ReadIntervalTimeout=500;
timeouts.ReadTotalTimeoutConstant=500;
timeouts.ReadTotalTimeoutMultiplier=100;

timeouts.WriteTotalTimeoutConstant=50;
timeouts.WriteTotalTimeoutMultiplier=10;
if(!SetCommTimeouts(hSerial, &timeouts))
{
//error occureed. Inform user
}
}

void Port_senden(char Senden[], int n, DWORD &dwNumBytesWritten, HANDLE hSerial)
{
if(getch() == 224 && getch() == 72)
{
cout << "led an" << endl;
Senden[0] = 'L';
Senden[1] = 'E';
Senden[2] = 'D';
}

WriteFile(hSerial, Senden, 10, &dwNumBytesWritten, NULL);

cout << Senden << endl;
}

void wait_while_connecting(void)
{

cout << endl << "Waiting while connecting with the Aruino ";
Sleep(500);
cout << " . "; Sleep(500);
cout << " . "; Sleep(500);
cout << " . "; Sleep(500);
cout << endl << endl;
system("cls");

}

void Name(char Buffer[], int n)
{
int i;

cout << "Connected with : //";

for(i = 7; Buffer[i] != '#'; i++)
{
cout << Buffer[i];
}
}




Mein arduinoprogramm habe ich leider nicht mehr, aber das war nur ein kleines Programm das einfach mit Serial.print ( ) Daten in den seriellen Port schrieb.

Also für dich ist wichtig das du den richtigen COM port auswählst und das beide Programme (Arduinosketch und C++) die gleiche Baudrate eingestellt bekommen.

gruß Nils

Trib

Hallo MrMiyagi,

bitte benutz doch den Code-Tag , das macht das Ganze deutlich leserlicher :)
(Und man muss nicht so viel scrollen)

@Topic: Falls Interesse besteht, habe ich auch noch eine C# Library mit passendem Programm im Angebot.
Die habe ich aber nicht weiter entwickelt da ich meinen Arduino aktuell über das EthernetShield füttere.

MrMiyagi

Hallo,

ja ich wusste nicht wie es funktioniert, danke :D

Go Up