Vista, odczyt z USB, crash po kilku sekundach

0

Przeniosłem się na Viste i powróciłem do pracy nad programem a tymczasem mam następujący problem w róznym momencie od startu programu (do około 4 sekund)
Nazwa zdarzenia problemu: APPCRASH
Application Name: Centrala1.exe
Application Version: 1.0.0.0
Application Timestamp: 497850ee
Fault Module Name: mscorwks.dll
Fault Module Version: 2.0.50727.1433
Fault Module Timestamp: 471ed580
Exception Code: c0000005
Exception Offset: 00000000001d0a5d
Wersja systemu operacyjnego: 6.0.6000.2.0.0.256.1
Identyfikator ustawień regionalnych: 1045

Nie mam pojęcia co to może być i jak to zinterpretować. Pomocy !

0

Dodam do tego to że zauważyłem problem wiąże się z występowaniem SerialPort1.ReadByte() w wątku pobocznym. Tzn jak nie zczytuje z serial portu tylko z pliku to jest ok. Używam PL 2303 konwerter USB-serial. Na XP bylo ok. Tutaj stery są pod Win Viste niby więc tez nie powinno być problemu :/

0

W internecie znajdziesz mnóstwo wiadomości na ten temat, które mogą wystąpić z różnych powodów.
[1] http://forums.microsoft.com/msdn/ShowPost.aspx?siteid=1&PostID=63223
[2] http://forums.techguy.org/windows-vista-7/601874-exception-code-c0000005.html
[3] http://www.forumtopics.com/busobj/viewtopic.php?p=77239#77239

Edit: jeśli to problem z COM to może należy zainstalować odpowiednie sterowniki pod Vistę

0

Tak jak mówilem - wystarczy ze jest
byte x = Convert.ToByte(serialPort1.ReadByte());
które nic zupelnie nie zmienia bo nie jest to nigdzie dalej zapisywane i juz wywala po róznym czasie. Tymczasem jest jest np
byte x = (byte)1; przykładowo to już sobie działa bez problemu.
Wnosek że jest to związane z portem. Co więcej - zczytywanie działa ale przez rózny czas - czasem szybciej sie zawiesza czasem poźniej ale coś tam zczytuje na początku więc nie jest tak że nie działa, tylko coś tam bruździ :((

0

A więc najbardziej prawdopodobne jest to że źle pobierasz dane z SerialPort-u. Sprawdzasz czy jakieś dane są dostępne przed wczytaniem ? Mały tutorial: http://www.dreamincode.net/forums/showtopic35775.htm

0

Zrobiłem prosty test: program który na timerze robi coś takiego:

private void timer1_Tick(object sender, EventArgs e)
{
while (true)
{
if (serialPort1.BytesToRead > 1)
textBox1.Text = Convert.ToString(serialPort1.ReadByte());
else
break;
}
}

ten sam błąd wywala. Teraz to już ktoś mądry może chyba powiedzieć co jest nie tak.

0

Ok sprawcyzowalem to jeszcze bardziej:
private void timer1_Tick(object sender, EventArgs e)
{
while (true)
{
if (serialPort1.BytesToRead > 1)
textBox1.Text = "Adam"; //jak widac feralnym jest serialPort1.BytesToRead()
else
break;
}
}

wiec o to chodzi - serialPort1.BytesToRead() ....

0

a jednak mam chyba to co trzeba - to nie wina portu. Looknijcie na tą obsługe timera:

private void timer1_Tick(object sender, EventArgs e)
{
bool x = true;
while (true)
{
if (x)
{
textBox1.Text = "adam";//Convert.ToString(serialPort1.ReadByte());
}
else
break;
}

    }

widać że nigdy nie wyjdzie z tej pętli. Ale zamiast zawieszać to daje własnie ten sam dokładnie błąd. Tylko że w mojej aplikacji wątek poboczny działa w pętli właśnie niekończącej się i pewnei dlatego po pewnym czasie windows wywala błąd tak jakby bał się że jest to zawias... (a nie jest to bo jest to działanie celowe gdyż w tej pętli zczytuje z portu). No teraz to już licze na pomoc kogoś doświadczonego - problem został zdefiniowany :)

0

Nie no obsługa timer-a jest genialna ;) Zabierz tę nieskończoną pętlę. Rozumiem że chcesz nasłuchiwać na danym porcie. Więc zegar co jakiś czas wywołuje metodą sprawdzającą. Nie ma sensu umieszczać tam nieskończonej pętli.

0

Jejciu - to jest celowo zrobione żeby wywołać ten błąd. Wiem jak sie obsługuje port itd. Chodzi tylko o ten błąd. Występuje on również w takim wypadku:

private void timer1_Tick(object sender, EventArgs e)
{
int x = 1;
while(true)
{
if (x<100000)
{
x++;
textBox1.Text = x.ToString();//Convert.ToString(serialPort1.ReadByte());
}
else
break;
}

    }

teoretycznie konstrukcja powinan przejść - tymczasem w różnych przypadkach wywala z tym własnei błedem. (w róznych chwilach).

0

A tak odpowiadając na Twoje pytanie - nie moge zrobic sczytywania z RS na timerze bo musze to mieć w innym wątku a obsługę timera nie moge zrobic w innym wątku niż wątek główny programu więc musze w pętli nieskończonej czekać na dane - proste.

