Avatar billede knaldeglad Nybegynder
13. august 2006 - 17:05 Der er 7 kommentarer og
1 løsning

cpuload ved brug af SerialPort

hej kloge hoveder.

kan ikke rigtig fatte at mit lille prg. bruger 50 % af cpu.  hvis jeg lukker SerialPort, falder cpuloafd drastisk.    nogen der ved noget om problemet ?
Avatar billede mcgoat Nybegynder
13. august 2006 - 17:55 #1
Kan vi se koden?
Avatar billede knaldeglad Nybegynder
13. august 2006 - 19:18 #2
mm..    får min klasse... 


class SerialComm
    {
        private int baudrate;
        private int databit;

        public ArrayList dataPackets;

        //streng til en char !?
        private string c;
        private string prefferredPort;

        public static string incommingSerialData;

        char[] serialReadBuffer = new char[256];

        private SerialPort port;

        public SerialComm(int baudrate, int databit, string prefferredPort)
        {
            dataPackets = new ArrayList();
            this.baudrate = baudrate;
            this.databit = databit;
            this.prefferredPort = prefferredPort;

            initSerialPort(prefferredPort);
        }

        private bool initSerialPort(string prefferredSerialPort)
        {
            try
            {
                port = new SerialPort(prefferredSerialPort);

                //gør bare at eventet for nyt data ikke kommer før end at der er modtaget mindst 10 chars i buffer. (smart)
                //hvis ikke den bruger kommer eventet for hver ny char i buffer...
                port.ReceivedBytesThreshold = 33;

                port.Parity = Parity.None;
                port.BaudRate = baudrate;
                port.StopBits = StopBits.One;
                port.DataBits = databit;

                port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }

            return true;
        }


        public bool openSerialPort()
        {
            try
            {
                port.Open();
                port.DiscardInBuffer();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            return port.IsOpen;
        }

        public void CloseSerialPort()
        {
            if (port.IsOpen == true)
                port.Close();
        }

        public bool SerialPortWrite(string s)
        {
            try
            {
                port.Write(s);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return false;
            }
            return true;
        }

        public char[] SerialPortRead()
        {
            int readLength = 0;
            try
            {
                readLength = port.Read(serialReadBuffer, 0, 256);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            return serialReadBuffer;
        }

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            c = port.ReadTo("$");// ReadExisting();

            c += "$";
                storeFullDataPacket(c);
                c = "";

        }

        private void storeFullDataPacket(string s)
        {
            lock (this)
            {
                dataPackets.Add(s);
            }
        }

        public string getholedataPacket()
        {
            string s,t;
            t = s = dataPackets[0].ToString();
            Console.WriteLine(t+" = t");
            Console.WriteLine(dataPackets.LastIndexOf(s)+" = længe");

            dataPackets.Remove(s);
            return t;
        }
    }
Avatar billede knaldeglad Nybegynder
13. august 2006 - 19:20 #3
hmm  der er vis et par varialer jeg ikke bruger....  bruger reel kun  openSerialPort() og CloseSerialPort() og getholedataPacket().. dvs læser kun,..
Avatar billede knaldeglad Nybegynder
13. august 2006 - 19:25 #4
dvs fra anden klasse, noget med 
SerialComm scomm;
scomm = new SerialComm(9600, 8, "COM2");
if(scomm.openSerialPort())

og så
string temp = scomm.getholedataPacket()  en gang imellem....
Avatar billede knaldeglad Nybegynder
13. august 2006 - 19:25 #5
thats it....
Avatar billede knaldeglad Nybegynder
13. august 2006 - 19:41 #6
hm....  har vist fundet noget.....  kalder getholedataPacket tit, selvom der ike er data...  der gir en exception pga manglende indhold i dataPacket array som jeg fanger men ikke handler...  tssk...  igen og igen og igen...  hmm  prøver at fikse... og se om det hjælper....
Avatar billede knaldeglad Nybegynder
13. august 2006 - 19:43 #7
ok det hjalp....  sry..  cpu load 1-2 percent nu....
Avatar billede Syska Mester
13. august 2006 - 22:08 #8
Jeg ville da nok bruge den Event som er på SerialPort klassen ....

// ouT
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester