Wie der Titel schon sagt, möchte ich, anstatt jeweils ein Byte an Informationen zu senden, eine ganze Zeichenfolge senden können. Ich habe versucht, die Benutzereingabe in ein Array zu schreiben und jedes Element dieses Arrays zu übertragen. Allerdings konnte ich nur die ersten paar Buchstaben dazu bringen, nicht das gesamte Array zu übertragen, hier ist mein Code:
//tx serial
#include <avr/io.h>
#define F_CPU 16000000
#define BUAD 9600
#define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1)
int main(void){
char ar[]= "hello";
//High and low bits
UBRR0H = (BUAD_RATE_CALC >> 8);
UBRR0L = BUAD_RATE_CALC;
////////////////
//transimit and recieve enable
UCSR0B = (1 << TXEN0)| (1 << TXCIE0) | (1 << RXEN0) | (1 << RXCIE0);
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); //8 bit data format
////////////////////////////////////////////////////////////////
int i = 0;
while (1){
while (( UCSR0A & (1<<UDRE0)) == 0){};
for (i = 0; i < strlen(ar); i++){
UDR0 = ar[i];
}
}
}
Was wäre das Problem dabei?
Nicht ganz sicher, nur eine schnelle Vermutung. Vielleicht sollten Sie die while(UDRE0 == 0){}
Sendezeichen dazwischen setzen. Ich glaube, es ist zu warten, bis ein Zeichen gesendet wurde.
for (i = 0; i < strlen(ar); i++){
while (( UCSR0A & (1<<UDRE0)) == 0){};
UDR0 = ar[i];
}
Also habe ich deinen Code ausprobiert und es funktioniert !! Als ich es jedoch tat, druckte es wie erwartet ununterbrochen Hallo aus, aber ich ließ es Null zurückgeben, damit es Hallo ausdruckte, sobald hier der Code ist:
//data_buffer
//tx serial
#include <avr/io.h>
#define F_CPU 16000000
#define BUAD 9600
#define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1)
#define buffer_size 128
#define boolen 0
int main(void){
char br;
char ar[]= "hello";
char buffer[10];
//High and low bits
UBRR0H = (BUAD_RATE_CALC >> 8);
UBRR0L = BUAD_RATE_CALC;
////////////////
//transimit and recieve enable
UCSR0B = (1 << TXEN0)| (1 << TXCIE0) | (1 << RXEN0) | (1 << RXCIE0);
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); //8 bit data format
////////////////////////////////////////////////////////////////
int i = 0;
while (1){
/*while( (UCSR0A & (1<<RXC0)) == 0 ){};
br = UDR0;
*/
while (( UCSR0A & (1<<UDRE0)) == 0){};
for (i = 0; i < strlen(ar); i++){
while (( UCSR0A & (1<<UDRE0)) == 0){};
UDR0 = ar[i];
if (i == (strlen(ar) - 1)){
return 0;
}
}
}
}
Ich möchte darauf hinweisen, dass einige zufällige Variablen und Dinge definiert sind, die ich nicht einmal verwende, sondern sie einfach ignorieren
Sie sollten für jede andere Frage, die Sie haben, eine neue Frage stellen ... Aber gut. Der folgende Code (Könnte ein bisschen im Arduino-Stil sein, aber es könnte dem Fragesteller helfen).
Der Setup
Code wird nur einmal zu Beginn Ihres Programms ausgeführt. Großartig, um Peripheriegeräte zu initialisieren und / oder eine Hallo-Nachricht / Startroutine zu senden. Der Loop
Code läuft ständig, normalerweise enthält dieser ein Programm wie blinkende LEDs ... oder das Sicherheitssystem eines Atomkraftwerks. Es ist jedoch nicht für die Rückgabe konzipiert, sondern für die Ewigkeit. Obwohl mein Code Sie in einer Weile (für immer) fangen wird; wenn du davon zurückkehren würdest.
Ich habe den Code nicht getestet, aber ich denke, es wäre dieser:
#include <avr/io.h>
#define F_CPU 16000000
#define BUAD 9600
#define BUAD_RATE_CALC ((F_CPU/16/BUAD) - 1)
//Function definitions
void Setup(void);
void Loop(void);
void serialSetup(void);
void serialSend(char* sendString);
//Global variables.
char ar[]= "hello";
void Setup(){
//Code to be run once (At start).
serialSetup();
serialSend(ar);
}
void Loop(){
//Code to be run continiously.
}
void serialSetup(){
//Register settings
//High and low bits
UBRR0H = (BUAD_RATE_CALC >> 8);
UBRR0L = BUAD_RATE_CALC;
//transimit and recieve enable
UCSR0B = (1 << TXEN0)| (1 << TXCIE0) | (1 << RXEN0) | (1 << RXCIE0);
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); //8 bit data format
}
void serialSend(char* sendString){
for (int i = 0; i < strlen(sendString); i++){
while (( UCSR0A & (1<<UDRE0)) == 0){};
UDR0 = sendString[i];
}
}
int main(void){
Setup();
while(1){
Loop();
}
while(1){}//If you ever return from Loop(); This while will catch you, so it won't continue doing randomness.
}
Golaž
Redrachet2
Redrachet2
Paul
Paul
while((
blockiert und einiges an "CPU-Zeit" verschwenden kann, normalerweise mehr bei niedrigeren Baudraten. Durch die Verwendung von Sendeunterbrechungen können Sie das Schreiben "im Hintergrund" durchführen.