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

Jak przekonwertować liczbę szesnastkową na dwa znaki ASCII w Modbus ASCII?

Krokus22 27 Lis 2011 17:27 2557 10
REKLAMA
  • #1 10189529
    Krokus22
    Poziom 19  
    Posty: 417
    Pomógł: 4
    Ocena: 103
    Witam, siedzę już długo nad kodem i mam następujący problem.
    Posiadam w pamięci programu zmienna typu unsigned char, reprezentuje ona pewną wartość szesnastkową. Potrzebuję przekonwertować ją na dwa znaki ASCII. To znaczy:

    Jest ciag w pamieci:
    0x11 0x03 0x00 0x6B 0x00 0x03

    Rozbijamy go na czesci:
    1 1 0 3 0 0 6 B 0 0 0 3 7 E

    I zamieniamy na ASCII:
    3131 3033 3030 3642 3030 3033 3745

    Dodam że jest to na potrzeby realizacji protokołu Modbus ASCII. Widziałem prawie gotowe biblioteki ale nie wiele z nich wynika, a próbuję skonstruować odpowiedź slave'a do mastera.
    Pozdrawiam.
  • REKLAMA
  • #2 10189666
    Jado_one
    Poziom 22  
    Posty: 650
    Pomógł: 43
    Ocena: 12
    W którym miejscu masz problem z konwersją?
  • REKLAMA
  • #3 10189950
    Krokus22
    Poziom 19  
    Posty: 417
    Pomógł: 4
    Ocena: 103
    Chodzi o to rozbicie Hexa na dwie składowe, gdybym miał je w formacie inta (składową H i L w tablicy dwuelementowej), to przekonwertowałbym je przy pomocy Lookup table.
  • REKLAMA
  • Pomocny post
    #4 10190165
    INTOUCH
    Poziom 30  
    Posty: 1581
    Pomógł: 99
    Ocena: 199
    Nie bardzo rozumiem co kombinujesz ale jeżeli programujesz w C to możesz skorzystać z.
    #include <string.h>
    #include <stdlib.h>
    Jak chcesz podzielić int na 2*char to możesz skorzystać z unii.
  • REKLAMA
  • Pomocny post
    #5 10190238
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    O coś takiego chodzi?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #6 10190270
    Szumlus
    Poziom 17  
    Posty: 124
    Pomógł: 27
    Witam,
    Kolega za dużo kombinuje...bierzemy bajt do konwersji i rozdzielamy na dwie 4 bitowe wartości (używamy do tego celu maski zmienna = zmienna&maska), następnie konwertujesz dwa półbajty do ASCII i po problemie :)
    Sama konwersja też jest dość prosta, sprawdzasz czy pół bajt mniejszy od 10 jeśli tak to robisz logiczny or z 0x30h jeśli większy lub równy możesz użyć np. lookup table.

    Pozdrawiam,
    Marcin
  • Pomocny post
    #7 10190287
    michalko12
    Specjalista - Mikrokontrolery
    Posty: 3394
    Pomógł: 462
    Ocena: 321
    Szumlus napisał:
    Kolega za dużo kombinuje...bierzemy bajt do konwersji i rozdzielamy na dwie 4 bitowe wartości


    A według ciebie co ten kod powyżej dodatkowo robi?
  • Pomocny post
    #8 10190498
    Jado_one
    Poziom 22  
    Posty: 650
    Pomógł: 43
    Ocena: 12
    Oj...za szybko, żeście gotowca walnęli ;-)
  • #9 10190688
    Krokus22
    Poziom 19  
    Posty: 417
    Pomógł: 4
    Ocena: 103
    Spokojnie, ja też coś skleiłem eksperymentalnie w C++ oto kod.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #10 10191083
    Jado_one
    Poziom 22  
    Posty: 650
    Pomógł: 43
    Ocena: 12
    Troche skomplikowanie to wygląda - ale ja nie znam C++ :-)
    Rozumiem, ze to czesc wiekszej całości?
    Działa?

    Ja osobiście podziały bajtów (lub liczb wielobajtowych) realizuję (podobnie jak koledzy wyżej) przez maskowanie odp. fragmentów bajtów (lub większych wielobajtowych zmiennych) za pomocą masek bitowych + odpowiednie przesunięcia bitowe.
  • #11 10191504
    Krokus22
    Poziom 19  
    Posty: 417
    Pomógł: 4
    Ocena: 103
    Podana funkcja hex2ascii działa wyśmienicie, dziękuję!

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik poszukiwał sposobu na konwersję wartości szesnastkowej przechowywanej w zmiennej typu unsigned char na dwa znaki ASCII w kontekście protokołu Modbus ASCII. W odpowiedziach zaproponowano różne metody, w tym wykorzystanie unii w języku C oraz maskowanie bitowe do rozdzielenia bajtów na półbajty. Przykładowa funkcja Hex2Ascii została przedstawiona, która konwertuje bajty na odpowiadające im znaki ASCII. Użytkownik potwierdził, że podana funkcja działa poprawnie.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA