Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Atmega 328P i komunikacja RS23 -

zgred125 22 Aug 2014 18:36 1179 5
  • #1
    zgred125
    Level 11  
    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);
    
    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.
    Code: cpp
    Log in, to see the code
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • #2
    cepelia
    Level 20  
    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.
  • #3
    zgred125
    Level 11  
    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
  • #6
    cepelia
    Level 20  
    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/