damfino
05.03.2016, 21:33
Hab wieder mal ein Problem:
möchte den Inhalt des 4kB EEPROMS über Bluetooth an den PC schicken, einfach mal ans HTerm.
Problem: bekomme maximal ~2600Bytes durch.
Es sieht so aus als gebe es ein Zeitfenster in dem Daten durchgehen, alles danach wird verschluckt.
Hatte als Test nach 1000 Bytes ein delay von 500ms eingebaut, dann kommen weniger Daten an.
Habe aktuell alle 5 Bytes ein delay drinnen, da gehen nur ein paar hundert Bytes in Summe raus.
Hatte auch probiert einfach mal 8 Bytes pro Nachricht zu schicken und nicht jedes einzeln, analog wie die anderen Datensätze, bringt nichts.
Eigentlich geht die Verbindung, schicke 4x in der Sekunde 4 Datensätze raus, das geht problemlos über den ganzen Tag wenn es sein muss.
Ebenso Flashen über Bootloader.
Also wie bekomme ich die 4kB rüber???
LG!
19200Baud, über BTM222 an den PC.
#define Funk_Daten (UCSR0A & (1<<RXC0))
#define Funk_FrameError (UCSR0A & (1<<FE0))
#define Funk_Overrun (UCSR0A & (1<<DOR0))
#define Funk_Daten_Trans (UCSR0A & (1<<UDRE0))
#define Funk_Buffer UDR0
#define CR "\r\n"
Code für Übertragung:
void Funk_Transmit (unsigned char s)
{
while ( !( Funk_Daten_Trans) );
Funk_Buffer = s;
}
// string über Uart
void Funk_Transmit_s (char *s)
{
do
{
Funk_Transmit (*s);
}
while (*s++);
}
Daten aus EEPROM schicken (das delay ist rein aus Testzwecken drinnen, ohne gehen wie erwähnt ~2600Bytes durch)
void Daten_senden()
{
short temp;
unsigned char daten,x;
//cli();
Funk_Transmit_s("Daten_Anfang,"CR);
for (temp=0;temp<4096;temp++)
{
daten=eeprom_read_byte((const uint8_t *)temp);
sprintf(tx_funk,"%d",daten);
Funk_Transmit_s(tx_funk);
x++;if(x>5) {x=0;Funk_Transmit_s(CR);_delay_ms(150);}
}
Funk_Transmit_s("Daten_Ende"CR);
sei();
}
(ohne Interrupts ist es nicht besser)
Als Vergleich was im normalen Betrieb 4x die Sekunde rausgeht:
void TX_Funk(void)
{
unsigned char temp;
temp=(mowerspeed/231);
if (taskflag==FunkdatentaskA)
{taskflag=0;
sprintf(tx_funk,"A,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*"CR,gpsodo,gps,pos_x,pos_y,richtung,drehzahl_ist,te mp,speed_li,speed_re,pos_x_ziel,pos_y_ziel);
Funk_Transmit_s(tx_funk);
}
if (taskflag==FunkdatentaskB)
{taskflag=0;
sprintf(tx_funk,"B,%d,%d,%d,%d,%d,%d,%d,*"CR,pitch,roll,richtung_kom,wochentag, jahr, tag, monat);
Funk_Transmit_s(tx_funk);
}
if (taskflag==FunkdatentaskC)
{taskflag=0;
sprintf(tx_funk,"C,%d,%d,%d,%d,%d,%d,%d,%d,*"CR,volt_ges,anzeige_modus,anzeige_fahrmodus,anzeig e_spirale,pos_x_gps_akt,pos_y_gps_akt,hdop,satcoun t);
Funk_Transmit_s(tx_funk);
}
if (taskflag==FunkdatentaskD)
{taskflag=0;// volt_ges_berechnet ersetzt mit volt_ges!!!!!!!!!!!
sprintf(tx_funk,"D,%d,%d,%d,%d,%d,%d,*"CR,0,0,0,0,volt_ges,freierspeicher);
Funk_Transmit_s(tx_funk);
}
}
möchte den Inhalt des 4kB EEPROMS über Bluetooth an den PC schicken, einfach mal ans HTerm.
Problem: bekomme maximal ~2600Bytes durch.
Es sieht so aus als gebe es ein Zeitfenster in dem Daten durchgehen, alles danach wird verschluckt.
Hatte als Test nach 1000 Bytes ein delay von 500ms eingebaut, dann kommen weniger Daten an.
Habe aktuell alle 5 Bytes ein delay drinnen, da gehen nur ein paar hundert Bytes in Summe raus.
Hatte auch probiert einfach mal 8 Bytes pro Nachricht zu schicken und nicht jedes einzeln, analog wie die anderen Datensätze, bringt nichts.
Eigentlich geht die Verbindung, schicke 4x in der Sekunde 4 Datensätze raus, das geht problemlos über den ganzen Tag wenn es sein muss.
Ebenso Flashen über Bootloader.
Also wie bekomme ich die 4kB rüber???
LG!
19200Baud, über BTM222 an den PC.
#define Funk_Daten (UCSR0A & (1<<RXC0))
#define Funk_FrameError (UCSR0A & (1<<FE0))
#define Funk_Overrun (UCSR0A & (1<<DOR0))
#define Funk_Daten_Trans (UCSR0A & (1<<UDRE0))
#define Funk_Buffer UDR0
#define CR "\r\n"
Code für Übertragung:
void Funk_Transmit (unsigned char s)
{
while ( !( Funk_Daten_Trans) );
Funk_Buffer = s;
}
// string über Uart
void Funk_Transmit_s (char *s)
{
do
{
Funk_Transmit (*s);
}
while (*s++);
}
Daten aus EEPROM schicken (das delay ist rein aus Testzwecken drinnen, ohne gehen wie erwähnt ~2600Bytes durch)
void Daten_senden()
{
short temp;
unsigned char daten,x;
//cli();
Funk_Transmit_s("Daten_Anfang,"CR);
for (temp=0;temp<4096;temp++)
{
daten=eeprom_read_byte((const uint8_t *)temp);
sprintf(tx_funk,"%d",daten);
Funk_Transmit_s(tx_funk);
x++;if(x>5) {x=0;Funk_Transmit_s(CR);_delay_ms(150);}
}
Funk_Transmit_s("Daten_Ende"CR);
sei();
}
(ohne Interrupts ist es nicht besser)
Als Vergleich was im normalen Betrieb 4x die Sekunde rausgeht:
void TX_Funk(void)
{
unsigned char temp;
temp=(mowerspeed/231);
if (taskflag==FunkdatentaskA)
{taskflag=0;
sprintf(tx_funk,"A,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,*"CR,gpsodo,gps,pos_x,pos_y,richtung,drehzahl_ist,te mp,speed_li,speed_re,pos_x_ziel,pos_y_ziel);
Funk_Transmit_s(tx_funk);
}
if (taskflag==FunkdatentaskB)
{taskflag=0;
sprintf(tx_funk,"B,%d,%d,%d,%d,%d,%d,%d,*"CR,pitch,roll,richtung_kom,wochentag, jahr, tag, monat);
Funk_Transmit_s(tx_funk);
}
if (taskflag==FunkdatentaskC)
{taskflag=0;
sprintf(tx_funk,"C,%d,%d,%d,%d,%d,%d,%d,%d,*"CR,volt_ges,anzeige_modus,anzeige_fahrmodus,anzeig e_spirale,pos_x_gps_akt,pos_y_gps_akt,hdop,satcoun t);
Funk_Transmit_s(tx_funk);
}
if (taskflag==FunkdatentaskD)
{taskflag=0;// volt_ges_berechnet ersetzt mit volt_ges!!!!!!!!!!!
sprintf(tx_funk,"D,%d,%d,%d,%d,%d,%d,*"CR,0,0,0,0,volt_ges,freierspeicher);
Funk_Transmit_s(tx_funk);
}
}