Hallo zusammen,
ich habe folgendes Problem.
Und zwar programmiere ich zur zeit eine Fernbedienung, diese liest daten aus einem ir empfänger einer schaltung über einen USB auf serielport adapter.
Ich bekomme die daten zwar ausgelesen wenn ich auf eine taste der fernbedienung drücke, jedoch ist das problem dass ich keine reproduzierbaren ergebnisse erziele.
Das heißt wenn ich z.B. 2 mal die Taste 1 drücke, bekomme ich 2 mal unterschiedliche Zahlen angezeigt.
Ich habe mir eine methode geschrieben die ankommenden bytes in hexadezimale zahlen zu wandeln. Die ankommenden bytes werden in einem byte array gespeichert und ausgelesen.
Allerdings ist wie gesagt das Problem, dass ich immer wieder unterschiedlich zahlen angezeigt bekomme und keine reproduzierbaren Ergebnisse, um mit einem Tastendruck einen bestimmten Prozess auszuführen.
Ich freue mich über eure Hilfe und Ideen, wie ich da weiter komme.
Es ist das erste mal das ich so Hardwarenah programmiere und komme gerade an meine Grenzen.
Lg Bakerman
Hi bakerman,
ohne die signifikanten Stellen deines Codes zu sehen, müsste ich schon meine Kristallkugel reaktivieren um dir helfen zu können. 😉
MfG
wax
Ja sorry ist mir auch mal so eingefallen ^^
private void btOpen_Click(object sender, EventArgs e)
{
try
{
//SerialPort mySerialPort = new SerialPort("COM9");
serialPort1.BaudRate = 9600;
serialPort1.Parity = Parity.None;
serialPort1.ParityReplace = ((byte)(0));
serialPort1.StopBits = StopBits.One;
serialPort1.DataBits = 7;
serialPort1.DtrEnable = false;
// serialPort1.RtsEnable = false;
serialPort1.Encoding = Encoding.UTF8;
serialPort1.Handshake = Handshake.None; //send to hardware flow control.
serialPort1.PortName = "COM5";
serialPort1.RtsEnable = true;
serialPort1.Open();
if (serialPort1.IsOpen)
{
tbStatus.Text += "on \r\n";
}
// startReading();
}
catch (Exception ex)
{
tbStatus.Text += ex.ToString() + "\r\n";
}
}
private void startReading()
{
//tbStatus.Text = b[0].ToString();
//tbStatus.Text += strIndata + " \r\n";
tbStatus.Text += nAnzahl.ToString() + " - " + strData + " \r\n";
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
nAnzahl = serialPort1.BytesToRead;
byte [] buffer = new byte [nAnzahl-1];
this.serialPort1.Read(buffer, 0, nAnzahl -1);
strData = ByteToHex(buffer);
for ( int i = 0; i < buffer.Length; i++)
{
strData += buffer[i].ToString();
}
if (strData != String.Empty)
{
this.BeginInvoke(new SetTextCallback(SetText), new object[] {strData });
}
}
private string ByteToHex( byte [] buffer)
{
StringBuilder builder = new StringBuilder(buffer.Length * 3);
foreach (byte data in buffer)
{
builder.Append(Convert.ToString(data, 16).PadLeft(2, '0').PadRight(3, ' '));
}
return builder.ToString().ToUpper();
}
private void SetText(string text)
{
this.tbStatus.Text += text + " \r\n";
}
private void button1_Click(object sender, EventArgs e)
{
serialPort1.Close();
if (!serialPort1.IsOpen)
{
tbStatus.Text += "off \r\n";
}
}
private void btRead_Click(object sender, EventArgs e)
{
startReading();
}
private void bt_clear_Click(object sender, EventArgs e)
{
tbStatus.Clear();
}
private void serialPort1_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
if (strData != String.Empty)
{
this.BeginInvoke(new SetTextCallback(SetText), new object[] { "Error" });
}
}
}
}
sooo ich denke so wird es klarer und danke schonmal im voraus 😉
Hallo,
das hier erscheint mir seltsam:
nAnzahl = serialPort1.BytesToRead;
byte [] buffer = new byte [nAnzahl-1];
this.serialPort1.Read(buffer, 0, nAnzahl -1);
Hat es einen bestimmten Grund, immer ein Byte weniger zu lesen als anfällt? 😉
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
ja das stoppbit soll abgezogen werden...
Trotzdem musst Du es auslesen (auch, wenn es nicht benutzt wird).
Sind die Daten immer unterschiedlich? Oder nur jedes zweite Mal?
Welcher Art sind denn die Daten? Werden die von der Schaltung schon "interpretiert" oder sind das nur Messwerte?
okay nehm ich -1 wieder raus ,danke 😉
ja die daten sind immer unterschiedlich...
was meinst du mit welcher art sind die daten ?
ich hab ne schaltung zusammen gelötet aber ich denke durch den serialport werden die interpretiert... (der SP ist auch drauf gelötet)
was meinst du mit welcher art sind die daten ?
Nun ja - was sagen die Daten aus? Sind es Impuls/Pausezeiten oder hast Du eine "Interpretation" anhand einer konkreten Kodierung (z. B. RC5) vorgenommen?
Ich frage deshalb, weil Zeiten natürlich aufgrund von Messungenauigkeiten nie exakt gleich sein werden.
achso...
die daten werden in utf8 kodiert und denn in hex umgewandelt
also keine impuls oder pausezeiten
aber an nAnazhl-1 lag es nicht
im gegenteil ich bekomm wiie gerade garnichts mehr angezeigt *der springt noch nichmal in den datarecievedhandler rein ....
ja das stoppbit soll abgezogen werden...
Das kann man nicht "abziehen". Auserdem sind Bits und Bytes ein unterschied.
Du kannst die empfangenen Daten nicht einfach in UTF8 o.ä. konvertieren, das wird nicht funktionieren.
ujr hat das schon angedeutet, google doch mal nach "RC-5".
ach jez hab ich es verstanden was ihr meint ^^
ja sie werden als RC-5 Code von der schaltung interpretiert....
irgendwo muss ja der fehler liegen bzw etwas erweitert werden... nur wo ?