Hallo hilfreiche Community,
ich befasse mich gerade etwas ausführlicher mit dem Terminalprogramm
Tera Term. Dazu habe ich zwei Fragen. Könntet Ihr sie mir bitte
beantworten.
1.Kann Tera Term auch die von zwei separaten uC gesendeten Daten
gleichzeitig empfangen?
Im gleichen Zusammenhang steht meine nächste Frage.
Ich würde die gesendeten Daten im Code so formatieren wollen, dass ich
Sie bei Tera Term als .csv Datei abspeichern kann.
2.Kann mir Tera Term die eingegangen Daten nach der Reihenfolge des
Eingehens nummeriert darstellen oder müsste ich das in meinem Programm
für den uC selber programmieren?
FG
fragenkinsey
Julian Kinsey schrieb:> Hallo hilfreiche Community,>> ich befasse mich gerade etwas ausführlicher mit dem Terminalprogramm> Tera Term. Dazu habe ich zwei Fragen. Könntet Ihr sie mir bitte> beantworten.>> 1.Kann Tera Term auch die von zwei separaten uC gesendeten Daten> gleichzeitig empfangen?
Die Frage reduziert sich im wesentlichen zu:
Kann TeraTerm mehrere Connections gleichzeitig in einer einzigen Sitzung
offen haben.
(Denn wer am anderen Ende der Leitung sitzt, ist dem Terminal ja egal).
Das ist eine etwas ungewöhnliche Forderung. Es würde mich stark wundern,
wenn es ein Terminal-Programm gäbe, das so etwas unterstützt. Denn das
Problem entsteht ja in der umgekehrten Richtung: An wen soll denn das
Terminal Benutzereingaben schicken, wenn mehrere Verbindungen zur
Auswahl stehen?
Du kannst natürlich die Terminal-Emulation mehrmals starten, jedes
Terminal an eine andere Schnittstelle binden und dann in 2 getrennten
Fenstern operieren. Das sollte kein Problem sein. Aber deine Anfrage
klingt eher danach, als ob du genau das nicht willst.
> Im gleichen Zusammenhang steht meine nächste Frage.>> Ich würde die gesendeten Daten im Code so formatieren wollen, dass ich> Sie bei Tera Term als .csv Datei abspeichern kann.> 2.Kann mir Tera Term die eingegangen Daten nach der Reihenfolge des> Eingehens nummeriert darstellen oder müsste ich das in meinem Programm> für den uC selber programmieren?
Das wäre ein realistisches Feature für eine Terminal-Emulation. Gesehen
habe ich es so noch nie. Was sagt das Handbuch dazu?
> Ich würde die gesendeten Daten im Code so formatieren wollen, dass ich> Sie bei Tera Term als .csv Datei abspeichern kann.
Wenn es dir sowieso nur darum geht, von einem oder mehreren µC aus eine
Möglichkeit zum Speichern in eine Datei zu haben, würde ich mir
überlegen, ob ich dafür nicht ein spezielles Programm auf dem PC
schreibe, welches genau das und nur das beherrscht.
Karl Heinz schrieb:> Du kannst natürlich die Terminal-Emulation mehrmals starten, jedes> Terminal an eine andere Schnittstelle binden und dann in 2 getrennten> Fenstern operieren. Das sollte kein Problem sein.
Doch genau das möchte ich. Es ist also möglich jeden der beiden uC an -
sagen wir - je ein USB-Port anzuschließen und mit Tera Term zwei
Sitzungen/Fenstern zu öffnen. Dabei gibt jedes Fenster die gesendeten
Daten genau eines uC aus.
Einfach super! Vielen Dank!
@RS232:
Bezieht sich deine Posting auf die erste und zweite Frage? Im Internet
habe ich zwar ShamCom4 gefunden, aber nicht, ob es die eingegangenen
Daten durchnummeriert.
3.Frage:
In der Tere Term Hilfe habe ich folgendes gelesen:
AUTO
Received CR ($0D) or LF ($0A) character is converted to CR+LF ($0D $0A)
pairs.
e.g.) If "CR+LF" are received, it is not converted.
If "CR" is received, it is converted to "CR LF."
If "LF" is received, it is converted to "CR LF."
Soll das heißen, dass ich in meinem C-Programm folgendes schreiben
sollte, wenn ich einen Zeilenumbruch in Tera Term bewirken möchte?
Julian Kinsey schrieb:> Soll das heißen, dass ich in meinem C-Programm folgendes schreiben> sollte, wenn ich einen Zeilenumbruch in Tera Term bewirken möchte?>> void usart_putc ( unsigned char c)> {>> while (UCSR1A != (UDRE1)) {}>> UDR1=c;>> while (UCSR1A != (UDRE1)) {}>> UDR1='\r';>> while (UCSR1A != (UDRE1)) {}>> UDR1='\n';> }>> Würde das so funktionieren?
ja, die Bescheibung besagt, das ein einzelnes CR oder LF jeweils zu CRLF
convertiert wird.
Damit kannst du entweder CRLF oder CR oder LF senden und erhälst immer
ein CRLF!
Sascha
Julian Kinsey schrieb:> sollte, wenn ich einen Zeilenumbruch in Tera Term bewirken möchte?>> void usart_putc ( unsigned char c)> {>> while (UCSR1A != (UDRE1)) {}>> UDR1=c;>> while (UCSR1A != (UDRE1)) {}>> UDR1='\r';>> while (UCSR1A != (UDRE1)) {}>> UDR1='\n';> }>> Würde das so funktionieren?
Aber bitte nicht so schreiben :-)
Sondern so
1
voidusart_putc(unsignedcharc)
2
{
3
while(UCSR1A!=(UDRE1)){}
4
UDR1=c;
5
6
usart_putc('\r');
7
usart_putc('\n');
8
}
... wenn du wirklich nach jedem gesendeten Zeichen einen Zeilenvorschub
haben willst (was ich mal bezweifle)
Karl Heinz schrieb:> void usart_putc ( unsigned char c)> {> while (UCSR1A != (UDRE1)) {}> UDR1 = c;>> usart_putc( '\r' );> usart_putc( '\n' );> }
wird das nicht in einer Endlosrekursion enden?
chester schrieb:> Karl Heinz schrieb:>> void usart_putc ( unsigned char c)>> {>> while (UCSR1A != (UDRE1)) {}>> UDR1 = c;>>>> usart_putc( '\r' );>> usart_putc( '\n' );>> }>> wird das nicht in einer Endlosrekursion enden?
:-)
Mea culpa.
Du hast natürlich recht.
Also eher so
1
voidusart_putc(unsignedcharc)
2
{
3
usart_out(c);
4
usart_out('\r');
5
usart_out('\n');
6
}
7
8
voidusart_out(unsignedcharc)
9
{
10
while(UCSR1A!=(UDRE1)){}
11
UDR1=c;
12
}
ich bezweifle allerdings, dass er das tatsächlich wirklich will. Nach
jedem Zeichen einen Zeilenvorschub :-)
Waraufs mir ankommt: nicht Code duplizieren (in diesem Fall die Ausgabe
eines Zeichens), sondern die Funktionalität 'Ausgabe eines Zeichens' als
Baustein benutzen, über den dann alles weitere abgewickelt wird. Dieser
Baustein 'Ausgabe eines Zeichens' soll dann auch tatsächlich das sein
und nicht mehr: er gibt 1 Zeichen aus.
Denn spätestens wenn die Systeme dann komplexer werden, wenn FiFos
eingebaut werden, wenn Handshake berücksichtigt werden muss, wird das
sonst ganz schnell komplex und unübersichtlich. Hat man aber diesen
einen Baustein für sich gekapselt, dann kommen diese Erweiterungen genau
da hinein, und der Rest (wie das Nachschieben eines CR+LF) bleibt davon
unberührt.
Ich hätte es eher so verstanden, das beide µC mit je einer V24 mit dem
PC verbunden sind, das Programm beide Eingänge zeilenweise puffert und
jeweils, bei Zeilenende (mit lfd. Nummer, oder Zeitstempel), an die
Datei anhängt.
Wenn beide µC an einem Bus (RS485?) hängen würden, wäre es einfacher,
dann bestünde aber die Gefahr von Kollisionen.
mfG vom ingo
@ Sascha Weber:
danke für deine Antwort! Also reicht ja - wie du schon erwähnt hast -
entweder usart_putc( '\r' ) oder usart_putc( '\n' ) aus. Hier habe ich
schon den Verbesserungsvorschlag von Karl Hein involviert.
@ Karl Heinz:
Karl Heinz schrieb:> Sondern so void usart_putc ( unsigned char c)> {> while (UCSR1A != (UDRE1)) {}> UDR1 = c;>> usart_putc( '\r' );> usart_putc( '\n' );> }>> ... wenn du wirklich nach jedem gesendeten Zeichen einen Zeilenvorschub> haben willst (was ich mal bezweifle)
Zu Recht zweifelst du daran. Wenn ich also erst nach einer Zeichenkette
s einen Zeilenumbruch in Tera Term haben wollte, dann sollte das so
aussehen:
1
intmain()
2
{
3
uint16_twert=65535;
4
chars[7];
5
6
utoa(wert,s,10);
7
usart_puts(s);
8
usart_putc('\n');
9
}
10
11
voidusart_putc(unsignedcharc)
12
{
13
while(UCSR1A!=(UDRE1)){}
14
UDR1=c;
15
}
16
17
voidusart_puts(char*s)
18
{
19
while(*s!='\0'){usart_putc(*s);s++;}
20
}
1.Könnt ihr das bestätigen?
2.Könnte es hierbei keine Probleme mit usart_putc('\n') geben, weil void
usart_putc(unsigned char c) einen vorzeichenlosen Charakter erwartet,
aber stattdessen ein '\n' kiregt?
FG
fragenkinsey
Julian Kinsey schrieb:> 1.Könnt ihr das bestätigen?
Sieht gut aus.
Einschub: Bis auf die Formatierung. Gewöhn dir konsistente Formatierung
an. Selbst wenn ein Teil ein einem {-} Block nur sehr kurz ist, sollte
das ordentlich angeschrieben werden.
1
voidusart_putc(unsignedcharc)
2
{
3
while(UCSR1A!=(UDRE1))
4
{
5
}
6
7
UDR1=c;
8
}
9
10
voidusart_puts(char*s)
11
{
12
while(*s!='\0')
13
{
14
usart_putc(*s);
15
s++;
16
}
17
}
das sieht zwar jetzt nach Krümelkacken aus, aber spätestens wenn deine
Funktionen größer werden, ist saubere Formatierung lebenswichtit. Und
die fängt bereits bei kleinen Funktionen an. Das muss in Fleisch und
Blut übergehen.
> 2.Könnte es hierbei keine Probleme mit usart_putc('\n') geben, weil void> usart_putc(unsigned char c) einen vorzeichenlosen Charakter erwartet,> aber stattdessen ein '\n' kiregt?
Das ist in diesem Fall schon ok.
Man könnte auch usart_putc zu einer Funktion ändern, die einen normalen
char bekommt.
Aber da an dieser Stelle nichts gemacht wird, ausser die Daten
'durchzureichen', spielt es keine Rolle, ob der char jetzt signed oder
unsigned ist.
@ Karl Heinz,
vielen Dank für die Überprüfung, die Korrektur und die Erklärung. Ich
möchte in Zukunft auch auf die Form beim Programmieren achten.
FG
fragenkinsey