Hi, tB_Test2.Text = ergebnis2; variable_buffer = Convert.ToDecimal(tB_Test2.Text); bei diesen beiden zeilen bekomme ich die Fehlermeldung, das der Wert zu groß oder zu klein ist. In ergebnis 2 steht ein wert von zB. 1670265059 als String. variable_buffer ist ein decimal. Wie kann man das problem lösen?
Was genau kommt denn da als Fehlermeldung? Eine Exception? Dein Zahlenwert ist auf jeden Fall noch wesentlich kleiner als Decimal.MaxValue. Es scheint also nicht daran zu liegen, dass dein Wert zu groß ist. Was passiert denn, wenn du mal zum Spaß "0" in ergebnis2 reinschreibst? Welchen Typ hat denn tB_Test2?
Habs mal geändert: tB_Test2.Text = ergebnis2; variable_buffer = Int64.Parse(tB_Test2.Text); <-- da kommt die fehlermeldung Eine nicht behandelte Ausnahme des Typs "System.OverflowException" ist in mscorlib.dll aufgetreten. Zusätzliche Informationen: Der Wert für einen Int64 war zu groß oder zu klein.
ergebnis2 = Convert.ToString(0); tB_Test2.Text = ergebnis2; variable_buffer = Int64.Parse(tB_Test2.Text); So funktionierst, nur mein programmablauf stimmt nicht mehr xD
Peter Naschke schrieb: > Zusätzliche Informationen: Der Wert für einen Int64 war zu groß oder zu > klein. sicher das in tB_Test2.Text die wert 1670265059 steht?
Nunja, auch Int64.Parse kann eine OverflowException werfen, sollte dies aber nur tun, wenn der geparste wert größer als Int64.MaxValue ist: http://msdn.microsoft.com/de-de/library/vstudio/3b6b4bx3.aspx Dein Wert ist jedoch kleiner als Int64.MaxValue: 9223372036854775807 (Int64.MaxValue) 1670265059 (dein Wert aus dem ersten Post) Was GENAU steht in deinem String drin?
Peter Naschke schrieb: > ergebnis2 = Convert.ToString(0); erbebnis2 = "0"; hätte es wohl auch getan Lass doch mal den Wert von ergebnis2 auf die Konsole ausgeben. Das müsste so gehen: Console.WriteLine(ergebnis2);
Ach misst sry ich brauche das als Binär und rechne das vorhe rin Binär um. in steuerwort steht zB. 1670265059 ergebnis2 = Convert.ToString(steuerwort, 2); tB_Test2.Text = ergebnis2; variable_buffer = Int64.Parse(tB_Test2.Text); das komische ist, das ich auch nicht das richtige binärergebnis bekomme
Peter Naschke schrieb: > 1000000000000000000000000011101 Klar, das funktioniert nicht, da 1000000000000000000000000011101 größer als 9223372036854775807 (.net weiß ja nicht, dass das oben eine Binärzahl ist) Was willst du denn mit deinem Code erreichen?
Gehts evtl damit: http://msdn.microsoft.com/de-de/library/vstudio/1k20k614.aspx public static int ToInt32( string value, int fromBase ) variable_buffer = convert.ToInt32(ergbnis2,2); ???
Peter Naschke schrieb: > In ergbnis2 steht zB. 1000000000000000000000000011101 var res = Convert.ToInt32("1000000000000000000000000011101", 2); http://msdn.microsoft.com/en-us/library/1k20k614.aspx (zu spät...)
Ich brauche Die Int Variable mit dem Binärcode. Eine altanative wäre sonst den Binärcode beim wandeln auf 4 variablen aufzuteilen. Doch fällt mir grade keine sinnige lösung dafür ein
Peter Naschke schrieb: > Ich brauche Die Int Variable mit dem Binärcode das geht doch ohne Problem. Man kann nur nicht ein Binärzahl noch mal als int parsen. (macht auch keinen Sinn!) also beschreibe noch mal genau was dein Problem ist.
Peter Naschke schrieb: > Ich brauche Die Int Variable mit dem Binärcode. Eine altanative wäre > sonst den Binärcode beim wandeln auf 4 variablen aufzuteilen. Doch fällt > mir grade keine sinnige lösung dafür ein ??? Das was Convert.ToInt32(string, int) zurückliefert ist ein Int32. Binärer wird's nicht. Braucht man die Einzelbytes kann man sich das selber mit >> und & zusammenbauen oder BitConverter.GetBytes nehmen.
Naja eigentlich brauche ich einen Int128 alles andere würde eine gewaltige arbeit nach sich ziehen. Mir kommen auch genug Ideen das aufzuteilen, dann stehe ich aber wieder am anfang weil ich alle schleifen umändern muss. Für die weiterverarbeitung benötige ich den Binärcode auf einer Int variable
Peter Naschke schrieb: > Naja eigentlich brauche ich einen Int128 jetzt sagt doch mal um was es wirklich geht. Wozu braucht man solche großen Zahlen binär? Eventuell gibt es eine ganz andere Lösung die du aktuell nicht siehst.
Peter Naschke schrieb: > Naja eigentlich brauche ich einen Int128 alles andere würde eine > gewaltige arbeit nach sich ziehen. Mir kommen auch genug Ideen das > aufzuteilen, dann stehe ich aber wieder am anfang weil ich alle > schleifen umändern muss. > > Für die weiterverarbeitung benötige ich den Binärcode auf einer Int > variable Nochmal auf Start: Was geht rein, was soll rauskommen? So wie es bislang aussieht, soll von String nach irgendwas gewandelt werden. 1. Wie lang ist der String? 2. Was steht da genau drin? 3. In was soll das umgewandelt werden? 4. Was soll mit dem umgewandelten gemacht werden?
naja ich brauche am ende des programms den int wert aus steuerwort auf 4 byte variablen in binärcode aufgeteilt, um sie über die serielle schnittstelle als byte zusenden. in steuerwort steht etwas mit 10stellen, was aus einer berechnung kommt
Peter Naschke schrieb: > naja ich brauche am ende des programms den int wert aus steuerwort auf 4 > byte variablen in binärcode aufgeteilt, um sie über die serielle > schnittstelle als byte zusenden. Dazu steht die Lösung schon oben: var res = Convert.ToInt32(string, int); var bytes = BitConverter.GetBytes(res); sp.Write(bytes, 0, bytes.Length);
Peter Naschke schrieb: > naja ich brauche am ende des programms den int wert aus steuerwort auf 4 > byte variablen in binärcode aufgeteilt, um sie über die serielle > schnittstelle als byte zusenden. warum zum geier sollte man über die Serielle schnittstelle nur 0 oder 1 senden? kannst du es nicht als hex übertragen? Kann es eventuell sein das du es doch nicht als 0 oder 1 übertragen sollst. Sonder als 3 bytes?` also die zahl 123456789 übertragen als 0x07,0x5B, 0xCD, 0x15. Dafür braucht die ganze konvertiert nicht. Das geht komplett anders.
Wenn ich die Konvertierung hier nicht mache muss ich sie auf der Platine machen.Die Software auf der Platine ist fertig und läuft super. Dazu steht die Lösung schon oben: var res = Convert.ToInt32(string, int); <--Das lisst man so häuft aber ich bekomme immer ne fehlermeldung wenn ich für in zb. 2 einsetze. var bytes = BitConverter.GetBytes(res); sp.Write(bytes, 0, bytes.Length);
Peter Naschke schrieb: > Wenn ich die Konvertierung hier nicht mache muss ich sie auf der Platine > machen.Die Software auf der Platine ist fertig und läuft super. du hast uns immer noch nicht gesagt was du übertragen willst. willst du 0 und 1 übertragen? mache uns doch mal ein Beispiel was genau du auf die Leitung schicken willst.
01101010 10101010 10101010 10101010 die 4 bytes nnacheinander habe ich auch als Testvariablen und erzeugen mir am ausgang der Platine genau das wa sich erwarte.
Peter Naschke schrieb: > die 4 bytes nnacheinander habe ich auch als Testvariablen und erzeugen > mir am ausgang der Platine genau das wa sich erwarte. also willst du 4 bytes übertragen und brauchst überhaupt keine bits. Dann reicht doch wohl byte[] bytes = BitConverter.GetBytes(i); was willst du dann noch mit Convert.ToInt32?
01101010 10101010 10101010 10101010 das sind bynärcode gefüllte bytes, genau das was ich brauche. Bei byte[] bytes = BitConverter.GetBytes(i); stehen in bytes doch wieder 4 Dezimale Zahlen die jeweils 1 byte groß sind?
Peter Naschke schrieb: > das sind bynärcode gefüllte bytes, genau das was ich brauche. Bei byte[] > bytes = BitConverter.GetBytes(i); stehen in bytes doch wieder 4 Dezimale > Zahlen die jeweils 1 byte groß sind? irgendwie reden wir aneinander vorbei. in den Bytes steht keine 4 zahlen sondern 8bit mit der Dezimaldarstellung von 0-255. Wie sollen denn in einem Byte 4 Zahlen stehen? Dort steht genau eine Zahl und die geht von 0-255 nur wenn man es für den Mensch ins Dezimalsystem umrechnet stehen dort 3 Ziffern. Wenn du 4 Byte übertragen willst/muss, dann übertrage doch einfach diese 4 Bytes.
kannst du uns mal den teil vom Empfänger zeigen wo du die Daten verarbeitest? Daran sollte man sehen in welcher Form du die Daten wirklich brauchst.
Das sollte nicht nötig sein Man müsste sich nur mal darüber Gedanken machen in welcher form daten abgelegt sind und wie sie interpretiert werden können. Man nehme die Zahl 64 (10) sie repräsentiert für uns zunächst einen dezimalen Wert. Im pc werden, egal welcher datentyp verwendet, Binär 0100 000 draus. In ascii wird ein 'A' für die ausgabe draus. in jedem anderen Datentyp der größer als ein byt lang ist werden führend einfach nur nullen angehängt. ein int16 also 0000 0000 0100 0000 ein int32 also 0000 0000 0000 0000 0000 0000 0100 0000 wenn du einen string mit dem inhalt "64" nach int parst, hast du also diesen wert im speicher nach obigen muster abgelegt.
Also mein Problem ist das ganz einfach die anführenden nullen nicht über tragen werden. Wenn ich 00110000 habe, bekomme ich auf der anderen seite 110000 an. Damit funktioniert nichts mehr. Ich brauche eigentlich eine Methode wie sowas hier: serialPort1.Write(bytes, 0, 1).PadLeft(8, '0') Das Bsp. funktioniert natürlich nicht
Peter Naschke schrieb: > Also mein Problem ist das ganz einfach die anführenden nullen nicht über > tragen werden. Wenn ich 00110000 habe, bekomme ich auf der anderen seite > 110000 an. Damit funktioniert nichts mehr. nein, dein Problem ist immer noch das du uns nicht mal sagen kann wie genau du etwas übertragen willst. Was soll dein 00110000 sein? Ein String? Bei Serial werden immer 8 bits übertragen, da kann nichts abgeschnitten werden, bits können nur 0 oder 1 sein. > serialPort1.Write(bytes, 0, 1).PadLeft(8, '0') was soll das denn darstellen? Was soll denn daas PadLeft bewirken? Zeige doch mal den code wie du an der gegenstelle die Daten empfängst, wenn du es schon nicht erklären kannst wie du die die übertragen willst.
Er meint wahrscheinlich, wenn er aus dem String eine zahl castet und daraus wieder einen String mit dem wert zur Basis 2 fehlen ihm die 0en vorne. Dabei müsste er nur mal die BitConverter.GetBytes() Funktion ausprobieren und das Ergebnis auf die Console ausgeben, dann würde er genau das haben was er will, er kann sich nur nicht vorstellen dass die zahlen die er da sieht intern bits sind, und als bytes ganz normal übertragen werden.
Hi also nein, das problem ist folgendes: bytes = BitConverter.GetBytes(steuerwort); wenn ich die bytes jetzt übertrage mit der serialwrite byte methode dann werden anscheinend Dezimalwerte übertragen oder mir fehlt die anführende 0. Eins von beiden muss sein denn wenn ich mir bytes schreibe mit int fülle und mit bit.converter carste und übertrage funktioniert alles. Wenn ich tB_Test2.Text = Convert.ToString(bytes[3], 2); benutze bekomme ich mein byte mit den 01000000 zB. weil ich den string zu basis 2 hin ausgebe. Wenn ich aber jetzt die Basis weg lasse, dann bekomme ich int. Eine weitere Frage die ich habe ist daher, wird beim Carsten in string standartmäßig zur basis 10 gecastet?
Peter Naschke schrieb: > wenn ich die bytes jetzt übertrage mit der serialwrite byte methode dann > werden anscheinend Dezimalwerte übertragen oder mir fehlt die anführende > 0. nein das passiert auf keinen Fall, es werden wirklich bytes übertragen. Warum prüft du nicht einfach mal was wirklich übertragen wird? http://msdn.microsoft.com/en-us/library/ms143551.aspx Peter Naschke schrieb: > Eine weitere Frage die ich habe ist daher, wird beim Carsten in string > standartmäßig zur basis 10 gecastet? es gibt kein casten nach string, nur eine convertierung.
Ich habs ausprobiert, und es funktioniert nicht. Wenn ich testvariablen schreibe funktioniert es einwandfrei. sry ich meine string convertierung
Peter Naschke schrieb: > Ich habs ausprobiert, und es funktioniert nicht. dann finde doch erstmal raus, was nicht funktioniert. Du vermutest immer nur. Kann du nicht einfach auf der gegenstelle dir anzeigen lassen was empfangen wird? Oder also Echo zurückschicken? Oder mit dem Oszi die Leitung mitlesen. Oder per Software (z.b.SerialPortMonitor) prüfen. Oder mit com2com eine Virtuelle schnittselle anlegen und dann dir die Daten anzeigen lassen.
Peter Naschke schrieb: > Wenn ich die Konvertierung hier nicht mache muss ich sie auf der Platine > machen.Die Software auf der Platine ist fertig und läuft super. Wie wäre es denn, wenn Du endlich mal ein Stück Code von der Empfängerseite postest, damit man mal sehen kann, in welchem Format die Daten erwartet werden. Dann kann Dir auch im Handumdrehen geholfen werden. Ich habe so den Eindruck als ob hier jede Menge aneinander vorbei gepostet wird. %-) Grüße Markus
Peter Naschke schrieb: > Also mein Problem ist das ganz einfach die anführenden nullen nicht über > tragen werden. Wenn ich 00110000 habe, bekomme ich auf der anderen seite > 110000 an. Damit funktioniert nichts mehr. > Ich brauche eigentlich eine Methode wie sowas hier: > > serialPort1.Write(bytes, 0, 1).PadLeft(8, '0') > > Das Bsp. funktioniert natürlich nicht Dann wird versucht die Bytes als String/Text zu übertragen oder irgend etwas läuft völlig anders als auf normalen Computern. Beispiel:
1 | // Ein Text, woher auch immer, wird umgewandelt in einen Integer.
|
2 | // Einmal ist der Text die Dezimaldarstellung, einmal die Binärdarstellung
|
3 | var text1 = "1234"; |
4 | var result1 = Convert.ToInt32(text1, 10); |
5 | var testFlag1 = result1 == 1234; |
6 | |
7 | var text2 = "10011010010"; |
8 | var result2 = Convert.ToInt32(text2, 2); |
9 | var testFlag2 = result2 == 1234; |
10 | |
11 | // wird jetzt das Ergebnis result1 oder result2 mit BitConverter
|
12 | // umgewandelt in einzelne Bytes und per serialPort.Write übertragen
|
13 | var bytes = BitConverter.GetBytes(result1); |
14 | serialPort.Write(bytes, 0, bytes.Length); |
15 | // kommen auf der Gegenseite vier Bytes an (0xd2, 0x04, 0x00, 0x00)
|
16 | // Wie zu sehen, sind die Little-endian.
|
17 | |
18 | // Wenn die Gegenseite Big-endian braucht, können die Bytes entweder
|
19 | // vor dem Senden umgedreht werden z.B.
|
20 | var bigEndianBytes = bytes.Reverse().ToArray(); |
21 | // oder dies kann vor dem Umwandeln in ein Byte-Array geschehen
|
22 | var bigEndianResult = System.Net.IPAddress.HostToNetworkOrder(result1); |
23 | var bytes2 = BitConverter.GetBytes(bigEndianResult); |
24 | |
25 | // Soll bspw. result2 als Text übertragen werden, dann kann
|
26 | // z.B. result2 mit
|
27 | var textResult = Convert.ToString(result2, 2).PadLeft(32, '0'); |
28 | // in einen 32-Zeichen langen (keinen 32 Bytes langen!) Text umgewandelt werden
|
29 | // Soll das Array bytes2 mit den vier Bytes in vier Strings mit der
|
30 | // Binärdarstellung umgewandelt werden,
|
31 | var textResult4_8 = bytes2.Select(x => Convert.ToString(x, 2).PadLeft(8, '0')).ToArray(); |
32 | // Ausgeschrieben wäre letzteres z.B.:
|
33 | string[] textResult4_8_2 = new string[bytes2.Length]; |
34 | for (int i = 0; i < bytes2.Length; i++ ) { |
35 | textResult4_8_2[i] = Convert.ToString(bytes2[i], 2).PadLeft(8, '0'); |
36 | }
|
37 | |
38 | // u.U. das Encoding des SerialPorts umstellen, damit nicht nur 7-Bit
|
39 | // ASCII auf der Gegenseite ankommt
|
40 | serialPort.Encoding = Encoding.GetEncoding(28591); |
Der fehler war ein dreher bei den Bytes, sry und danke an alle :D. Wenn ich noch aufräumen will, wie sieht dann der eigene methodenaufruf aus? public void machwas(object sender) { zahl = 1+1 } ... private void button2_Click(object sender, EventArgs e) { machwas(); textBox1.Text = ConverToString(zahl); }
Wieso solltest Du denn überhaupt die Bytes als Text über die Schnittstelle schicken, statt das Byte direkt zu schicken? Deine "0" oder "1" werden doch sowieso als je ein ganzes Byte verschickt, d.h. 0 -> 00000000 1 -> 00000001 Der Controller muss also auch acht mal so viel empfangen und verarbeiten. Dann wäre es doch viel geschickter das Byte so wie es ist über die Schnittstelle zu schicken und auf dem Controller (falls das überhaupt nötig sein sollte) auseinander zu nehmen. Die Prozeduraufrufe würden laufen, wenn du das "object sender" der Funktion "machwas" weglassen würdest. Es ist allerdings eine äusserst schlechte Art solche Funktionen direkt globale Variablen wie "zahl" ändern zu lassen. Besser wäre etwa eine Funktion wie
1 | private int machwas( int zahl ) |
2 | {
|
3 | zahl = zahl + 1; |
4 | return zahl; |
5 | }
|
(mal ausgeschrieben), die einen Parameter und einen Rückgabewert hat. Diese kann dann aufgerufen werden mit
1 | neuezahl = machwas(altezahl); |
Sch;ne Grüße, Max
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.