Laden...

RS232: HM28 Digital Manometer: Alle gesendeten Befehle außer "Remote" liefern einen Fehler

Erstellt von msmike68 vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.570 Views
M
msmike68 Themenstarter:in
2 Beiträge seit 2012
vor 11 Jahren
RS232: HM28 Digital Manometer: Alle gesendeten Befehle außer "Remote" liefern einen Fehler

Hallo MyCSharp-Community!
Ich kämpfe schon einige Tage mit einem Problem bei einer Schnittstelle zu einem digitalen Meßgerät. Es handelt sich um ein HM28 Digital Manometer und lt. dem Hersteller sollte eine Übertragung der Daten mittels der RS232 - Schnittstelle kein Problem darstellen. Ich habe daher mit dem SerialPort aus der .Net-Umgebung ein Testprogramm erstellt, das aber nicht richtig funktioniert.
Seitens des Herstellers ist kein vernünftiger Support zu bekommen, da die eher eine Zusatzsoftware verkaufen wollen, als die Schnittstelle sauber zu beschreiben.
Ich habe einen Auszug der Schnittstellenbeschreibung im Anhang angefügt, vielleicht kann mir jemand in diesem Zusammenhang helfen?
Das Empfangen der XOn-Signale ist einwandfrei, aber das Schreiben in die Schnittstelle funktioniert nur mit einem Befehl, alle anderen produzieren immer nur die 'er'-Meldung lt. der Beschreibung. Es ist egal in welcher Reihenfolge ich Befehle absende, einzig der 'Remote'-Befehl wird angenommen und mit Code 'ok' bestätigt. Daraufhin werden keine XOn-Signale mehr gesendet und die Schnittstelle nimmt keine anderen Befehle an?
Vielleicht kann mir jemand helfen bzw. mir noch einen Tip für die Suche geben?
Vielen Dank im Voraus!


private bool sendXonMessage()
        {
            this.ack = false;
            byte[] send = new byte[1];
            send[0] = (byte)17;            

            if (writeRs232(send))
            {
                this.ack = true;
                return true;
            }
            else return false;                       
        }

private bool readConfig()
        {
            this.ack = false;
            byte[] send = new byte[13];
            send[0] = (byte)'r';
            send[1] = (byte)'e';            
            send[2] = (byte)'a';
            send[3] = (byte)'d';
            send[4] = (byte)'c';
            send[5] = (byte)'o';
            send[6] = (byte)'n';
            send[7] = (byte)'f';
            send[8] = (byte)'i';
            send[9] = (byte)'g';
            send[10] = (byte)'*';
            send[11] = (byte)60;            
            send[12] = (byte)13;
           
            if (writeRs232(send))
            {
                this.ack = true;
                return true;
            }
            else return false;            
        }

