Forum: Mikrocontroller und Digitale Elektronik 2 Fragen zu Tera Term


von Julian K. (fragenkinsey)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rs232 (Gast)


Lesenswert?

Shamrock unicom, gibt's schon seit 1000 Jahren.

von Julian K. (fragenkinsey)


Lesenswert?

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?
1
void usart_putc ( unsigned char c)
2
{  
3
  
4
  while (UCSR1A != (UDRE1)) {}     
5
  
6
  UDR1=c;      
7
  
8
  while (UCSR1A != (UDRE1)) {}
9
  
10
  UDR1='\r';
11
  
12
  while (UCSR1A != (UDRE1)) {}
13
  
14
  UDR1='\n';
15
}
Würde das so funktionieren?

FG
fragenkinsey

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
void usart_putc ( unsigned char c)
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)

von chester (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
void usart_putc ( unsigned char c)
2
{
3
  usart_out( c );
4
  usart_out( '\r' );
5
  usart_out( '\n' );
6
}
7
8
void usart_out( unsigned char c)
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.

: Bearbeitet durch User
von ingo (Gast)


Lesenswert?

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

von Julian K. (fragenkinsey)


Lesenswert?

@ 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
int main() 
2
{
3
uint16_t wert= 65535;
4
char s[7];
5
6
utoa(wert, s, 10);
7
usart_puts (s);
8
usart_putc('\n');
9
}
10
11
void usart_putc ( unsigned char c)
12
{  
13
  while (UCSR1A != (UDRE1)) {}     
14
  UDR1=c;                  
15
}
16
17
void usart_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

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

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
void usart_putc ( unsigned char c)
2
{  
3
  while (UCSR1A != (UDRE1))
4
  {
5
  }     
6
7
  UDR1=c;                  
8
}
9
10
void usart_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.

: Bearbeitet durch User
von Julian K. (fragenkinsey)


Lesenswert?

@ 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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.