Avatar billede freesite Nybegynder
12. oktober 2010 - 08:33 Der er 2 kommentarer

SerialPort læser ikke alle data

Hej Eksperter

Jeg har følgende kode som modtager 4 bytes fra com-porten og
gemmer indholdet i et arraylist objekt.

Mit problem er at serialPorten ikke modtager de 4 bytes hver gang men nogle gange springer en hel overførelsen over.

Programmet er testet mod en counter der tæller op til 16 hvor efter kun den ene byte skrives til en fil:

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,
0,1,2,3,4,5,6,7,9,11,13,15,1,3,5,7,
9,11,13,15,1,3,5,7,9,11,13,15,1,3,5,7,
9,11,13,15,1,3,5,7,9,10,11,12,13,14,15,0,
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,

Transmitteren er valideret mod en terminal hvor der ikke er nogle problemer, så jeg er meget sikker på at problemet ligger i C# koden.

Håber der er nogle som kan hjælpe.


Med venlig hilsen Mads

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Collections;
using System.IO;



namespace WindowsFormsApplication1{
    class serialInterface{
        Form1 senderform = null;
        private SerialPort port = new SerialPort("COM3", 57600, Parity.None, 8, StopBits.One);
        ArrayList lst = new ArrayList();

        public serialInterface(Form1 form)
        {
            this.senderform = form;
            port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
            port.ReadTimeout = 10000;
            //port.WriteTimeout = 1;
            port.Open();
        }

        public void setInitAngle()
        {
            StreamWriter SW;
            SW = File.CreateText("C:\\Users/Public/Documents/tst.txt");

            foreach (int i in lst)
            {
                SW.Write(i + ",");
            }
            lst.Clear();
            SW.Close();
        }


        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) {
            //retrieve number of bytes in the buffer
          int bytes = port.BytesToRead;
            //create a byte array to hold the awaiting data
        byte[] comBuffer = new byte[bytes];
        //read the data and store it
        port.Read(comBuffer, 0, bytes);

            if (bytes >= 4){
                lst.Add((int) comBuffer[2]);
            }
        }
    }
}
Avatar billede lasserasch Juniormester
12. oktober 2010 - 11:44 #1
og du er sikker på at den altid modtager 4 bytes? Hvad nu hvis den kun sender 3 bytes af sted? Så adder du aldrig noget til 'Ist'.

Du fanger det heller aldrig noget sted i koden. Du ignorer det bare.

Jeg ville da fjerne dit 'if' statement hvis du er 110% sikker på at der altid modtages 4 bytes, eller som minimum smide en exception hvis bytes er mindre end 4.

Mvh.
Lasse
Avatar billede freesite Nybegynder
12. oktober 2010 - 20:54 #2
Hej lasserasch

Tak for svar.

Jeg er 100% sikker på der altid sendes 4 bytes, transmitteren er stress testet mod en terminal. Jeg har dog lige prøvet dit forslag og det gør ikke nogen forskel.

Jeg har fundet følgende tråd som behandler nogen lunde samme problem http://www.eksperten.dk/spm/887618 hvor løsningen bliver openNetCf vil lige kigge en gang på det.

Med venlig hilsen Mads
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