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:
#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