0
  1. Używaj znaczników < cpp>< /cpp>
  2. Coś takiego wywala błąd:
private void timer1_Tick(object sender, EventArgs e)
        {
            int x = 1;
                while(true)
                {                    
                    if (x<100000)
                    {
                        x++;
                        textBox1.Text = x.ToString();//Convert.ToString(serialPort1.ReadByte());
                    }
                    else
                        break;
                }
            
        }

???
Jesteś pewien, że to ten kawałek kodu a nie np. jakiś inny wątek?

0
Popcio napisał(a)

nie moge zrobic sczytywania z RS na timerze bo musze to mieć w innym wątku

Użyj System.Threading.Timer, wtedy obsługa sygnału Tick, jest obsługiwana w innym wątku.

Popcio napisał(a)

musze to mieć w innym wątku a obsługę timera nie moge zrobic w innym wątku niż wątek główny programu więc musze w pętli nieskończonej czekać na dane - proste.

Dlaczego nie możesz ? Proste - w tym przypadku to Lenistwo :P

0

W programie nie ma innych wątków i jestem pewien że ten fragmen wywalił mi bład. Zastanawiam sie czy to nie ma jakiegoś związu z taką opcją Visty jak "wykrywanie pobierania danych" czy coś takiego co monitoruje własnie takie przypadki pętli nieskończonych.

Dzieki za System.Threading.Timer. Nie widziałem. Dziękuje - to znaczy ze obsluga zdazenia na nim jest w innym watku ?

0

To sie nazywa DEP - zapobieganie wykonywania danych. Nie moge wyłączyć tego dla mojego programu (pisze że musi być uzywane DEP dla tego programu) :/

0

To niestety nie to - wyłączyłem i niestety ten sam problem :(

0

Tak, są uruchamiane w innych wątkach. Przykład:

        static void Main(string[] args)
        {
            System.Threading.TimerCallback _timerCallBack = new System.Threading.TimerCallback(
                delegate(object param)
                {
                    Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
                });
            System.Threading.Timer timer = new System.Threading.Timer(_timerCallBack);
            timer.Change(0, 1000);
            Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
            Console.Read();
        }

P.S. Nie pisz post pod postem, bo trudno zrozumieć o co Ci chodzi. Masz użytkownika na forum, więc się zaloguj i edytuj swoje posty. ;)</cpp>

0

Niestety obsluga w timerze tak jak mi poweidziales tez generuje błąd. Myśle że warto się zastanowić czemy taka prosta konstrukcja (choć nie słuzy niczemu) też generuje dokładnie ten sam błąd:

public Form1()
{
InitializeComponent();
serialPort1.Open();
timer1.Start();
}

    private void timer1_Tick(object sender, EventArgs e)
    {
        while (serialPort1.BytesToRead > 1)
           serialPort1.ReadByte();         
    }

dodam że wyskakuje ten błąd gdzieś po kilku sekundach

0

Odpal program w Visualu w trybie debug. Dostaniesz bardziej szczegółową informacje.

0

kompletnie nic to nie daje. Błąd wyskakuje windowsowski a debuger nie pokazuje miejsca powstania problemu. (Debug jest "running" nie ma żadnych info. Trzeba przerywać debugowanie na chama).

0

Czy na tym samym sprzęcie pod XP żadnego błędu nie ma?

0

Dokładnie - działa jak huragan

0

To może Vista jakoś inaczej zarządza portami, inaczej je nazywa, operuje, cokolwiek... Albo sterowniki pod Vistę działają inaczej. Niestety te przejściówki nie działają tak jak oryginalny port.

0

Raz udalo mi sie ze windows za pomoca sieci napisal mi następujący komunikat:

Problem caused by Microsoft .NET Framework 1.0

This problem was caused by Microsoft .NET Framework 1.0, which was created by Microsoft Corporation.

There is no solution for this problem at this time. However, your computer might be missing updates that can help improve its stability and security.

Recommendation


Go online to check for and install Important updates.

Click to go to Windows Update:

Windows Update

In the left pane, click Check for updates. If any updates are found, click View available updates.

Select all Important updates, and then click Install. If you are prompted for an administrator password or confirmation, type the password or provide confirmation.

Note
If you have turned on automatic updating, you might not see any Important updates listed. If this is the case, the updates have already been downloaded to your computer.

Wszystkie aktualizacje mam zainstalowane ... :(

0

Poza tym w programie wszystkie referencje są do wersji frameworka 2.05...

0

Przeprwaodzilem wszystkie aktualizacje - i jeszcze SP1 doinstalowalem. Nadal problem występuje :(

0

moze to cos pomoze, podczas komplikacji pokazuje mi sie nastepujacy warning

warning CS1607: Assembly generation -- Wskazywany zestaw „mscorlib.dll” wskazuje inny procesor

a sam wyskakujący błąd dotyczy mscorwks.dll

LOL aureka - teraz dziala - ustawilem kompilacje na x86 i przy tej kompilacji dziala fajnie. Przy x64 albo Any CPU wyurzca wlasnie ten warning a potem w trakcie dzialania wywala blad

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