Laden...

serialport write ioexception (wegen Timeout)

Erstellt von arakhsh_j vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.270 Views
A
arakhsh_j Themenstarter:in
30 Beiträge seit 2010
vor 12 Jahren
serialport write ioexception (wegen Timeout)

Hallo,

ich hab seit gestern viele Beiträge gelelsen, leider ohne Erfolg. vom PC aus sende ich für 5 Sek. alle 50 ms einen Byte an MC und zwischen durch bekomme ich paar Bytes vom MC zurück.

das ganze hab ich event gesteuert gemacht, d.h. mit serialport.readbyte(), das Problem dabei war, dass nicht alle Daten angekommen sind. Jetzt nehm ich statt readbyte() die read()-Funktion, jedoch
bekomme ich nach paar mal Daten seden mit write() und lesen mit read(), einen IOexception bei
write()-Funktion.

hab keinen schimmer woran das liegt?
Serialport ist dabei auf open, write und read werden bei vom selben thread aus benutzt.
es muss irgenderwas mit read()-Funktion zutun haben, denn solange ich mit readbyte() lese und mit write schreiben bekomme ich keine FEhlermeldung.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo arakhsh_j,

wie lautete die exakte Meldung? (siehe [Hinweis] Wie poste ich richtig? Punkt 5)

herbivore

A
arakhsh_j Themenstarter:in
30 Beiträge seit 2010
vor 12 Jahren

sorry für die verzögerung, war nicht am System, inzwischen hab ich heraus bekommen, dass es etwas mit writeTimeOut zu tun hat wenn ich es auf über 3 sek. erhöhe bekomme ich keinen,
es ist aber kein saubere Lösung, habt ihr vielleicht einen Tipp wie ich dieser Meldung beweltigen kann.


       this.serialPort.DataReceived += this.readDataFromSerialPort;
     
        public void SendDataToSerialPort(byte[] data)
        {
            if (this.serialPort != null)
            {
                try
                {
                    this.serialPort.Write(data, 0, 1);
                }
                catch (IOException ex)
                {
                    MessageBox.Show(" " + ex);
                }
            }
        }
         .
         .
        private void readDataFromSerialPort(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] tempbytearra;
            int databytes;
            int datarraylastindex;

            databytes = this.serialPort.BytesToRead;
            datarraylastindex = DataArray.Count;
            tempbytearra = new byte[databytes];

            this.serialPort.Read(tempbytearra, 0, databytes);
            this.DataArray.AddRange(tempbytearra);
            DataCrawler();
        }

Danke schon mal im vorasu!

T
708 Beiträge seit 2008
vor 12 Jahren

Hi arakhsh_j,

Vorweg. Warum machst Du es Dir nicht einfacher und benutzt:

string msg = comPort.ReadExisting();

Dann muss man nicht mit den Bytes herumhantieren.

Dann würde ich das Ergebnis aus dem ComPort Deiner Funktion übergeben. Denn bisher greifst du auf einen globale Variable zu.
Was also, wenn die Funktion DataCrawler(); noch läuft und der ComPort schon wieder Daten in Dein DataArray schreibt?
Das wird ggf. auch die Problemstelle sein.

Gruß,
trib

A
arakhsh_j Themenstarter:in
30 Beiträge seit 2010
vor 12 Jahren

Danke erst mal für die Antwort.

die fkt. DataCrawler() sucht nahc bestimmten Byte-Muster, die mir den ANfang eines neuen Pakets signalisieren und nimmt den Paket aus dem globalen Array DataArray raus. ich dachte die fkt.

 serialport.read(param,param,param,param); 

tut das gleiche wie

 serialport.readexisting(); 

nur bei der ersten hab ich roh Werte bei der zweiten die Werte als String kodiert!!?

das Problem mit string ist, dass ich die Daten als Rohwerte brauche und nicht kodiert, denn ich muss die weiter verarbeiten (filtern usw...). gibts eine möglichkeit die Daten aus einem String wieder zu Rohwerte zu transformieren??

writetimeout zu erhöhen ist keine saubere Lösung, aus der Fehlermeldung kann ich aber keinen bezug zu WriteTimeOut finden. oder leg ich da falsch??