Laden...

Forenbeiträge von Zumlin Ingesamt 20 Beiträge

12.07.2008 - 18:28 Uhr

Also ich bin gerade wieder über den Code in meinem Programm gestolpert. Leider funktioniert das ganze nicht so super. Die Umwandlung funktioniert nicht zuverlässig. Leider kommt es immer wieder zu Fehlern z.B. wird 0xC2 0x83 0xAF oder so zweimal in der Antowrt aufgeführt. Mein Workaround ist wie oben im Quelltext zu sehen:


//...
if(buffer[r] == 0xC2) // wobei mittlerweile einige andere noch aufgeführt sind
    {
      for(int k = r; k<buffer.Length-1;k++)
         buffer[k] = buffer[k+1];
      laenge--;
    }
//...

Woran liegt das, dass hier immer wieder Fehler entstehen? Ich habe keine Ahnung. Ich beziehe mich hier auf meinen zuletzt geposteten Quellcode.

Ich hoffe der Thread ist nicht zu alt und es lesen ihn doch wieder ein paar Leute 😉

20.06.2008 - 11:54 Uhr

Ahhh, ok. Funktioniert. War ja garnicht so kompliziert wie vermutet 🙂


//global
TcpClient client = null;
NetworkStream stream = null;

//Funktion verbinden
client =  new TcpClient();
client.Connect(sIP,i32Port);         
stream = client.GetStream();

//Funktion trennen
this.stream.Close();
this.client.Close();

20.06.2008 - 10:50 Uhr

Hallo zusammen.

Ich versuche gerade meinem Programm die Möglkichkeit zu geben, sich "reconnecten" zu können. Dazu schließe ich die Verbindung einfach und dann öffne ich sie wieder. Dabei habe ich mich hierran gehalten: http://support.microsoft.com/kb/821625/de
Leider bekomme ich beim erneuten Verbinden nach dem Trennen immer die Meldung:
"Auf das verworfenen Objekt kann nciht zugegriffen werden. Objektname: System.Net.Sockets.TcpClient"

Hier noch ein Quikie dazu:


//global
TcpClient client = new TcpClient();
NetworkStream stream = null;

//Funktion verbinden
client.Connect(sIP,i32Port);           // <-- hier fällt die exeption beim erneuten verbinden
stream = client.GetStream();

//Funktion trennen
this.stream.Close();
this.client.Close();

Irgendwas muss ich anders schließen, nur was? 🙂

12.06.2008 - 13:35 Uhr

Ok meine Lösung wäre (wobei die schon wirklich scheiße ist):


public static string HexToAsc(string str)
        {
            string[] hex = str.Split();
            string result = null;
            for (int i = 0; i < hex.Length; ++i)
                result += (char)Convert.ToUInt16(hex[i], 16);
            return result;
        }

Dann vor dem senden umwandeln in ein byte-array und gegebenefalls falsche zeichen rausschmeißen:


string asciistringtisend = HexToAsc(stringtosend);
byte[] buffer = Encoding.UTF8.GetBytes(asciistringtosend);
int laenge = buffer.Length;
for( int r= 0; r<laenge;r++)
{
i  f(buffer[r] == 0xC2)
    {
      for(int k = r; k<buffer.Length-1;k++) 
         buffer[k] = buffer[k+1];
      laenge--;
    }
}
byte[] befehl = new byte[laenge];
for(int l = 0; l<lange;l++)
   befehl[l] = buffer[l];
//senden...

Nicht schön, aber funktioniert scheinbar....

11.06.2008 - 15:45 Uhr

Nicht ganz

Wenn ich den Strig "02 00 AA BB 00 00 00 00" mit HexToAsc umwandle...


public static string HexToAsc(string str)
        {
            string[] hex = str.Split(' ');
            string result = null;
            for (int i = 0; i < hex.Length; ++i)
            {
                uint n = Convert.ToUInt16(hex[i], 16);

                if (mostSignificantBitPosition(n)% 7 == 0)
                {
                    result += hex[i].ToString();
                }
                else
                    result += (char)n ;
            }
            return result;
        }

und dann in eine byte-Array wandle


byte[] buffer = Encoding.ASCII.GetBytes(umgewandelterstring);

... bekomme ich ein Array mit folgenden Werten:
0x02 0x00 0x41 0x41 0x42 0x42 0x00 0x00 0x00 0x00

...ich möchte aber
0x02 0x00 0xAA 0xBB 0x00 0x00 0x00 0x00

Das funktionierte auch mit folgendem Code:


        public static string HexToAsc(string str)
        {
            string[] hex = str.Split();
            string result = null;
            for (int i = 0; i < hex.Length; ++i)
                result += (char)Convert.ToUInt16(hex[i], 16);
            return result;
        }

