Komunikacja Komputer <-> mikrokontroler

Odpowiedz Nowy wątek
2010-12-08 17:06

Rejestracja: 9 lat temu

Ostatnio: 3 lata temu

0

Witam.

Mam problem z komunikacją pomiędzy komputerem a mikrokontrolerem. Polega on na tym, że dane odbierane z mikrokontrolera są odbierane poprawnie dopiero po jakimś czasie. Tzn wysyłam z komputera komendę połącz, łącze się z UC który zaczyna non stop wysyłać mi jedną daną, dana wysyłana jest poprawnie (sprawdzone na Bray terminalu) mój program dopiero po kilkukrotnym wysłaniu mu tej danej odczytuje ją poprawnie. Do czasu gdy jej poprawnie nie odbierze dana ma ostatnia wartość jaka była zapisana.

public void odbior_danych(object sender, SerialDataReceivedEventArgs e)
        {
            data = port.ReadByte();
            status_wys(data.ToString());  // Wyswietlenie danej
        } 
edytowany 1x, ostatnio: mati1988k, 2010-12-08 17:09

Pozostało 580 znaków

2010-12-11 17:35

Rejestracja: 9 lat temu

Ostatnio: 3 lata temu

0

I jak nikt nie potrafi mi pomóc z tym problemem ? :) Bo jest to dla mnie dosyć istotne.

Pozostało 580 znaków

2010-12-11 23:28
Moderator

Rejestracja: 11 lat temu

Ostatnio: 12 godzin temu

Lokalizacja: Wrocław

0

Jesteś pewien, że ten Twój sprzęt wysyła pojedynczy bajt?


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2010-12-12 00:10

Rejestracja: 9 lat temu

Ostatnio: 3 lata temu

0

Na pewno :) Sprawdzaliśmy na oscyloskopie na bray terminalu więc w 100% dane wysyłane są poprawne.

Pozostało 580 znaków

2010-12-12 00:56
Moderator

Rejestracja: 11 lat temu

Ostatnio: 12 godzin temu

Lokalizacja: Wrocław

0

To może kwestia odpowiedniej konfiguracji kontrolki SerialPort, jakiejś parzystości, timeoutów, czy czegoś tam.


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2010-12-12 19:50

Rejestracja: 9 lat temu

Ostatnio: 3 lata temu

0

To też jest ustawione ok :(. A niestety bray terminal nie jest open source żebym mógł podejrzeć jak oni to rozwiązali.

edytowany 1x, ostatnio: mati1988k, 2010-12-12 19:51

Pozostało 580 znaków

2010-12-13 11:22

Rejestracja: 10 lat temu

Ostatnio: 8 lat temu

0

Możesz dokładnie napisać co wysyłasz i co otrzymujesz w odpowiedzi? Co jaki odstep czasu urządzenie wysyła ci ten bajt?

Pozostało 580 znaków

2010-12-13 19:00

Rejestracja: 9 lat temu

Ostatnio: 3 lata temu

0

Wysyłanie wygląda tak:

//************* Wysyłanie Danych *************
        if(bit_is_set(flaga,0) && bit_is_set(flaga,1))
        {

            // ************* Wysyłanie Ciagu *************
            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = START_CIAG;      //0b00000010

            licz=0;
            for (int k=0; k<80 ; k++)
                {
                    ClrBit(PORTD,7);
                    Send_SPI();
                    licz++;
                }

            bubblesort(licz);

            buforH_SPI = (tab_pom[40]>>8);
            buforL_SPI = tab_pom[40];

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = buforH_SPI;

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = buforL_SPI;  

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = END_CIAG;        //0b01000000
            // ************* Koniec Ciag *************

            // ************* Wysyłanie pradu *************

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = START_PRAD;      //0b00000100
            licz=0;         

            for (int k=0; k<80 ; k++)
            {
                ClrBit(PORTE,7);            //włączenie przetwornika U4
                Send_SPI();
                licz++;
            }

            bubblesort(licz);

            buforH_SPI = (tab_pom[40]>>8);
            buforL_SPI = tab_pom[40];

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = buforH_SPI;

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = buforL_SPI;  

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = END_PRAD;        //0b00100000
            // ************* Koniec Prad *************

            // ************* Wysyłanie prdkosci obrotowej *************

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = START_OBROTY;        //0b00001000

            obroty=(obroty*2)/3;        //Obliczanie obr/sec dla 3 łopat

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = obroty;

            while(!(UCSR1A&(1<<5)));
            //_delay_us(400);
            UDR1 = END_OBROTY;      //0b00010000
            // ************* Koniec prdkosci obrotowej *************

        }
        // ************* Koniec Danych ************* 

dosyć szybko i dosyć sporo ;). Bray terminal dostaje dobre dane które od razu są wyświetlane dobrze. Mój program odświeża dane po jakiś 5 sekundach albo dłużej. (nie zawsze taki sam czas).

Pozostało 580 znaków

2010-12-14 09:25

Rejestracja: 10 lat temu

Ostatnio: 8 lat temu

0

Lol, niewiele da się zrozumieć z twojego kodu, może się mylę,ale chyba przerabiałeś z C++. Może napisz do czego używasz poszczególnych zmiennych i metod. No i kod metod też by się przydał. Wysyłasz 3 komendy do urządzenia, a potem czekasz na 3 odczyty, tak mam to rozumieć? Może wydziel z tego jakiś mniejszy kawałek kodu, na którym mógłbyś przetestować wysyłanie i odbieranie

Pozostało 580 znaków

2010-12-14 12:10
Moderator

Rejestracja: 11 lat temu

Ostatnio: 12 godzin temu

Lokalizacja: Wrocław

0
mati1988k napisał(a)

dosyć szybko i dosyć sporo ;). Bray terminal dostaje dobre dane które od razu są wyświetlane dobrze. Mój program odświeża dane po jakiś 5 sekundach albo dłużej. (nie zawsze taki sam czas).

To może kwestia jakichś buforów?
Np.:
http://msdn.microsoft.com/en-[...]s.serialport.bytestoread.aspx
http://msdn.microsoft.com/en-[...]erialport.readbuffersize.aspx


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

2010-12-14 14:33

Rejestracja: 16 lat temu

Ostatnio: 19 godzin temu

0
while(!(UCSR1A&(1<<5)));
UDR1 = buforL_SPI;

A nie ma ten µC jakiegoś UART-a czy czegoś takiego, byś nie musiał tak rzeźbić?

edytowany 1x, ostatnio: Azarien, 2010-12-14 14:34

Pozostało 580 znaków

Odpowiedz

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