Forum: Mikrocontroller und Digitale Elektronik RS232 nur empfangen möglich


von Michael (Gast)


Lesenswert?

Folgendes Problem, ich möchte über die RS232 per MAX232,
Daten senden sowie empfangen mithilfe eines C# Programmes.
Das ganze mit einem Atmega32.

Das senden vom PC an den Controller funktioniert auch Reibungslos, in 
die umgekehrte Richtung funktioniert aber leider gar nichts.

Dazu wäre vielleicht noch zu sagen das ich einen seriell > USB Adapter 
verwende.

Mein Code:
1
#include <avr/io.h>
2
3
#define USART_BAUDRATE 4800
4
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
5
6
char receive(void)
7
{
8
  while ((UCSRA & (1 << RXC)) == 0) {};
9
  char btes = UDR;
10
  return btes;
11
}
12
13
void send(char data)
14
{
15
  while ((UCSRA & (1 << UDRE)) == 0) {}; 
16
  UDR = data;
17
}
18
19
int main (void)
20
{
21
  
22
  UBRRH = (BAUD_PRESCALE >> 8);
23
  UBRRL = BAUD_PRESCALE;
24
25
26
  UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
27
  UCSRB |= (1<<RXEN) | (1<<TXEN);
28
29
30
    while(1)
31
  {
32
      send(222);
33
  }
34
35
}

von Wilhelm F. (Gast)


Lesenswert?

Normalerweise kann man die RS232-Seite am PC testen, in dem man die Pins 
Rx und Tx brückt. Dann wird ein vom PC gesendetes Zeichen sofort wieder 
zurück geschickt. Am Windows HyperTerminal sieht man dann, ob ein an der 
Tastatur eingegebenes Zeichen zurück kommt, oder nicht.

Was dein C#-Programm am PC macht, weiß ich nicht. Ob das HyperTerminal 
über USB geht, weiß ich ebenfalls nicht, da nie mit einem 
USB/RS232-Adapter gearbeitet. Aber das wäre doch ein erster Vorschlag 
zur Fehlereingrenzung.

von sghixd (Gast)


Lesenswert?

receive(void) wird nie aufgerufen, der Compiler optimiert es weg, weil 
es nicht benutzt wird.

Gast

von Pascal J. (kallito)


Lesenswert?

Wilhelm Ferkes schrieb:
> Ob das HyperTerminal
> über USB geht, weiß ich ebenfalls nicht, da nie mit einem
> USB/RS232-Adapter gearbeitet.

Also normalerweise wird der Adapter als virtueller COM erkannt und 
funktioniert somit dann auch unter Hyperterminal.

Ich nehme an das dein C# nur auf dem pc läuft. Dann wird doch auch nur 
die main() aufgerufen und in der steht ja ne schleife mit send() (das 
ist der grund wieso der sendet) aber recive() wird nirgends aufgerufen 
also kann er auch nix emfangen.

wie wärs mit
1
  while(1)
2
  {
3
      send(222);
4
      send(receive());
5
  }
der sendet dann auch wieder alles zurück was rein kommt, denk ich 
zumindest.

von Michael (Gast)


Lesenswert?

Ihr habt mich vielleicht falsch verstanden.

receive wird im moment auch gar nicht benötigt,
Das empfangen von Daten welche vom PC an den Controller gesendet werden 
stellt eh kein Problem dar.

Das senden vom Controller an den PC geht nur nicht, deshalb auch nur der 
Aufruf von Send.

von Wilhelm F. (Gast)


Lesenswert?

Michael schrieb:

>Ihr habt mich vielleicht falsch verstanden.

Wieso meinst du, daß dann nicht erst mal die Hardware getestet werden 
soll? Schrittweise Eingrenzung, danach die Software.

>Das senden vom Controller an den PC geht nur nicht,...

Genau!


Pascal J. schrieb:

>Also normalerweise wird der Adapter als virtueller COM erkannt
>und funktioniert somit dann auch unter Hyperterminal.

Danke mal für den Tipp, da ich solch einen Adapter demnächst auch 
benötige.

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.