solange das MSB nicht gesetzt war.

Sorry, dass ich immer so selbstverständlich frage, aber hab echt keinen Plan wie ich das machen soll.

11.06.2008 - 12:53 Uhr

@Mystique

Ich will hald "FF" in '0xFF' wandelen und meine Antowrt darauf (z.B. '0xAA') wieder zurück in einen String (also "AA"). Dass das kein gültiges ASCII Zeichen ist, weiß ich, aber ich will ja auch nicht das ASCII Zeichen zum Wert ausgeben lassen, sondern diesen lediglich visualisieren.
Ich habe mich da ein bißchen ungeschickt asgedrückt glaube ich. Ich will also '0x40' nicht zu "@" wandeln, sondern in "40"!
Mit den obigen Funktionen funktioniert das auch gut, solange sich die ASCII-Werte als MSB 0 haben.

11.06.2008 - 10:19 Uhr

Hmm. So ganz funktionierts noch nicht.

Bei der HexToAsc Funktion habe ich das Problem, dass sobald das MSB des Zeichens 1 wird, mir nur '0x3F' rückgegeben wird. Das hat sicher was damit zu tun, dass die "normale" Ascii-Tabelle nur 7 von 8 bits nützt, aber wie kann ich nun z.B. 0xFF umwandeln?

06.06.2008 - 12:31 Uhr

Ahh. Danke. Das ist glaube ich genau das was ich gesucht habe. Das werde ich mal testen sobald ich an meinen Rechner wieder komme. Ist leider mein Praktikantenrechner in der Arbeit. Allgemein kann ich nur sagen, dass ich normalerweise in C für µC programmiere und daher mit C# noch keine Erfahrungen habe. Daher die ganze Fragerei 🙂
Aber wie gesagt, danke für die Hilfe!

05.06.2008 - 16:41 Uhr

Jetzt muss ich aber leider den Weg zurück gehen.
Ich bekomme ein Antwort die in ein byte[] gepscihert wird. Diese sieht so aus:
0x00;0x00;0x0B;0x00
Das ganze iost als Hex-Stream zu sehen.

Wie bekomme ich diesen HexStream nun in einen String. Egal in welcher Form, wobei am schönsten schon "00 00 0B 00" wäre.
🙂

05.06.2008 - 14:37 Uhr

Funktioniert doch. Fast.
Wenn ich zb "F" oder "0F" schicke klappts. "0F12" kommt als 3F Ascii Wert an....

[edit]
es scheint, dass bei dem Split() der Komplette String in hexstring[0] zu sein scheint....

[edit2]
Also mit Split(' ') funktioniertes einwandfrei. Der String sieht dann eben so aus: "01 02 03"

Danke!

05.06.2008 - 13:44 Uhr

Hallo zusammen,

ich hab da ein Problem und weiß einfach nicht wie ich das lösen soll.

Ich habe einen String in dem Hexwerte stehen. Also kann der String z.B. so aussehen: "0102030405060708090A0B0C0D0E0F".
Das ganze will ich übers Netzwerk verschicken. Wenn ich das machen, dann kommt auf der Gegenseite auch der String an. Ich will jedoch nicht den String verschicken, sondern die Hexwerte. Es soll also wenn ich den String "40" verschicke bei der Gegenseite der Sring"@" ankommen, was eben 0x40 in der ASCII Tabelle darstellt. Nur leider bin ich zu blöd das in c# zu Programmieren... 🙂

23.01.2008 - 23:34 Uhr

🙂
Ok. Dann starte ich wohl doch lieber nen Timer. Das mit der Queue überfordert mich nun wirklich. Ich habe nie C# gelernt und kann nur das, was ich mir erklären kann oder umbedingt erklären muss.

23.01.2008 - 23:21 Uhr

Hmm. Aber das hindert meine Funktion ja nicht alle Werte der Liste nacheinander zu senden. Ich habe versucht das Problem ohne Timer zu lösen, aber leider funktioniertzs nicht. Hier mal meine Idee:


Filestream fs = new .....
Streamreader r = new ...
r.BaseStream.Seek(0,SeekOrogin.Begin);
string usernummer;
while(r.Peek() >-1)
{
  usernummer = r.Readline();
  Bsenden("validate"+usernummer,"b");
  //jetzt soll gewartet werden, bis TextBox1 z.B. "validatepassed" angehängt bekommt
  while(!(this.textbox1.Text.EndsWith("validatepassed")))
    {
      //hier hänge ich mich noch an den Zeitüberlauf dran. Tut aber jetzt nichts zur Sache
    }
}

Leider Springt das Prog gleich aus der Schleife raus bzw. mein Arbument für die Schleife ist immer false. Mit "!" dreht man schon true in false und andersrum, oder?

23.01.2008 - 22:51 Uhr

