Laden...

serialPort Data_received... wie kann man 2 verschiedene Werte getrennt empfangen und auswerten?

Erstellt von Tenergy_05 vor 11 Jahren Letzter Beitrag vor 11 Jahren 905 Views
T
Tenergy_05 Themenstarter:in
2 Beiträge seit 2013
vor 11 Jahren
serialPort Data_received... wie kann man 2 verschiedene Werte getrennt empfangen und auswerten?

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:

  • ob die Rolle leer ist oder nicht (darstellung im Radiobutton)
  • und wieviel Schnitte gemacht wurden (darstellung im Label)

Das C Programm vom Controller habe ich soweit fertig.

Danke für eure Hilfe

709 Beiträge seit 2008
vor 11 Jahren

Hallo Tenergy,

wie sendest du denn die Daten auf AVR-Seite bzw. wie ist der Aufbau von den Daten, die empfangen werden?

Gruß
pinki

T
Tenergy_05 Themenstarter:in
2 Beiträge seit 2013
vor 11 Jahren

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

49.485 Beiträge seit 2005
vor 11 Jahren

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

185 Beiträge seit 2005
vor 11 Jahren

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.