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

Dziwne działanie funkcji. Co mogę robić źle? Załączony kod.

propa 19 Lip 2007 12:37 1125 4
REKLAMA
  • #1 4094953
    propa
    Poziom 13  
    Posty: 41
    Pomógł: 2
    Witam.
    Napisałem 2 funkcje które konwertują "long int" do char'a zapisane bitowo i na odwrót. Po wykonaniu pierwszej w Value mam następujące wartości
    00 00 03 E8
    natomiast gdy wykonam drugą jako liczbę otrzymuje
    0x000002E8
    Co mogę robić źle, ewentualnie czy macie może inny sposób rozwiązania mojego problemu.

    
    void ulIntToChar(long unsigned int value, char *l)
     {
       *l++ = value >> 24;
       *l++ = (value >> 16) & 0x000000FF;
       *l++ = (value >> 8) & 0x000000FF;
       *l++ = value & 0x000000FF;
       *l++ = '\0';
     }
    long unsigned int CharToulInt(char *value)
     {
      long int value_ret;
      value_ret = 0;
      value_ret = (value_ret+value[0])<<8;
      value_ret = (value_ret+value[1])<<8;
      value_ret = (value_ret+value[2])<<8;
      value_ret = value_ret+value[3];
      return value_ret;
     }
    char Value[4];
    int main (void)
    {
     long unsigned int wartosc;
     long unsigned int wartosc1;
        wartosc = 1000;
     while(1)
      {
    
        ulIntToChar(wartosc,Value);
    	wartosc1 = CharToulInt(Value);
      }
      
    }
  • REKLAMA
  • #2 4095101
    directx11
    Poziom 17  
    Posty: 250
    Pomógł: 25
    Ocena: 14
    Chętnie bym Ci pomógł, ale nie bardzo rozumiem istotę tej operacji, co ona ma na celu? Masz liczbę 1000 w przykładzie jako long int i co chcesz z niej zrobić? Zapisać poszczególne bajty long int w tablicy złożonej z char? Czy chodzi o jakąś bardziej zaawansowaną konwersję (np. na ASCII)?
  • REKLAMA
  • #3 4095156
    propa
    Poziom 13  
    Posty: 41
    Pomógł: 2
    Pierwsza funkcja zapisać poszczególne bajty w tablicy char by można wysłac przez UART
    Druga funkcja odebrane dane w tablicy char z UART przerobić na long int

    Pozdrawiam
  • REKLAMA
  • #4 4095231
    markosik20
    Poziom 33  
    Posty: 2263
    Pomógł: 208
    Ocena: 147
    Proponuje wykorzystać unię :wink:
    
    union {
             unsigned long caly;
             struct {
                       unsigned long bajt3: 8;
                       unsigned long bajt2: 8;
                       unsigned long bajt1: 8;
                       unsigned long bajt0: 8;
                       }bajt;
             }dana;
    }

    i darować sobie konwersję.
    Odwołanie do całej danej

    Odwołanie do poszczególnych bajtów
    dana.bajt.bajt0

    I prawdopodobnie tu masz błąd
    Zamiast
    value_ret = (value_ret+value[0])<<8;

    tak
    value_ret = (value_ret|value[0])<<8;

    Dodatkowo taki sposób konwersji powoduje że pojedyncze dane (char) nic nie znaczą. Dopiero ich połączenie w long przedstawia rzeczywitą wartość jaką wysyła czy odbiera UART.
REKLAMA