Hallo, ich hab grad noch entdeckt dass ich einen kleiner Fehler bei der Verarbeitung der ankommenden Daten gemacht hab. Ich hab das jetzt korrigiert. Im Anhang befindet sich die richtige Version.
Hallo, ich hab grad noch entdeckt dass ich einen kleiner Fehler bei der Verarbeitung der ankommenden Daten gemacht hab. Ich hab das jetzt korrigiert. Im Anhang befindet sich die richtige Version.
hallo...
hab nun nen problem mitn empfangen
wird gesagt das es threadübergreifend ist..
bekanntes problem ich weiß... ich habe mich damit nun über 20std! beschäftigz....es versucht im internet zu erlesen
ich packs nicht, bin grad am verzeifeln
ich brauche irgendwie diesen invoke befehl
du bist grad meine letzte hoffnung
ich hoffe du hilfst mir und erklärst mir das problem beim empfangen beim serialport...
hab hier einfach mal mein ganzen code hochgeladen, kannst dir ja mal anschauen
schon mal vielen vielen dank
Geändert von bZzR (28.07.2011 um 00:01 Uhr)
Würde es dir was ausmachen den Code als Textdatei anzuhängen? Hab grad leider nichts zum .rar öffenen da.
Ganz einfach kannst du das Problem mit dem Threadübergreifenden zu Griff aber so lösen: (Ich beziehe mich bei der Namensgebung der Controls bzw. Objekte auf mein Beispielprogramm)
In meinem Programm habe ich das ganze mit einem Delegaten gelöst was den Vorteil hat dass man sich z.B. den Umweg über die globale Variable sparen kann.Code:void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { //Hier die Daten die du ausgelesen hast in irgendeiner globalen Variable speichern lbRecieved.Invoke(new MethodInvoker(MethodeZumDatenInListboxSchreiben)); } void MethodeZumDatenInListboxSchreiben() { lbRecieved.Items.Add(<Daten aus der globalen Variable>); }
Hier kannst du das auch nochmal nachlesen:
http://www.mycsharp.de/wbb2/thread.php?threadid=33113
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports; //serielleSchnittstelle
using System.Collections; //ArrayListe
using System.Threading; //Delagation invoke (Threadübergreifend)
using System.Timers; //Timer
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
SerialPort Schnittstelle = new SerialPort("COM1"); //Deklaration
byte[] daten = new byte [3];
private void Form1_Load(object sender, EventArgs e)
{
}
private void buttonConnect_Click(object sender, EventArgs e)
{ //Festlegung Parameter=
Schnittstelle.BaudRate = 9600;
Schnittstelle.Parity = Parity.None;
Schnittstelle.DataBits = 8;
Schnittstelle.StopBits = StopBits.One;
Schnittstelle.Handshake = Handshake.None;
Schnittstelle.ReadTimeout = 500;
Schnittstelle.WriteTimeout = 500;
try
{
Schnittstelle.Open(); //Serialport öffnen
if (Schnittstelle.IsOpen)
{
buttonConnect.Enabled = false; //Connect_Button blass
buttonConnect.Text = "Erfolgreich";
}
}
catch
{
MessageBox.Show("Keine Verbindung möglich", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
Schnittstelle.DataReceived += new SerialDataReceivedEventHandler(Nebenthread); // Abo_Event abonnieren
}
void Nebenthread(object sender, SerialDataReceivedEventArgs e) //Diese Methode wird ausgelöst. Wurde vorher abonniert
{
//string serialIn = Schnittstelle.ReadLine();
//listBox1.Invoke(new EventHandler(delegate { listBox1.Items.Add(serialIn); }));
this.textBox1.Text = Schnittstelle.ReadExisting();
}
private void buttonDisconnect_Click(object sender, EventArgs e)
{
Schnittstelle.Close();
buttonConnect.Enabled = true;
buttonConnect.Text = "Connect";
}
private void buttonSenden_Click(object sender, EventArgs e)
{
daten[0] = 1;
daten[1] = 2;
if (Schnittstelle.IsOpen)
{
Schnittstelle.Write(daten, 0, daten.Length); //Daten senden
// oder//Schnittstelle.Write(daten, 0, 2);
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e) // Anwendungen schließen = Verbindung trennen
{
Schnittstelle.Close();
}
}
}
hoffe du blickst durch..
und wenn du mir da jetzt den passenden code schreibst, bin ich dir unendlich danklbar
versuche das jetzt natürlich noch selber und morgen auch
aber wäre dir echt dankbar wenn du was schreibst, ist ja ein leichtes für dich
DANKE
PS: ich möchte es auch ohne globale variabeln...hab das eben verucht, gefällt mir alles nicht so :/
Geändert von bZzR (28.07.2011 um 11:37 Uhr)
Dann wirst du wohl nicht darum kommen dir anzuschaun was das mit den Delegaten auf sich hat, da du ja Daten übergeben möchtest.
Die Variante mit der globalen Variable ist allerdings wesentlich einfacher:
Code:string Daten = ""; void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { Daten = serialPort.ReadLine(); lbRecieved.Invoke(new MethodInvoker(MethodeZumDatenInListboxSchreiben)); } void MethodeZumDatenInListboxSchreiben() { lbRecieved.Items.Add(Daten); }
schon mal danke dafür
würds halt gern über delegate machen... wie gesagt habe wirklich gestern 12std fast am stück versucht das zu verstehen
im internet ist jeder code anders und ich sehe nie einen zusammenhang
deswegen meine hoffung das du zu meinen code einen passenden befehl eben schnell schreiben kannst...oder ist das schon so viel
wills ja gern selber machen, aber grad komm ich einfach nicht vorran
Hi, ich bin zur Zeit in meiner Abschlussprojekt Phase. Unser Thema ist "Realisierung einer Geschwindigkeitsmessung und Rundenzeiterfassung mittels Mikrocontroller". Meine Aufgabe besteht darin die Übertragung der Werte an den PC.
Ich bin jetzt soweit kommen das ich ein AVR C Programm geschrieben habe und eine Benutzeroberfläche mittels C Sharp erstellt habe. Mein Problem liegt darin das ich die Werte die ich übertragen will nicht immer an die Benutzeroberfläche ankommen. Mal klappt es mal klappt es nicht. Im Terminal Programm kommt immer was an also am AVR C Programm liegt es nicht. Als Anhang habe ich mal das Event mit dem Datenempfang hinzugefügt. Wäre nett wenn jemand mir dabei noch Tipps geben könnte, zur Sicherer Datenübertragung.
Danke im vorauss
Meiner ansicht nach gehst du etwas falsch ran an die Sache. Du hofft dass wenn du ReadByte aufrufst das richtige Byte auch da ist. Aber wer sagt dass der Roboter zu dem Zeitpunkt zu dem du ReadByte aufrufst schon das passende Byte gesendet hat (Außerdem müsstest du auch noch einen Fehler aufgrund eines Threadübergreifenden vorgangs bekommen, da du ohne invoke aus einem anderen Thread auf die Gui zu greifs). Da du sowie so schon mit dem DataRecievedEvent arbeitest würde ich vorschlagen du schickst vom Roboter aus erst mal ein bestimmtes Byte als Startbedingung. Wenn das Empfangen wurde schreibst du jedes weitere byte, das danach kommt in eine liste bis deine Endbedingung kommt. In der Liste weist du dann dass z.B. das erste Byte für die Geschwindigkeit und das zweite Byte dann für die Rundenzeit steht.
Code mäßig könnte das ganze im RecievedEvent so aussehen:
//Globale Variable
bool PaketStart = false;
//Event
byte temp = 0;
while(temp != -1)
{
temp = (byte)serialPort1.ReadByte();
if(PaketStart)
{
if(temp == Endbedingung)
{
//Rufe eine Prozedur auf die die Daten in der Liste verarbeitet
}
Liste.Add(temp);
}
if(temp == StartBedingung)
{
PaketStart = true;
}
}
Lesezeichen