Forum: PC-Programmierung Frage zu serieller Schnittstelle! DRINGEND Bitte!


von MiguelDERgroße (Gast)


Lesenswert?

Also, hi leute, ich bin total verzweifelt, und hoffe ihr könnt mir 
helfen!
Ich möchte über die serielle Schnittstelle "einfach" daten senden!
Ich möchte Daten mittels C++ über die serielle Schnittstelle raussenden!
(genauer gesagt an den AVR)
ich definiere mir zum beispiel "h" und möchte dann eben dieses h 
raussenden und der andere PC oder eben der AVR soll das empfangen über 
die serielle! ich hab hier mal was das senden betrifft was 
zusammengebastelt!
es gibt zwar keine Fehler, aber ich weiß noch nicht ob es daten sendet, 
bzw. wie der andere das dann empfangen kann!
ich muss dazu sagen, dass ich was solche, schon etwas schwerere dinge 
nicht so bewandert bin in c++, deshalb eine praktische erklärung, das 
ich mir was vorstellen kann, wie ich das dann einbinde wäre nett!
ich hoffe ihr könnt mir weiterhelfen und ich werde bald in der lage sein 
"hallo" über die serielle rauszusenden und auf nem anderen pc zu 
empfangen!

1
#include <windows.h>
2
#include <stdio.h>
3
#include <mmsystem.h>
4
#include <cstdlib>
5
#include <iostream>
6
#include "Serial.h" //einlesen der Headerdatei
7
#include "Serial.cpp" //implementieren der .cpp datei
8
9
using namespace std;
10
11
CSerial COMPort; // für serielle übertragung auf den AVR
12
13
//Definieren der variabeln
14
unsigned char out_byte; 
15
16
int main(int argc, char *argv[])
17
{
18
   
19
   COMPort.Open(1,19200); // Hier wird der COM Port geöffnet erste Zahl = Comportnummer z.B. COM1, zweite Zahl = Übertragungsrate
20
21
          char h_str [10]; 
22
          h_str [1] = 'H';
23
          h_str [2] = 'A';
24
          h_str [3] = 'L';
25
          h_str [4] = 'L';
26
          h_str [5] = 'O';
27
28
          COMPort.SendData(h_str, sizeof(h_str)); // SendData( Daten die gesendet werden sollen, größe der Daten) beispiel SendData(h_str,2) Sendet die ersten beiden FElder von h_str
29
          
30
          //printf("%s",h_str);
31
          //getchar();
32
    
33
    COMPort.Close();
34
    return EXIT_SUCCESS;
35
36
}

Beste grüße

Miguel

von yalu (Gast)


Lesenswert?

Ob das, was in Serial.h und Serial.cpp richtig ist, weißt du besser als
die Leser hier. Aber auch dein main enthält noch Fehler:

Arrays beginnen immer mit dem Index 0. h_str besteht auso aus den
Elementen h_str[0], h_str[1], ..., h_str[9]. Deswegen müssen die
Zuweisungen folgendemaßen aussehen:
1
          h_str [0] = 'H';
2
          h_str [1] = 'A';
3
          h_str [2] = 'L';
4
          h_str [3] = 'L';
5
          h_str [4] = 'O';

sizeof(h_str) ist 10, weil h_str aus 10 Elementen der Größe 1 besteht.
Du möchtest aber wahrscheinlich nicht 10 Zeichen senden, sondern nur 5,
nämlich die Buchstaben des Worts "HALLO". Also muss es heißen
1
          COMPort.SendData(h_str, 5);

Vielleicht funktioniert die Sache damit ja schon. Hast du einen zweiten
PC, mit dem du die Daten empfangen und anzeigen lassen kannst? Wenn
nicht, kannst du auch an der Schnittstelle des PC die Tx- und
Rx-Leitungen miteinander verbinden (Loopback) und in dein obiges
Programm nach COMPort.SendData() geeignete Anweisungen zum Empfang von
Daten einfügen. Wenn du alles richtig gemacht hast, müssten du damit die
gesendeten Daten wieder zurückgelesen werden.