private bool sendRemote()
        {
            this.ack = false;
            byte[] send = new byte[9];
            send[0] = (byte)'r';
            send[1] = (byte)'e';
            send[2] = (byte)'m';
            send[3] = (byte)'o';
            send[4] = (byte)'t';
            send[5] = (byte)'e';
            send[6] = (byte)'*';
            send[7] = (byte)182;
            send[8] = (byte)13;

            if (writeRs232(send))
            {
                this.ack = true;
                return true;
            }
            else return false;

        }

        private bool writeRs232(byte[] buffer)
        {
            try
            {
                this.serialPort1.Write(buffer, 0, buffer.Length);
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

private void serialPort1_PinChanged(object sender, System.IO.Ports.SerialPinChangedEventArgs e)
        {
            if (e.EventType == System.IO.Ports.SerialPinChange.DsrChanged)
            {
                this.label1Message = "Dsr-Changed!";
                this.label1.BeginInvoke(new InvokeDelegate(InvokeLabel1TextMethod));
                this.waitTime();
                //if (sendXoffMessage())
                //{
                    if (readConfig())
                    {
                        this.waitTime();
                        if (sendXonMessage())
                        {
                            //serialPort1.DtrEnable = true;
                        }
                    }
                //}
            }
      }

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            counter++;            
            try
            {           

                int count = serialPort1.BytesToRead;    // Anzahl Bytes im Empfangspuffer des Readers-
                byte[] ba = new byte[count];
                serialPort1.Read(ba, 0, count);               
                if (count > 1)
                {
                    foreach (byte b in ba)
                    {
                        this.bufList.Add(b);
                        if (b == 13)
                        {
                            string tmp = string.Empty;
                            foreach (byte buf in bufList)
                            {
                                tmp += Convert.ToChar(buf).ToString();
                            }
                            this.label1Message = "Value: " + tmp;
                            this.label1.BeginInvoke(new InvokeDelegate(InvokeLabel1TextMethod));
                            string[] msgComplete = tmp.Split('*');
                            string[] msg = msgComplete[0].Split('\t');
                            //if (msg.Length > 1 && msg[1].Equals("ok"))
                            //{
                            ////    serialPort1.DtrEnable = true;
                            ////    serialPort1.RtsEnable = true;
                            //    sendXonMessage();
                            ////    serialPort1.BreakState = false;
                            //}
                            //Clear
                            this.bufList.Clear();
                            this.sendXonMessage();
                            break;
                        }
                    }
                }
                else if (count == 1)
                {
                    if (Convert.ToChar(ba[0]) == 17)
                    {                        
                        label1.Invoke(new EventHandler(delegate
                        {
                            label4.Text = "Nr. " + counter + "; Byte XON: " + ba[0].ToString();
                        }
                        ));
                    }
                    else
                    {
                        foreach (byte b in ba)
                        {
                            this.bufList.Add(b);
                            if (b == 13)
                            {
                                string tmp = string.Empty;
                                foreach (byte buf in bufList)
                                {
                                    tmp += Convert.ToChar(buf).ToString();
                                }
                                                               
                                this.label1Message = "Value1: " + tmp;
                                this.label1.BeginInvoke(new InvokeDelegate(InvokeLabel1TextMethod));
                                string[] msgComplete = tmp.Split('*');
                                string[] msg = msgComplete[0].Split('\t');
                                if (msg.Length > 1 && msg[1].Equals("ok"))
                                {
                                    //serialPort1.DtrEnable = true;
                                    //serialPort1.RtsEnable = true;
                                    sendXonMessage();
                                    //serialPort1.BreakState = false;
                                }
                                //Clear
                                this.bufList.Clear();
                                this.sendXonMessage();
                                break;
                            }
                        }
                    }
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

T
708 Beiträge seit 2008
vor 11 Jahren

Hallo msmike68,

es gibt etliche (sehr gute) Klassen, die dir einen Teil der Arbeit abnehmen und auch etwas "eleganter" programmiert sind. z.B. ohne diesem ganzen Byte gecaste 😃
Template Serial Com Port

Nun aber zu dem eigentlichen Problem:
Auf den Ersten Blick sollten die Einstellungen soweit korrekt sein. Du sendest die Prüfsumme und abschließend das CR. Aus meiner Erfahrung reicht das aber oft nicht aus. Versuch einfach mal den Befehl zusätzlich mit einem LineFeed abzuschließen. (Der Com-Controller hat manchmal die Eigenschaft was zu cachen, bis der Befehl fertig zusammengebaut ist. Das erledigt alternativ der Befehl ComPort.WriteLine() )
Weiterhin solltest du mal das Property "DtrEnable" ausprobieren. Das wirkt oftmals Wunder 😄
Bedeutet "Data Terminal Ready" und prüft ob das Gerät bereit ist eine Abfrage zu empfangen.

Was sich sonst immer empfiehlt ist ein Tool, was im Hintergrund die Daten mitschneidet. Damit kann man sofort erkennen ob ggf. das Gerät antwortet, aber das Programm nicht reagiert o.ä.

Zu guter Letzt: Bau dir eine GUI mit allen Einrichtungsparametern und probier alles mögliche aus. Das ist bei manchen Geräten der Einzige Weg 😦

P
64 Beiträge seit 2011
vor 11 Jahren

Hiho,

schau doch erst mal, ob du das Ganze mit einem Terminalprogramm
à la RealTerm hinbekommst. Da geht das Fehlersuchen ein wenig leichter von Hand, da du nicht noch die Fehlerquelle Programmcode hinzufügst.

Grüße,

M
msmike68 Themenstarter:in
2 Beiträge seit 2012
vor 11 Jahren

Hallo trib und panicJonny!

Vielen Dank vorerst für die Tipps, ich bin gerade beim ausprobieren und testen!
Melde mich auf jeden Fall über die Erfolge oder Mißerfolge!

Grüße
msmike68

4.221 Beiträge seit 2005
vor 11 Jahren

Schau Deinen Code nochmals an.

Du schickst für jedes Byte ein XOn zurück... statt nur einmal nach dem Parse der eingehenden Daten...

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

foreach (byte b in ba)
{

---> this.sendXonMessage();

dieses sendXOnMessage darf sicher nicht innerhalb des foreach sein...

Insgesamt ist Dein Aufbau nicht wirklich sauber...

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...