Laden...

IR Fernbedienung: Mehrmaliges Drücken derselben Taste liefert unterschiedliche Ergebnisse

Erstellt von bakerman vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.587 Views
B
bakerman Themenstarter:in
6 Beiträge seit 2012
vor 12 Jahren
IR Fernbedienung: Mehrmaliges Drücken derselben Taste liefert unterschiedliche Ergebnisse

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

731 Beiträge seit 2006
vor 12 Jahren

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

B
bakerman Themenstarter:in
6 Beiträge seit 2012
vor 12 Jahren

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 😉

3.170 Beiträge seit 2006
vor 12 Jahren

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

B
bakerman Themenstarter:in
6 Beiträge seit 2012
vor 12 Jahren

ja das stoppbit soll abgezogen werden...

U
1.688 Beiträge seit 2007
vor 12 Jahren

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?

B
bakerman Themenstarter:in
6 Beiträge seit 2012
vor 12 Jahren

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)

U
1.688 Beiträge seit 2007
vor 12 Jahren

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.

B
bakerman Themenstarter:in
6 Beiträge seit 2012
vor 12 Jahren

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 ....

185 Beiträge seit 2005
vor 12 Jahren

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".

B
bakerman Themenstarter:in
6 Beiträge seit 2012
vor 12 Jahren

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 ?