PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 mit Codevision Puffern



Fichte
02.05.2005, 16:06
Hay @all


Ich habe mal eine ganz Blöde frage. Ich bekomme von einen Controller ein Signal und möchte diese Puffern.
Codevision hat zwar so etwas in der Art Dabei aber ich weiss nicht wie ich dies Anwenden muss.







#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>



kann mir jemand sagen wie ich diese Funktion nun nutzen kann bis jetzt werte ich alles durch getchar(); aus.


MFG: Fichte

Tobiaur
02.05.2005, 23:22
Hi
Das puffern geht indem du die TX / RX buffer einstellst und danach mit einer abfrage von rx_counter nachschaust wieviel schon drin ist.
Kann sein das ich die Frage grad falsch verstanden habe.
Was genau willst Du puffern? Die Zeichen? Die werden eh in den internen Puffer geschrieben. Schau mal ins Hilfefile das steht alles weitere.
Grüsse
Tobi

Fichte
03.05.2005, 12:39
Hay Tobiaur

Ich Habe von einem Steuergerät Daten die ich mit dem Atmel Verwerten möchte nun kommen die Werte bei mir in den Atmel so rein.

Es sind immer 3 Werte im Hex Format. Das Steuergerät Fängt an mir den Hex Wert 0xFF zusenden danach kommt eine Hex Zahl wieviel Daten kommen zbs. 3 also Senden es mir den Hex Wert 0x03 und dann 3 Hex werte.

Das sieht dann im Normalfall so aus.

0xFF // Fange an zusenden
0x03 // Sende 3 Daten Bytes
0x44 // 1 Datenbyte
0x22 // 2 Datenbyte
0x19 // 3 Datenbyte

Nun möchte ich aber diese eingehnten Daten Auswerten aber er Verwirft sie immer wieder und ich kann sie nicht auswerten.


MFG: Fichte

Tobiaur
03.05.2005, 13:00
Hmm
Idee.
Du fragst so lange ankommende zeichen ab bis 0xFF da ist.
Dann ein weiteres um rauszubekommen wieviele Zeichen kommen (sagen wir es wären a Zeichen).
Dananch wartest Du bis in rx_counter a drinsteht und ziehst die danach rein.
Ich glaube ich versteh das Problem immer noch net so ganz..
Warum verwirft der Atmel die? Lies sie mit getchar in ne variable (oder ein Array) und dann sollte das doch klappen, oder?

Tobi

Fichte
03.05.2005, 13:49
Dachte ich auch ich kann dfie mal meine Funktion Zeigen





if(getchar()==0xff){
if(getchar()==0x03){
Ergebnis=(int)getchar()*2.1;
sprintf(text,"%03u",Ergebnis);
lcd_gotoxy(0,0);
lcd_puts(text);

Ergebnis=(int)getchar()*125;
Ergebnis=(Ergebnis/10);
sprintf(text,"%04u",Ergebnis);
lcd_gotoxy(0,1);
lcd_puts(text);

Ergebnis=(int)getchar()-50;
sprintf(text,"%02u",Ergebnis);
lcd_gotoxy(7,1);
lcd_puts(text);


So habe ich es Versucht aber er bringt mir keine Anzeige Aufs LCD.!


MFG: Fichte