Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

STM32F103rb - Transmisja szeregowa

Damian7546 15 Wrz 2016 08:39 795 4
  • #1 15 Wrz 2016 08:39
    Damian7546
    Poziom 21  

    Witam,

    Mam urządzenie z którym chciałbym się skomunikować.
    Za pomocą Realterm wysyłam do urządzenia 3 znaki:
    /#1

    i urządzenie odpowiada całą paczką danych.

    Przepięcie linii USB/RS232TTL do mikrokontrolera sprawiła mi jak zwykle kłopot.
    A mianowicie wysyłam do urządzenia te 3 znaki z STM32 natomiast urządzenie nie odpowiada....
    Może mi ktoś powie jak dobrze napisać funkcję od przerwania z RX żebym wszystko z odpowiedzi urządzenia miał zapisane w tablicy ?

    Realizuję to tak:
    Co 6 sekund wystawiam flagę do wysłania znaków:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    W mainie wysyłam znaki jeśli flaga2==1:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    i w przerwaniu czekam na odebrane dane:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Co tu na pierwszy rzut oka zmienić żeby dane się pojawiły ?

    Dodano po 40 [minuty]:

    Dodałem między wysyłanymi znakami opóźnienia i urządzenie odpowiada jednak ja nie mogę tego "uchwycić" w tablicy w przerwaniu od RX w USART2 ....

    0 4
  • Pomocny post
    #2 15 Wrz 2016 08:40
    BlueDraco
    Specjalista - Mikrokontrolery

    Co robi funkcja send_uintUSART2? Nazwa sugeruje, że raczej nie wysyła znaków.

    Pomysł z nadawaniem z aktywnym oczekiwaniem i odbiorem w przerwaniu zajeżdża amatorszczyzną, ale czasami działa. Za to brak zabezpieczeń przed przepełnieniem bufora odbioru to już poważny błąd.

    0
  • #3 15 Wrz 2016 08:54
    Damian7546
    Poziom 21  

    Masz racje bo to amatorski projekt.
    Funkcja send_uintUSART służy do wysyłania znaków:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Podsłuchałem co jest na linii i mikrokontroler wysyła te trzy znaki a urzadzenie odpowiada , więc problem leży póki co tylko tutaj:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niezbyt dobrze wygląda to przypisywanie do bufora, ale nie mam pomysłu jak to inaczej zrealizować ... Jakaś może wskazówka ?

    Dodano po 50 [sekundy]:

    Bo w byte2 nie ma nic albo same zera.

    Dodano po 55 [sekundy]:

    A powinno być: (z realterm, Display-ASCII):
    026788 235178 018078 018078 000000 000000 000012 043739 933676

    Dodano po 1 [minuty]:

    i na końcu CR

    0
  • #4 15 Wrz 2016 09:29
    2675900
    Użytkownik usunął konto  
  • #5 15 Wrz 2016 10:41
    Damian7546
    Poziom 21  

    @BlueDraco Zrobiłem zabezpieczenie przed przepełnieniem bufora i teraz ramka jest w buforze taka jakiej się spodziewałem...
    STM32F103rb - Transmisja szeregowa

    Jak teraz obrobić te dane ?

    Dodano po 45 [minuty]:

    026788 235178 018078 018078 000000 000000 000012 043739 933676

    Każdy z cyferek to znak, jest ich 63 łącznie z spacjami.
    Jak teraz każdą z tych 9 cyfr zamienić na INT ?

    Tz żeby np: 026788 było int'em ?

    Dodano po 25 [minuty]:

    Problem rozwiązany, zrobiłem to tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0