@blackcoin
Hmm. Klingt gut. Warum komm ich da nicht einfach selber drauf. Hoffte aber irgendwie auch auf ne schönere Lösung. Für mich sind Timer was hässliches 🙂

@rizi
Ich glaube sowas hab ich gesucht. ICh weiß aber absolut nicht wie ich sowas mache. Hast du da evtl nen Codeschnipsel für mich?

23.01.2008 - 22:29 Uhr

Hallo,
hier wieder mal ne (banale) Frage von mir.
ICh schreibe gerade an einem Prgramm, dass mit meinem µC kommunizieren soll. Nun bin ich auf folgendes Problem gestoßen.
Ich öffne in einer Funktion nen FileStream auf ne Datei und lese daraus Zeile für Zeile. Jede Zeile schicke ich an meinen µC. Dieser schickt mir eine Art Handshake zurück.
Was mein Programm bis jetzt macht ist aber zu schnell für meinen kleinen Controller. Ich will also meine Unterfunktion solange schlafe schicken, bis ich die richtige Antwort von meinem Controller in meinem Textfeld stehen habe. Wie macht man sowas?
Hier mal ein schemenhafter Auszug aus dem betreffenden Code:

Filestream fs = new .....
Streamreader r = new ...
r.BaseStream.Seek(0,SeekOrogin.Begin);
string usernummer;
while(r.Peek() >-1)
{
  usernummer = r.Readline();
  Bsenden("validate"+usernummer,"b");
  //jetzt soll gewartet werden, bis TextBox1 z.B. "validatepassed" angehängt bekommt
}

Ich hoffe das hab ich einigermasen gut beschrieben 😉

Danke schon mal fürs lesen

31.12.2007 - 16:03 Uhr

Aso.
Also so wie ich das sehen, habe ich von Form2 aus keinen Zugriff auf serialport1, welches in der Bsend() Funktion benutzt wird, von Form1. serialport1 hab ich einfach per Drag&Drop in die Form1 eingefügt.
Irgendwie muss ich das also auch noch vererben oder invoken. Wie oder was genau ich tun muß weiß ich nicht. Hab ehrlich gesagt keinen Ahnung.

Was meintest du eigentlich bzw. bezwirkst du mit

this.frm1 = var;

in deinem ersten Beitrag?

30.12.2007 - 20:17 Uhr

Das ist ja lustig. In meiner Sendenfunktion ist eine Abfrage drin:


...
if (!serialPort1.IsOpen)
                return;
...

Da springt mein Programm immer rein, wenn ich die Funktion von der Form2 aus aufrufe. Das ist ja lustig. Warum macht denn meine Schnittstelle zu, wenn ich die blöde Form2 aktiviere?

30.12.2007 - 19:40 Uhr

@juetho

Puhh. Das überseteigt mein Verständniss bei weitem. Ich habs mal probiert, aber so richtig wissen was zu tun ist tu ich nicht. Und so wie ich das eingebaut hab funktionierts auch nicht. Wenn ich "Form2.Init(" in Form1 eintippe, dann kommt nicht mal ne Autovervollständigung...
Da würd mir die "unschöne" Lösung schon besser gefallen. Das Programm soll auch lediglch mal laufen. Ob unsauber oder nicht ist mir erst mal egal.

@vorheriges Problem

Also da Google ja der Ferund aller Dummen ist hab ich da auch wa gefunden.


form1 = new Form1 ();

... über dem Aufruf der Funktion löst das Problem. Warum ist mir nicht 100% klar, aber damit kann ich momentan leben.

30.12.2007 - 18:45 Uhr

Ahh. Klingt logisch aber kapiert hab ichs noch nicht.

Wenn ich in form2 dann die Funktion aufrufen will, dann bekomme ich die Fehlermeldung:
{"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."}

Was soll mir das sagen?

30.12.2007 - 17:29 Uhr

Hallo zusammen,

das ist mein erster Eintrag, was auch meinen Wissensstand in c# wiederspiegelt.
Hier mein (für mich grosses) Problem 🙂

Also ich habe eine HauptForm. Diese besitzt eine Funktion namens Bsend(). Diese Funkton hab ich als public definiert in der Hoffnung darauf von einer anderen Form zugreifen zu können.

Also ich erstelle irgendwo in meinem Programm die zweite Form:


Form2 form2 = new Form2();
if (DialogResult.OK == form2.ShowDialog())
            {
                saveFileDialog1.FileName = form2.GetFolder();
                timetosend = form2.GetTime();
            }

Das mit der GetTime() und GetFolder() Methode funktioniert schon wunderbar.
Will ich aber im Quelltext von form2 auf Form1.Bsend() zugreifen, dann hab ich das Problem, dass dort die Funktion nicht bekannt ist.
Was muss man da machen?