Dwu-bajtowe słowa

Dwu-bajtowe słowa
0

Witam mam problem z 2bajtowymi słowami.
Otrzymuję z czujnika 14 bajtowych słów, każde są parą (przykład bajt 6 i 7 dają współrzędną x w przestrzeni) 0x00 0x23 na przykład
Zapisuję je do tablicy "uint16_t inBuff[14];"
Moje pytanie brzmi jak mogę je połączyć i zamienić na zwykłego inta?

Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
1
  1. Jako co jest dostajesz? 2 bajty litttle endian?
  2. Co to jest "zwykły" int dla ciebie? int 32? int 64? little endian? big endian? signed? unsigned?

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
0
  1. Tak 2 little endian, najmniej znaczący pierwszy
  2. unsigned, żebym mógł wykorzystać tę współrzędną później w if'ach

to wygląda tak, dostaję 14 bajtów z czego tylko 6 jest mi potrzebnych (4,5 numer obiektu)(6,7 pozycja X)(8,9 pozycja Y)
Powinienem również chyba zmienić deklarację bufora inBuff na uint8_t zamiast 16?

Sparrow-hawk
  • Rejestracja:prawie 13 lat
  • Ostatnio:4 miesiące
  • Lokalizacja:Katowice
  • Postów:189
1

Tak, bufor może być uint8_t

Najprostsza zamiana:

Kopiuj
uint16_t v = buffor[i + 1] << 8 | buffor[i];

Można jeszcze pokusić się o takie rozwiązanie (Mało przenośne, zakłada, że kod uruchomiony będzie na platformie LE):

Kopiuj
#include <iostream>
#include <cstdint>

using namespace std;

uint8_t Buffer[4] = {0xAA, 0x55, 0xBB, 0x66};

int main() {
	
	uint16_t *ptr = (uint16_t*)Buffer;
	for (size_t i = 0; i < 2; ++i)
		std::cout << std::hex << ptr[i] << std::endl;
	
	return 0;
}
edytowany 1x, ostatnio: Sparrow-hawk
0

Po krótkim testowaniu doszedłem to takiego rozwiązania

Kopiuj
uint16_t buffor1 = 0xaa55;
inti1=buffor1<<0;
printf("%i \n",i1);

w takim przypadku dostaję faktyczną wartość 43 605

teraz nie wiem, jak połączyć
uint8_t buffor[0]=0x55;
uint8_t buffor[1]=0xaa;
aby powstało pełne 16-bitowe słowo które już będzie można odpowiednio zmienić na int

0
Dawid9p napisał(a):

Po krótkim testowaniu doszedłem to takiego rozwiązania

Kopiuj
uint16_t buffor1 = 0xaa55;
inti1=buffor1<<0;
printf("%i \n",i1);

czyli po prostu nie muszę nic przesuwać binarnie... na szczęście :P

w takim przypadku dostaję faktyczną wartość 43 605

teraz nie wiem, jak połączyć
uint8_t buffor[0]=0x55;
uint8_t buffor[1]=0xaa;
aby powstało pełne 16-bitowe słowo uint16_t 0xaa55

0

Przepraszam za spam, nie mogę edytować ani usuwać postów...
Można zamknąć, problem rozwiązany, little endiany zrosły się w większego :) dziękuję za pomoc Sparrow-hawk

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.