Hallo Ich möchte Temperatur Sensoren mittels Arduino nano an den PC senden und in einer C# form als Label einzeln angezeigt bekommen. Die Werte der Sensoren sendet mir der Arduino schon mal am PC und kann es mit einer richtextbox auch angezeigt bekommen das geht auch schon jetzt muss ich es nur noch auf die Label verteilt bekommen. Der arduino sendet ein paket was im klar Text dann so aussieht: Temp 1 xx C° Temp 2 xx C° Temp 3 xx C° Label 1 soll mir Temp 1 anzeigen Label 2 soll temp 2 anzeigen und Label 3 die 3 halt. Ich bekomme es aber nur ihn das mir ein Label alle Zeilen anzeigt einzelne Zeilen wollen noch nicht. So langsam weis ich nicht mehr nach was ich suchen soll. Habe es zuletzt mit: label1.Text = richTextBox1.Lines(1); versucht da bekomme ich die Meldung das es nicht als Methode verwendet werden kann. Wäre super wenn jemand eine idee dazu hätte. Mein derzeitiger Versuchs code ist: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO.Ports; using System.Text; using System.Windows.Forms; namespace Temp { public partial class Form1 : Form { public Form1() { InitializeComponent(); serialPort1.BaudRate = 9600; serialPort1.PortName = "COM3"; serialPort1.Open(); serialPort1.DataReceived += serialPort1_DataReceived; } private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) { string line = serialPort1.ReadLine(); this.BeginInvoke(new LineReceivedEvent(LineReceived), line); } private delegate void LineReceivedEvent(string line); private void LineReceived(string line) { richTextBox1.Text += line; label1.Text = line; label2.Text = line; } private void Form1_Load(object sender, EventArgs e) { } private void richTextBox2_TextChanged(object sender, EventArgs e) { label6.Text = richTextBox1.Lines(0); } } }
Ein andere Idee war es mit Timern zumachen ein Timer startet den nano neu und in form 1 läuft ebenfalls ein Timer welche der nur ein Label frei gibt der nano sendet temp eins das Label über nimmt den wert und der Timer deaktiviert Label eins der nano sendet temp 2 und der Timer aktiviert Label 2 und so weiter das Problem was ist sehe es ist umständlich und der Timer in form 1 und der im nano werden Woll nicht lange gleich laufen die werden irgend wann driften.
Was sendet der Arduino denn am Ende einer Zeile? \n oder \r\n? Wenn der Arduino nicht nur reines ASCII sendet, dann sollte auch das Encoding des SerialPorts angepasst werden:
1 | serialPort1.NewLine = "\n"; // oder "\r\n" |
2 | serialPort1.Encoding = Encoding.GetEncoding(28591); // ISO-8859-1 |
Sorry, aber IMHO der falsche Ansatz. Die Methode serialPort1.ReadLine() liest ja bereits nur eine Zeile ein. Und landet in deiner Methode LineReceived sogar im UI-Thread. Soweit alles gut. An der Stelle (also in LineReceived) würde ich einfach einen Line-Zähler mitlaufen lassen und je nach Wert das entsprechende Label setzen. Beispiel: private int _currentLine = 0; private void LineReceived(string line) { richTextBox1.Text += line; _currentLine++; switch( _currentLine ) { case 1: label1.Text = line; break; case 2: label2.Text = line; break; // usw. } // Evtl. so falls die Zeilen automatisch nacheinander eintreffen if( _currentLine == 3 ) _currentLine = 0; // Aber besser wäre es, irgendwie den Anfang zu erkennen // z.B. so am Anfang dieser Methode: // if( line == "Start" || line.StartWidth( "Version" ) // { // _currentLine = 0; // return; // } // // Evtl. sendet die Gegenstelle ja aber auch erst auf Anforderung. // Dann halt davor den Zähler auf 0 setzen. } Gruß Basti
Ups, evtl. habe ich das eigentliche Problem erst jetzt Verstanden... Falls die eine empfangene Zeile immer gleich alle Zeilen enthält, dann sollte der Post von Arc Net (arc) helfen.
Ich habe euere posts gelesen und werde mal versuchen sie um zusetzten. Mein der Derzeitige Code ist ein Standard Code nur halt die Sensoren wurden und werden noch angepasst (werden noch mehr). Ich habe weiter unten die Möglichkeit die werter zeit verzögert zu versenden es muss also nicht alles gleich zeitig sein. #include <OneWire.h> #include <DallasTemperature.h> OneWire ds(10); //pin für ds1820 //DeviceAdressen der einzelnen ds1820 Temperatursensoren angeben. (loop anpassen) DeviceAddress sensor1 = { 0x28, 0xFF, 0x86, 0x2E, 0x74, 0x16, 0x3, 0xAF }; DeviceAddress sensor2 = { 0x28, 0xFF, 0x5, 0x72, 0x74, 0x16, 0x3, 0xE0 }; char sensor1Name[] = "Temp1: "; char sensor2Name[] = "Temp2: "; void setup(void) { Serial.begin(9600); } void writeTimeToScratchpad(byte* address) { //reset the bus ds.reset(); //select our sensor ds.select(address); //CONVERT T function call (44h) which puts the temperature into the scratchpad ds.write(0x44,1); //sleep a second for the write to take place delay(2000); } void readTimeFromScratchpad(byte* address, byte* data) { //reset the bus ds.reset(); //select our sensor ds.select(address); //read the scratchpad (BEh) ds.write(0xBE); for (byte i=0;i<9;i++){ data[i] = ds.read(); } } float getTemperature(byte* address) { int tr; byte data[12]; writeTimeToScratchpad(address); readTimeFromScratchpad(address,data); //put in temp all the 8 bits of LSB (least significant byte) tr = data[0]; if (address[0] == 0x10) // DS18S20 { //check for negative temperature if (data[1] > 0x80) { tr = !tr + 1; //two’s complement adjustment tr = tr * -1; //flip value negative. } //drop bit 0 tr = tr >> 1; //COUNT PER Celsius degree (10h) int cpc = data[7]; //COUNT REMAIN (0Ch) int cr = data[6]; return tr - (float)0.25 + (cpc - cr)/(float)cpc; } else // DS18B20 { return ((data[1] << 8) + tr) * (float)0.0625; } } void loop(void) { float temp1 = getTemperature(sensor1); float temp2 = getTemperature(sensor2); Serial.print(sensor1Name); Serial.print(temp1); Serial.println(" Celsius"); delay(2000); Serial.print(sensor2Name); Serial.print(temp2); Serial.println(" Celsius"); delay(2000); }
Ok nach tagen langen versuchens bin ich am punkt wo ich einsehen muss das es nicht möglich ist ok war aber ein versuch wert. Weder der Nano ist in der Lage 2 Sensoren abzufragen noch bekomme ich es hin eine Zeile aus 6 Zeilen abzufragen. Somit bleibt nur noch eins für jeden der geplanten 16 Sensoren ein eigenen Nano zu kaufen :-( und jeden Sensor ein COM Port zu verpassen mal sehen ob das geht. Vielen Dank für euere Hilfen.
ist zwar etwas umständlich, wie du das angehst (1.Beitrag) - aber eine schnelle (nicht unbedingt saubere Lösung) wäre, aus der Line (also dem String) die Temp wie schon erwähnt rauszusplitten. Das label1.Text = richTextBox1.Lines(1); funktioniert nicht, weil du das Textobjekt übergeben solltest. label1.Text = richTextBox1.Lines(1).Text; und mit Zerlegen: label1.Text = richTextBox1.Lines(1).Text.Substring(5,8); Die 5 und 8 sind die Zeichindizes, also Start und Ende - musst nachzählen, obs so passt. [Anm: ist jetzt nur aus dem Stegreif und nicht getestet).
vielen DANK werde ich heute abend mal testen. mit dem andern hatte ich kein erfolg,
Schöne Idee aus VB geht aber nicht :-(
>>Der nicht aufrufbare Member "TextBoxBase.Lines" kann nicht wie eine Methode
verwendet werden<<
Scheiss 60 Minuten Änderung zeit :-( Ok ich habe jetzt noch mal das von MS versucht: private void Button1_Click(System.Object sender, System.EventArgs e) { // Reset the results box. TextBox1.Text = ""; // Get the word to search from from TextBox2. string Temp1 = TextBox2.Text; int index = 0; //Declare an ArrayList to store line numbers. System.Collections.ArrayList lineList = new System.Collections.ArrayList(); do { // Find occurrences of the search word, incrementing // the start index. index = RichTextBox1.Find(Temp1, index+1, RichTextBoxFinds.MatchCase); if (index!=-1) // Find the word's line number and add the line // number to the arrayList. { lineList.Add(RichTextBox1.GetLineFromCharIndex(index)); } } while((index!=-1)); // Iterate through the list and display the line numbers in TextBox1. System.Collections.IEnumerator myEnumerator = lineList.GetEnumerator(); if (lineList.Count<=0) { TextBox1.Text = Temp1+" was not found"; } else { TextBox1.SelectedText = Temp1+" was found on line(s):"; while (myEnumerator.MoveNext()) { TextBox1.SelectedText = myEnumerator.Current+" "; } Wo er eigentlich nach Temp1 suchen soll es aber nicht macht auser das not found anzuzeigen in textbox oder label1 nachdem ich Button1 klicke ? .. hmm
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.