Hallo zusammen,
ich bin gerade dabei mich mit dem SerialPort zu beschäftigen. Ich weiß nicht genau wie ich Daten, die von einem C Programm auf einem Atmel AVR Mikrocontroller gesendet werden, empfangen und getrennt auswerten kann. Es handelt sich um 2 Variablen dabei. Mir fehlt etwas das Verständnis wie das empfangen funktioniert in diesem Fall.
In dem Programm geht es um ein Aufgabe auf der Technikerschule:
grob gesagt soll eine Rolle mit Folie in 10m stücke geschnitten werden.
dazu soll im C# teil die infos ankommen:
Das C Programm vom Controller habe ich soweit fertig.
Danke für eure Hilfe
Hallo Tenergy,
wie sendest du denn die Daten auf AVR-Seite bzw. wie ist der Aufbau von den Daten, die empfangen werden?
Gruß
pinki
Hallo Pinki,
der Controllerquellcode (empfangs und sendeteil) sieht so aus:
#define OUTPORT PORTB
#define MOTOR PB1
#define MOTOR_EIN OUTPORT |= (1<<MOTOR)
#define MOTOR_AUS OUTPORT &= ~(1<<MOTOR)
#define DevMax517 0x58
volatile uint16_t _loops =0;
volatile int _sendenstoppen = 0;
volatile int _Schnittinfo = 0;
volatile int _RolleLeer = 0;
volatile char _Schnitt = 0;
volatile char _Zahl = 0;
volatile int _txPos = 0;
volatile int _rxPos = 0;
volatile uint16_t _loops0 =0;
volatile uint16_t _loops2 =0;
char _buffer [20];
char _rxData [40];
char _txData [40];
ISR (USART_RXC_vect)
{
char _cmd = UDR;
switch (_cmd)
{
case BEL:
{
UDR = ACK;
break;
}
case STX:
{
sprintf(_txData,"%5d\n",_Zahl);
UCSRB |= (1 << TXCIE);
_txPos = 1;
_sendenstoppen = 0;
UDR = _txData [0];
if (_RolleLeer == 0)
{
MOTOR_EIN;
}
break;
}
case ETX:
{
_sendenstoppen = 1;
}
break;
default:
{
cli();
v24_gets (_rxData,0,0);
sei();
}
}
}
ISR (USART_TXC_vect)
{
if (_txData [_txPos] != 0)
{
UDR = _txData [_txPos];
_txPos++;
}
else
{
if (!_sendenstoppen)
{
sprintf(_txData,"%5d\n %5d\n",_Schnittinfo,_RolleLeer);
_txPos = 0;
UDR = _txData [_txPos];
_txPos++;
}
else
{
UDR = 0;
UCSRB &= ~(1 << TXCIE);
}
}
}
.......................
dann folgen natürlich noch der main-teil usw. und timer
Hallo Tenergy_05,
und was ist deine konkrete Frage bzw. dein konkretes Problem? Wo genau hängst du? Was genau verstehst du nicht?
Siehe auch [Hinweis] Wie poste ich richtig? Punkt 5.
herbivore
Da du den MC selber programmierst, würde ich zuerst mal ein Übertragungsprotokoll erstellen.
z.B.
STX|Kennungsbyte|SI|Datenbyte(s)|ETX
Damit kannst du den Datensatz definiert erkennen und die Daten leicht trennen.
Wenn du Übertragungsfehler erkennen möchtest, kannst du ja noch eine Prüfsumme anfügen.