zatuhnutí aplikace, uzavřený COM port   otázka

C#, Hardware

Mám aplikaci, která zatuhne a nemůžu najít kde, prostě zamrzne, a musím ji prostě stopnout z VS.

Aplikace používá sériový port (System.IO.Ports.SerialPort). Když aplikace zatuhne a já ji stopnu z VS a pak znovu spustím, tak ten sériový port nejde otevřít (IsOpen je pořád FALSE i po novém vytvoření instance portu a po Open()). Pomůže jen restart počítače nebo vyjmutí převodníku z PC a znovu připojení (jde o převodník USB na RS422/485).

Je nějaký nástroj, kterým bych mohl zjistit, v jakém vlákně a kódu se aplikace nachází?

Nevíte co s tím portem?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

O jaky prevodnik se jedna (vyrobce, verze hw, verze sw)?

A pokud pri zatuhnuti vyvolate "pause", zastavi se aplilace?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Používám převodníky Moxa

http://www.moxa.com/product/UPort_1130_1...

Jaký "pause" máte na mysli? V nabídce mám "Stop Debuging", a to tu aplikaci ukončí. Když pak aplikaci znovu spustím, tak se port nedá otevřít (je pořád IsOpen=False).

Používám MS2010 Express.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Funkce Break All pro dočasné přerušení (nikoliv ukončení) programu.

Popis: http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to se zastaví na řádku Port.Write(...)

PS: číst ty antispamové texty je fakt problém, musím si vždy naklikat něco čitelnějšího:-)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud se zaregistrujete, nebudete muset antispamové texty vyplňovat :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A můžete ukázat kód kterým ovládáte COM port ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět
    public class SerialFreePortClass
    {
        private string Name;
        private SerialPort Port;
        private List<byte> TempBuffer;
        private bool DataSendAllow;
        private int ReadTimeOut;
        private object LockObj;

        public CommunicationTime TimeComm;

        private byte lenRcv = 255;
        public int BytesReceived { get { return lenRcv; } }

        private byte lenSend = 0;
        public int BytesSend { get { return lenSend; } }

        public bool ReadyToSend
        {
            get { return ((Port != null) && Port.IsOpen && ((DataSendAllow) || ((TimeComm.ExceededTime(ReadTimeOut)) && (ReadTimeOut > 0)))); }
        }

        public delegate void DataReceivedDelegate(object sender, byte[] xData);
        public event DataReceivedDelegate DataReceivedCompleted;

        public SerialFreePortClass(string xName)
        {
            Name = xName;
            TempBuffer = new List<byte>();
            TimeComm = new CommunicationTime();
            DataSendAllow = true;
            ReadTimeOut = -1;
            LockObj = new object();
            Port = new SerialPort();

        }

        void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                // pocet dostupnych bytu
                int no = Port.BytesToRead;
                if (no <= 0)
                    return;

                // nacteni dostupnych vzorku            
                byte[] receivedData = new byte[no];
                Port.Read(receivedData, 0, receivedData.Length);

                // ulozeni do pomocneho bufferu
                TempBuffer.AddRange(receivedData);

                // delka protokolu
                lenRcv = TempBuffer[0];

                // kdyz je v bufferu dostatecny pocet vzorku
                if (TempBuffer.Count >= lenRcv)
                {
                    // prekopirovani pomocneho bufferu do bufferu aplikace
                    // velikost umele o 1B vetsi, aby se shodovaly adresy v PC a PLC
                    // kopiruje se od druheho bytu (index=1)
                    byte[] appBuffer = new byte[lenRcv + 1];
                    TempBuffer.CopyTo(0, appBuffer, 1, lenRcv);

                    // zpracovani bufferu na promenne
                    if (DataReceivedCompleted != null)
                        DataReceivedCompleted(this, appBuffer);

                    // vymazani dat, ktera se poslala ke zpracovani
                    TempBuffer.RemoveRange(0, lenRcv);

                    lock (LockObj)
                    {
                        DataSendAllow = true;
                        TimeComm.Stop();
                    }
                }
            }
            catch (Exception exc)
            {
                Port.DiscardInBuffer();
                Port.DiscardOutBuffer();
                TempBuffer.Clear();
                DataSendAllow = true;
            }
        }


        public void SendData(byte[] xBuffer, int xLen)
        {
            try
            {
                if (Port == null)
                    return;

                if (ReadyToSend)
                {
                    if (TimeComm.ExceededTime(ReadTimeOut))
                    {
                        Port.DiscardInBuffer();
                        Port.DiscardOutBuffer();
                        TempBuffer.Clear();
                    }

                    lock (LockObj)
                    {
                        DataSendAllow = false;
                        TimeComm.Start();
                    }

                    int len = Math.Min(Math.Min(xLen, xBuffer.Length - 1), 255);
                    lenSend = (byte)len;

                    // prvni byte se neposila, je tu jen kvuli stejnemu adresovani v PC a PLC
                    Port.Write(xBuffer, 1, len);
                }
            }
            catch (Exception exc)
            {
                Port.DiscardInBuffer();
                Port.DiscardOutBuffer();
            }

        }

        public void Close()
        {
            if (Port.IsOpen)
                Port.Close();
        }

        // toto je k pocitani casu komunikace
        public class CommunicationTime
        {
            private Stopwatch T1;

            protected long mActual;
            public long Actual
            {
                get { return mActual; }
                set
                {
                    mActual = value;
                    mMin = ((mActual < mMin) && (mActual > 0)) ? mActual : mMin;
                    mMax = (mActual > mMax) ? mActual : mMax;
                }
            }

            private long mMax;
            private long mMin;

            public CommunicationTime()
            {
                T1 = new Stopwatch();
                Reset();
            }

            public bool ExceededTime(long xTimeMs)
            {
                return T1.ElapsedMilliseconds > xTimeMs;
            }

            public void Reset()
            {
                mActual = 0;
                mMin = long.MaxValue;
                mMax = long.MinValue;
            }

            public void Start()
            {
                T1.Reset();
                T1.Start();
            }

            public void Stop()
            {
                T1.Stop();
                Actual = T1.ElapsedMilliseconds;
            }

            public override string ToString()
            {
                return string.Format("Timeout={0} ms, Last={1} ms, Min={2} ms, Max={3} ", T1.ElapsedMilliseconds, mActual, mMin, mMax);
            }

        }

    }
nahlásit spamnahlásit spam 0 odpovědětodpovědět

V hlavní aplikaci mám pak timer (Windows.Forms.Timer)

       private void timerOB1_Tick(object sender, EventArgs e)
        {
            timerOB1.Enabled = false;
            // ....  
             
            MujPort.SendData(...)

            // ....  
            timerOB1.Enabled = true;
         }
  

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak nikoho nic nenapadá? škoda

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback