-
Leider muss ich jetzt hier nochmal pushen um dass Thema mal wieder aufzuwerfen.
Ich hab leider ein großes Problem:
Ausgangslage: Ich "benutze" meinen Roboter mit dem HyperTerminal -> alles geht gut und ist lesbar
VB: Ich empfang bei Encoding default keine Zahlen. (Scheint wohl Ascii zu sein)
Stell ich das Encoding manuell auf Unicode oder BigEndianUnicode, dann hab ich zwar alle Zahlen, aber der Text stellt sich mir nur Kästchen dar. Ich hab leider keinen Plan was da los ist und was ich ändern soll. Vorallem, da dass Hyperterminal, welches auf ANSI Terminalerkennung gestellt ist, alles richtig macht.
Ne Idee? Danke. Ich häng hier gleich noch meine VB Datei an.
Andun
http://www.subms.de/files/SUBMESS_PC_Client.rar
-
Hi,
Das Encoding muss auf ASCII stehen.
An die "Zahlen" kommst du dann per Asc(Zeichen As String) ran. Das musst du dann irgendwo bei deiner Empfangsroutine einfügen...
(ich weiß, das ist kein schönes VB.NET, es sei mir verziehn ;))
Gruß Cowz
-
Moin
Achso ... :D Wenn ich die erst wieder zurückwandeln muss ... ist aber schon seltsam ... Naja, danke. Werd ich so machen.
Nachtrag:
Also ich versteh jetzt aber immer noch nicht, wie dass dann gehen soll? Ich wandel ja im µC schon die Zahlen in ihr Ascii pendant um, deswegen funktioniert es ja auch im Hyperterminal ...
Oder ich hab dich noch nciht richtig verstanden.
Danke
Andun
Nachtrag:
Ich hab es jetzt über folgende Konstruktion, welche aber sichtlich langsam alles aufbaut gelöst. Wenn du bitte ne besser Lösung hast, wäre ich dankbar.
Code:
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
Do
If SerialPort1.ReadBufferSize = 0 Then
Exit Do
End If
Me.SetText(Chr(SerialPort1.ReadChar()))
Loop
'Me.SetText(SerialPort1.ReadExisting) <-- ging ja nciht
End Sub
-
Hi,
ansich müsste ReadExisting dir direkt den Text (also als ASCII Zeichen kodiert (65 => A)) ausgeben.
Bist du sicher dass du
Connection.Encoding = System.Text.Encoding.ASCII
gemacht hast?
Gruß, CowZ
-
Moin
Also:
Ich habe jetzt nochmal alles ausprobiert und habe immer noch die gleichen Symptome. Hier seht hier mal alles:
So sieht es im Hyperterminal aus und auch in meiner Variante mit der Schleife über jeden einzelen char wie ich oben gepostet habe:
Code:
COM1 als aktiven Port ausgewählt
Verbindung wurde geöffnet
Geschrieben wurde: 6
Alle Werte aus dem EEPROM auslesen
18:07:41 08.01|87|188|97
18:10:00 08.01|87|188|97
22:32:57 08.01|87|188|97
22:39:00 08.01|87|188|97
22:39:25 08.01|87|188|98
22:40:00 08.01|87|188|98
22:49:15 08.01|87|188|97
22:50:00 08.01|87|188|97
22:51:33 08.01|87|188|98
22:52:19 08.01|87|188|98
22:57:00 08.01|87|188|97
22:58:24 08.01|87|188|97
usw.
So, sieht es aus, wenn ich das Encoding immer noch auf Ascii lasse, aber die Variante mit ReadExisting nutze:
Code:
COM1 als aktiven Port ausgewählt
Verbindung wurde geöffnet
Befehl eingeben: Geschrieben wurde: 6
Alle Werte aus dem EEPROM auslesen
188:08|88
8
30.877|20 0|972:017188:18|88
8
54.877|26 0|983:017188:08|88
8
59.877|23 0|983:018
Wenn ich das Encoding auf Unicode stelle wird seltsamerweise zwar nicht mehr an Inhalt angezeigt, aber die Formatierung bei der Uhrzeit nimmt bessere Formen an:
Code:
COM1 als aktiven Port ausgewählt
Verbindung wurde geöffnet
扁瑳湡獤敳獮牯湥›㈀㔵ഀ䈊瑩整䈠晥桥楥杮扥湥›獅猠湩 楍ഠ 楄敬穴整䴠獥畳杮眠牡甠 䴠湩*⸮*敭獳湥⸠⸮䄀汬獥洠獥敳൮
汁敬圠牥整搠牥氠瑥瑺湥愠瑫敵汬湥䴠獥畳杮猠数捩敨湲മ
asd摁敲獳㩥 ㈲7ഠ
湅敤猠数捩敨湲⤨മ
Geschrieben wurde: 6
汁敬圠牥整愠獵搠浥䔠偅佒⁍畡汳獥湥㠀㨀 㜀㨀㐀 㠀⸀ 簀㠀7|㠱8|㜹ഀ
18:10:00 08.01|㜸簀㠸簀㤀7㈀㈀㨀㌀㈀㨀㔀㜀 㠀⸀ 簀㠀7|㠱8|㜹ഀ
22:39:00 08.01|㜸簀㠸簀㤀7㈀㈀㨀㌀㤀㨀㈀㔀 㠀⸀ 簀㠀7|㠱8|㠹ഀ
22:40:00 08.01|㜸簀㠸簀㤀8㈀㈀㨀㐀㤀㨀㔀 㠀⸀ 簀㠀7|㠱8|㜹ഀ
22:50:00 08.01|㜸簀㠸簀㤀7㈀㈀㨀㔀㨀㌀㌀ 㠀⸀ 簀㠀7|㠱8|㠹ഀ
22:52:19 08.01|㜸簀㠸簀㤀8㈀㈀㨀㔀㜀㨀 㠀⸀ 簀㠀7|㠱8|㜹ഀ
22:58:24 08.01|㜸簀㠸簀㤀7㈀㌀㨀 㨀 㠀⸀ 簀㠀7|㠱8|㠹ഀ
23:26:04 08.01|㜸簀㠸簀㤀8㈀㌀㨀㈀㜀㨀 㠀⸀ 簀㠀7|㠱8|㠹ഀ
23:27:06 08.01|㜸簀㠸簀㤀7㈀㌀㨀㈀㤀㨀㈀ 㠀⸀ 簀㠀7|㠱8|㜹ഀ
23:30:00 08.01|㜸簀㠸簀㤀8㈀㌀㨀㔀 㨀㐀㔀 㠀⸀ 簀㠀7|㠱8|㜹ഀ
23:53:39 08.01|㜸簀㠸簀㤀7㈀㈀㨀㔀㨀㔀㜀 㤀⸀ 簀㠀7|㠱8|2:53:27 09.01|㜸簀㠸簀㤀8㈀㈀㨀㔀㌀㨀㔀㠀 㤀⸀ 簀㠀7|㠱8|㠹ഀ
23:00:00 09.01|㜸簀㠸簀㤀8㈀㌀㨀 㨀 㤀⸀ 簀㠀7|㠱8|㠹ഀ
(Wie ich hier im Fenster grade sehe ist wohl ein Steuerzeichen für rechts nach links schreiben drinne, deswegen dass umdrehen, aber ich finde es beachtlich, dass hier die Formatierung mit Doppelpunkten bei der Uhrzeit stimmt, was bei Ascii ja nicht der fall ist)
Kann mir dass zufällig jemand ekrlären?
Hier die Datei:
http://www.subms.de/files/SUBMESS_PC_Client2.rar
(Ich weiß, dass die Fehlerbehandlung bei der Variante noch nicht richtig ist, aber das ist erstmal egal)
Danke
Andun
-
Hi,
das einzige, was dich an der "ReadExisting"-Variante stört, sind doch die ungewollten Zeilenumbrüche oder?
Das liegt dann vermutlich entweder daran, dass er nach jedem Empfangendatenblock automatisch ein Zeilenumbruch sendet, oder deine Funktion zum Empfangen das macht... Kannst du diese Funktion nochmal posten? :)
Gruß, CowZ
-
Ne :D Leider sind es nicht nur die Umbrüche. Wenn du dir mal die gewollte ausgabe (1.) anschaust, siehst du dass die Daten auch gut für Menschen lesbar sind, mit Datum und dann 3 Werte getrennt durch einen |. Das ist leider bei der 2. Variante nicht der Fall.
Zum senden vom Robo aus, benutze ich die Funktionen aus dem RN Wiki + Asuro PrintInt sieht dann zusammen so aus:
uart.c
Code:
/*
UART Funktionen
*/
#include <avr/io.h>
#include "uart.h"
#include <stdlib.h>
#define UART_BAUD_RATE 9600
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_CPU)/((UART_BAUD_RATE)*16L)-1)
void uart_init()
{
UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
// UART Receiver und Transmitter anschalten
// Data mode 8N1, asynchron
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
// Flush Receive-Buffer
do
{
unsigned char dummy;
(void) (dummy = UDR);
}
while (UCSRA & (1 << RXC));
}
void uart_puts (const char *s)
{
do
{
uart_putc (*s);
}
while (*s++);
}
/*Gibt einen Integer über die UART Schnittstelle aus*/
void PrintInt(int a){
char temp[10];
itoa(a,temp,10);
uart_puts(temp);
}
/*Übernommen und abgewandelt aus der Asuro Lib 2.6
ACHTUNG: In *data muss eine Platz mehr sein, als die Zeichenkette! (/0 Zeichen)
*/
void SerRead(unsigned char *data, unsigned char length,unsigned int timeout)
{
unsigned char i = 0;
unsigned int time = 0;
if (timeout != 0) {
while (i < length && time++ < timeout) {
if (UCSRA & (1 << RXC)) {
data[i++] = UDR;
time = 0;
}
Msleep(10);
}
if (time > timeout) data[0] = 'T';
}
/* blocking */
else {
while (i < length) {
if (UCSRA & (1 << RXC))
data[i++] = UDR;
}
}
data[length] = 0;
}
uart.h
Code:
/*
Header für uart.c
------------------------
Johannes Kreuzer - 2006
*/
#ifndef _UART_H_
#define _UART_H_
#include <avr/io.h>
extern void uart_init(void);
extern void Msleep(int dauer);
static inline void uart_putc (const char c)
{
while (!(UCSRA & (1 << UDRE)))
;
UDR = c;
}
static inline int uart_getc_wait(void)
{
while (!(UCSRA & (1 << RXC)))
;
return (int) UDR;
}
static inline int uart_getc_nowait(void)
{
return (UCSRA & (1 << RXC)) ? (int) UDR : -1;
}
#endif /* _UART_H_ */
/*Sendet einen String*/
void uart_puts (const char *s);
void PrintInt(int a);
void SerRead(unsigned char *data, unsigned char length,unsigned int timeout);
Andun
-
Mhhh komischer Fehler... Kann ich dir leider nicht weiterhelfen, sry...
Gruß, CowZ
-
Ja, ok. :D Hab ich ehrlich gesagt auch fast schon vermutet.
Ich werde jetzt einfach die Variante mit der Schleife nehmen... ich vermute ja auch irgendwie dass das irgendwas mit dem Timing zu tun hat oder irgendwas ... da sich die fehlerhafte ausgabe ändert, wenn der Ticker nebenher läuft. Also dann ist sie anders falsch. :D Aber so mit der Schleife gehts.
Danke trotzdem für die Mühen.
Andun