Problemy z portem szeregowym

0

Problem jest nastęujący: przy transmisji 115200 po pewnym czasie działania aplikacji (losowo - nieraz po 2 godzinach nieraz po 30 minutach) następuje dziwna zamiana bajtów w buforze danych przychodzących. Po prostu w pewnym momencie w buforze dane się mieszają i już taki mentlik pozostaje. Po restarcie aplikacji znowu wszystko działa dobrze. Problem powtarzał się zarówno w VS C# jak i w Delphi. Uzywam portu wirtualnego ale i na rzeczywistych też występuje ten problem. Próbowałem róznych rzeczy zarówno z właściwościami SerialPort-a jak i w menadżerze urządzeń. Czyżby w windowsach coś było skopane ? Czy może komponenty są źle zrobione, że taka sytuacja występuje. Czy ktoś z was napotkał już taki problem albo o nim słyszał ? Podobny problem opisano tutaj http://bytes.com/groups/net-vb/382981-serial-port-data-loss jednak nie widać żadnych odpowiedzi...

0

mi to raczej wyglada na problem Twojego nieprawidlowego czytania z buforowanego strumienia danych.. ot, czytajac sobie dane, czytasz "lopatologicznie" i zakladasz ze jak cos doszlo, to jest to CALY pakiet. a tak byc moze nie musi byc? moze w momencie gdy czytasz z bufora, do tego bufora dotarl dopiero np, 34% pakietu? jak to przeczytasz i uznasz za calosc, otrzymasz "uciety pakiet", potem kiedys przeczytasz nastepny pakiet, ale owczas do bufora dolecialo juz pozostale 66% poprzedniego i xx% nowego pakietu..

slowem: komunikacja trwa troche czasu i niekoniecznie jest 'pakietowa', zwlaszcza watpie zeby na serialu u Ciebie taka byla.. pewnie masz po prsotu strumien bajtow przychodzacy do bufora io, a granice konca transmisji i startu nowej sam musisz wykryc.. albo przynamniej prawidlowo rozrozniac czy komunikat jest caly czy tylko fragment doszedl

0

Robei to tak w wątku zczytywania:

while (true)
                {
                    n = serialPorts[(byte)o].BytesToRead; //okreslenie ilosci bajtow do przeczytania z portu COM
                    if (n > 10)
                    {
                        MySerialBuffer = new byte[n];
                        serialPorts[(byte)o].Read(MySerialBuffer, 0, n);
                        for (j = 0; j < n; j++)
                        {
                            //tutaj ogolnie cos robie z danymi ktore zebralem
                            dekoduj_mon83(MySerialBuffer[j], (byte)o);
                        }
                    }
                    else
                        System.Threading.Thread.Sleep(5);
                }
0

Ogólenie to zbieram próbki przebiegów (a nie pakiety !). Po pewnym czasie po prostu widać że bajty są pomieszane. Dokładnie tak jak mówił człowiek w linku z mojego posta na początku tematu.
Przypuszczalnie problem jest po stronie sprzętowej. W Windows można ustawić bufor na 14 bajtów (chyba) ale nie więcej. Jak dałem mniej miałem jeszcze większe problemy (mimo ustawiania bufora w C# SerialPort.ReceiveBuffer na dużą wartość). Widać rozwiązaniem byłoby zwiększenie tego bufora niż windows umożliwia (max 14). A jak to zrobić ? (domyślnie jest tam 16550 a dokłądnie 16550A który umożliwia 16 bajtowe FIFO, choć np to samo pokazuje się dla układów z PL-2303 gdzie bufor jest większy, czyli jak rozumieć to FIFO- takie niby programowe windowsowskie..)

1 użytkowników online, w tym zalogowanych: 0, gości: 1