Um die Tx- udn Rx-Leitungen zu verbinden, steckst du einfach eine
Sub-D-Buchse, bei der du Pin 2 und Pin 3 mit etwas Lötzinn überbrückt
hast, in den COM-Port des PC.

von HildeK (Gast)


Lesenswert?

Es könnte auch sein, das COM1 mit der Nummer '0' geöffnet werden muss.

von MiguelDERkleine (Gast)


Lesenswert?

Das klingt gut!
weißt du zufällig wie ich das empfangen einbaue?
bin mit dem latein am ende!

lg

Miguel

von Sven P. (Gast)


Lesenswert?

MiguelDERgroße wrote:
1
#include "Serial.cpp" //implementieren der .cpp datei
Das ist falsch, Programmodule werden NIEMALS mit 'include' 
eingebunden. Include immer nur mit Header-Dateien, für den Rest gibt es 
den Linker.
1
          char h_str [10];
2
          h_str [1] = 'H';
3
          h_str [2] = 'A';
4
          h_str [3] = 'L';
5
          h_str [4] = 'L';
6
          h_str [5] = 'O';
Abgesehen davon, dass ein Nullbyte fehlt, sofern das mal ein String 
werden wollte, kann man das auch als 'char *h_str = "HALLO";' schreiben.
1
          COMPort.SendData(h_str, sizeof(h_str));
sizeof(h_str) ist in deinem Fall aber 10.
1
          //printf("%s",h_str);
Das wird schiefgehen, da das besagte Nullbyte fehlt.

von MiguelDERkleine (Gast)


Lesenswert?

1
#include <windows.h>
2
#include <stdio.h>
3
#include <mmsystem.h>
4
#include <cstdlib>
5
#include <iostream>
6
#include "Serial.h" //einlesen der Headerdatei
7
#include "Serial.cpp" //implementieren der .cpp datei 
8
--> was meinst du mit nicht mit include einbinden? wie sonst?was meinst du
9
mit linker genau?
10
11
12
using namespace std;
13
14
CSerial COMPort; // für serielle übertragung auf den AVR
15
16
unsigned char out_byte;
17
18
int main(int argc, char *argv[])
19
{
20
        COMPort.Open(1,19200);
21
        char h_str[5];
22
        strcpy (&h_str[0], "HALLO");
23
        COMPort.SendData(h_str, sizeof(h_str));
24
25
        std::string str ("asd");
26
        COMPort.SendData (str.c_str(), str.length()+1);
27
        str = "HALLO";
28
       
29
        printf("%s",h_str);
30
        getchar();
31
32
        COMPort.Close();
33
        return EXIT_SUCCESS;
34
35
}

hoffe ich habe jetzt das mit dem nullbyte beseitigt, sonst weiß ich 
nicht genau was de meinst! das mit .cpp einbinden, hab ich eh oben im 
programm geschrieben versteh ich net ganz was du meinst!
Noch eine frage, da du dich anscheinend ganz gut auskennst!
wie kann ich das dann von nem anderen pc einlesen?

von Sven P. (Gast)


Lesenswert?

MiguelDERkleine wrote:
>
1
> #include "Serial.cpp" //implementieren der .cpp datei
2
> --> was meinst du mit nicht mit include einbinden? wie sonst?was meinst
3
> du
4
> mit linker genau?
5
>
'Linker' ist eigentlich recht eindeutig, befrag mal dein Handbuch.

>         COMPort.Open(1,19200);
>         char h_str[5];
>         strcpy (&h_str[0], "HALLO");
'&h_str[0]' ist quasi gleich 'h_str'. Aber kannst du mir sagen, wo das 
Nullbyte hin soll?


>         std::string str ("asd");
Hatten wir weiter oben nicht 'using namespace std'?


> Noch eine frage, da du dich anscheinend ganz gut auskennst!
> wie kann ich das dann von nem anderen pc einlesen?
Ich kann ein bisschen C++, ein bisschen mehr C und unter Linux les ich 
ein Byte von einer Schnittstelle genauso, wie ich eines aus einer Datei 
lese.

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.