logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega 328P: Brak komunikacji przez RS232 z programem C++ na PC

zgred125 22 Sie 2014 18:36 1281 5
REKLAMA
  • #1 13899029
    zgred125
    Poziom 11  
    Posty: 22
    Ocena: 5
    Witam

    Od pewnego czasu zajmuje się komunikacją ATMEGI 328P i komputera poprzez popularny prot COM. Napisałem własny program w C++, który odbiera pewne dane od ATMEGI. W programie użyłem struktury DCB Winapi. Jako, że Atmega nie odzywa się nie pytana użyłem timera, który sprawdza czy przypadkiem coś nie przyszło. Poniżej kod, którego używam (dla komputera)

    
    //inicjacja zmiennych
    static DCB dcb;
    static HANDLE hNumPort;
    static char lpBuffor_read[33], lpBuffor_write[33];
    static DWORD RS_ile;
    
    //otwarcie portu
    dcb.DCBlength = sizeof(dcb);
    
    [inContentAd]
    
    dcb.BaudRate = CBR_9600;
    dcb.fParity = TRUE;
    dcb.Parity = EVENPARITY;
    dcb.StopBits = ONESTOPBIT;
    dcb.ByteSize = 7;
    
    dcb.fDtrControl = DTR_CONTROL_ENABLE;
    dcb.fRtsControl = RTS_CONTROL_ENABLE;
    
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fAbortOnError = FALSE;
    dcb.fOutX = FALSE;
    dcb.fInX = FALSE;
    dcb.fErrorChar = FALSE;
    dcb.fNull = FALSE;
    
    //polecenie sprawdzenia i zapisania nowych danych do tablicy zmiennych lpBuffor_read
    ReadFile(hNumPort, lpBuffor_read, 15, &RS_ile, 0);
    


    Port otwiera się prawidłowo i bez większego problemu mogę wysłać dane do atmegi problem pojawia się kiedy Timer próbuje odczytać dane z bufora i zapisać je do tablicy lpBuffor_read. Cały program się zawiesza (tzn zewnętrzna powłoka nigdzie nie mogę kliknąć nie mogę zamknąć programu) a port dalej zostaje otwarty a dane prawidłowo wysyłane i odbierane (zakładając, że coś przyjdzie).

    Najdziwniejsze, że jest to, że wystarczy otworzenie portu np w ARDUINO IDE zamknięcie go i wszystko działa jak należy aż do ponownego uruchomienia przejściówki/restartu komputera.
    Atmega ma osobne zasilanie z stablizatora 5v a pomiędzy przejściówką a atmega jest tylko wspólna masa.
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 13900204
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    Zawiesza się bo tego nie robi się w ten sposób... jest cała biblioteka obsługująca serial port, i musisz obsłużyć zdarzenie SerialDataReceivedEventArgs.
  • REKLAMA
  • #3 13900719
    zgred125
    Poziom 11  
    Posty: 22
    Ocena: 5
    Co to za biblioteka i gdzie można ją znaleźć? Troszeczkę zmyliło mnie to, że jak wcześniej otworze i zamknę port w innym programie to program działa jak należy
  • REKLAMA
  • REKLAMA
  • #6 13904436
    cepelia
    Poziom 20  
    Posty: 341
    Pomógł: 40
    Ocena: 9
    Ja akurat nie piszę w c++ ale zasada jest taka sama...


    W pierwszej kolejności tworzysz sobie informacje na temat portu com który będziesz wykorzystywał...
    Po czym ustawiasz handler jakiejś metody na serialportreclive... itd...

    Jak dane pojawią cię na porcie to je zapisujesz, wyświetlasz czy co tam z nimi chcesz to robisz...

    Napiszę za chwilę jakiś poradnik do tego wyjaśniający jak to się robi to wrzucę link, a tymczasem jak byś kliknął w szczegóły zdarzenia o którym pisałem, oczom twoim ukazałby się taki oto widok...

    http://msdn.microsoft.com/pl-pl/library/syste...spx?cs-save-lang=1&cs-lang=cpp#code-snippet-1

    Dodano po 3 [godziny] 8 [minuty]:

    http://visuastudio-vbnet.blog.pl/2014/08/24/k...lera-z-komputerem-z-wykorzystaniem-portu-com/
REKLAMA