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.

Tablice w C - Wysyłanie ramki

Damian7546 20 Kwi 2016 11:17 2436 37
  • #1 20 Kwi 2016 11:17
    Damian7546
    Poziom 21  

    Witam,

    Mam funkcję do wysyłania znaków

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i wywołanie w ten sposób działa:
    send_char('1') , działa dobrze.

    Jak wysłać 1bajt np: 0x23 ?

    0 29
  • #3 20 Kwi 2016 11:37
    2N3866
    Poziom 29  

    http://www.tutorialspoint.com/cprogramming/c_data_types.htm

    Twoja funkcja send_char() ma argument typu char. Gdy w kodzie wywołujesz send_char('1'), to kompilator podstawi wartość ASCII stojącą pod znakiem '1' - niejawnie wywoła funkcję ord() dla określenia tej wartości do kompilacji. Gdy chcesz wysłać wartość, to w wywołaniu funkcji podasz wartość (bez cudzysłowów oznaczających łańcuch - stałą lub przechowywaną przez zmienną). Musisz tylko uważać na zgodność typów zmiennych oraz na to, czy twój kompilator traktuje char domyślnie jako unsigned bądź signed.

    0
  • #4 20 Kwi 2016 12:08
    2675900
    Użytkownik usunął konto  
  • #5 20 Kwi 2016 13:11
    Damian7546
    Poziom 21  

    @Jaca to dlaczego jak wysyłam tak jak mówisz :
    send_char(0x23); to w putty dostaje krzaki ?

    A jak wysyłam znak send_char('a'); to dostaje w putty znak a ?

    0
  • #6 20 Kwi 2016 13:13
    2N3866
    Poziom 29  

    Piotrus_999 napisał:
    2N3866 napisał:
    niejawnie wywoła funkcję ord() dla określenia tej wartości do kompilacji

    Żadnej funkcji nie wywoła tylko podstawi wartość. To tak jak byś napisał ze a = 0xdd; wywoła funkcje atoi. A jak kompilator wewnętrznie przelicza tokeny to nas programując niewiele obchodzi.


    To jeszcze raz, inaczej i mniej kontrowersyjnie dla ciebie ;) - kompilator sam określi wartość ASCII dla jednoznakowego łańcucha, żeby wstawić ją na sztywno do kodu, a nie wyznaczać na nowo za każdym uruchomieniem programu.

    Może i nieważne jak, ale ważne co - jestem zdania, że lepiej niech kolega Damian7546 rozumie, co się dzieje.

    0
  • #7 20 Kwi 2016 13:20
    2675900
    Użytkownik usunął konto  
  • #8 20 Kwi 2016 13:25
    Damian7546
    Poziom 21  

    Piotrus_999 napisał:
    Co rozumiesz przez krzaki.
    Powinnienes dostac '#'


    tak masz racje że przy pojednyńczo wysłanyej wartośc 23 otrzymuje #.
    A jak wysyłam całą ramkę:
    send_char(0x01);
    send_char(0x03);
    send_char(0x00);
    send_char(0x01);
    send_char(0x00);
    send_char(0x05);
    send_char(0xD4);
    send_char(0x09);



    delay_ms(100);


    To dostaje w putty nie wiadomo co... Jakaś przerwa i krzaki (nie jest to żaden znak)

    0
  • #9 20 Kwi 2016 13:31
    2675900
    Użytkownik usunął konto  
  • #10 20 Kwi 2016 13:37
    Damian7546
    Poziom 21  

    Piotrus_999 napisał:
    A co chciałbys otrzymać?

    Poprstu złożyłem ramkę modbusową na sztywno i chciałem ją wysłać.

    0
  • Pomocny post
    #11 20 Kwi 2016 13:39
    2675900
    Użytkownik usunął konto  
  • #12 20 Kwi 2016 13:41
    2N3866
    Poziom 29  

    No ale putty to emulator terminala tekstowego, a nie przezroczysty odbiornik bajtów. To tak jak pliki podglądasz w trybie tekstowym, gdzie znaki niedrukowalne są interpretowane, bądź w trybie HEX, gdzie widzisz zawartość "as is" (taką jaka jest).

    0
  • #13 25 Kwi 2016 18:31
    Radzio M.
    Poziom 32  

    Możesz też testować MODBUS w trybie ASCII, jest prostszy od RTU.

    0
  • #14 25 Kwi 2016 19:29
    Damian7546
    Poziom 21  

    @Radzio M. Jednak wole zostać przy RTU.

    0
  • #15 26 Kwi 2016 11:44
    Damian7546
    Poziom 21  

    Piotrus_999 napisał:
    Jask chesz podgladac na terminalu ramki binarne to zainstaluj sobie np realterm.


    Tak właśnie zrobiłem i w terminalu otryzmuje wysyłaną ramkę.
    Wysłałem sztywną ramkę CRC obliczyłem kalkulatorem:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jednak do urządzenia nic nie dociera.
    Gdyby było wszystko ok po stornie "sprzętowej" to wysyłana ramka w pętli jest poprawna ?
    Najprędzej coś nie tak z konwerterem max485.
    Nie do końca rozumie jak ma być sterowany.

    0
  • #16 27 Kwi 2016 07:27
    stracho
    Poziom 12  

    Spróbuj dodać opóźnienie zaraz po załączeniu pinu i przed jego wyłączeniem (przełączanie ustawia max'a w tryb odbierania/nadawania)

    0
  • #17 27 Kwi 2016 07:38
    Damian7546
    Poziom 21  

    Próbowałem tak ale to nie pomaga.
    Muszę się jeszcze przyjrzeć układowi max485 który używam.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #18 06 Maj 2016 07:29
    Damian7546
    Poziom 21  

    A nie trzeba między wysyłanymi bajtami robić opóźnień ?

    0
  • #19 06 Maj 2016 08:00
    stracho
    Poziom 12  

    Są zrealizowane w funkcji send_charUSART1 jako oczekiwanie na flage. Jeżeli masz możliowść podpięcia tego maxa do komputera poprzez jakiś konwerter to sprawdź czy cała ramka ramka dochodzi.
    Ja zwykle steruję RS485 poprzez włączenie sygnału na początku transmisji, a na jej końcu go wyłączam u Ciebie w ostatnim listingu jest na odwrót... rozumiem, że jest to zgodne z dokumentacją ?

    0
  • #20 06 Maj 2016 09:08
    Radzio M.
    Poziom 32  

    A ile trwa to oczekiwanie na flagę? Opóźnienie z tego co pamiętam powinno wynosić najmniej 3.5 * czas wysłania bajtu. Weź oscyloskop lub analizator logiczny, zobacz co się dzieje.

    0
  • #21 06 Maj 2016 09:55
    Damian7546
    Poziom 21  

    @stracho Możesz mi tu wrzucić jakiś sprawdzony schemat?

    Masz z ARMa linie TX , RX , GND i +3,3V i chodzi mi o schemat z MAX485 aby z drugiej strony uzyskać sygnał A i B...

    0
  • #23 06 Maj 2016 11:24
    Radzio M.
    Poziom 32  

    GrzegorzKostka napisał:
    @Radzio M.
    Masz jakiś dokment potwierdzający Twoją tezę?

    Świder Zbigniew "Sterowniki mikroprocesorowe", strona 228.

    0
  • #24 06 Maj 2016 12:15
    stracho
    Poziom 12  

    A ten max może być zasilany z 3,3V ?
    RXD do R0
    TXD do DI
    PA8 do RE,DE
    przyda się chyba też terminator pomiędzy A i B
    Zamiast MAX485 ADM2582EB - zasilanie 3,3V w moim przypadku :)

    0
  • #25 06 Maj 2016 12:31
    Damian7546
    Poziom 21  

    stracho napisał:
    A ten max może być zasilany z 3,3V ?


    Tz samo zasilanie mogę dać 5V. Tylko czy poziom napięcia na liniach TX i RX będzie dobry ?
    W AVR by było ok. A w ARM ?

    0
  • #26 06 Maj 2016 12:36
    2675900
    Użytkownik usunął konto  
  • #27 06 Maj 2016 13:17
    Damian7546
    Poziom 21  

    Miedzy A i B wahania raz 0V raz 2.7V
    zasilanie max485 - 5V
    na lini sterujacej zmienia się napięcie z 0.2v na 3.3v czasami wahniecie na w3.1V
    na TX mam -3.3V na rx -4.1v wzgledem masy

    0
  • #28 06 Maj 2016 13:18
    2675900
    Użytkownik usunął konto  
  • #29 06 Maj 2016 13:31
    Damian7546
    Poziom 21  

    Tak po stronie uC - gdy spięty układ.

    Dodano po 10 [minuty]:

    Gdy wypnę RX i TX z MAX485 To na TX mam 3.3V na RX 0V - względem masy

    0
  • #30 06 Maj 2016 13:47
    2675900
    Użytkownik usunął konto