Thông báo

Collapse
No announcement yet.

Help...Tách số 16bit thành 2byte(cao và thấp) dùng C

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Về cách khai báo một union cũng giống như khai báo một struct. Nó chỉ khác nhau là: Các thành phần của Struct được cấp phát các vùng nhớ riêng và độ dài của struct bằng tổng độ dài của các "biến" thành phần. Còn union thì các thành phần được cấp phát bắt đầu từ ô nhớ đầu tiên(có nghĩa là địa chỉ bắt đầu của các thành phần trong union là như nhau).
    Về 2 ví dụ trên của bạn, mình cũng chưa thử hết các kiểu khai báo xem các compiler cho avr phản ứng lại thế nào? Nhưng trong AVR Studio và CodeVisionAVR có sự khác nhau đáng kể. Trong AVR Studio thì chấp nhận union có thể được khai báo trong Struct còn trong CodeVisionAVR thì không.
    Còn lỗi khi bạn dùng cách 1 để khai báo một biến union kiểu split16to8 là do bạn chưa có tên Union. split16to8 trong khai báo typedef union split16to8 theo C chuẩn thì nó không phải là tên cấu trúc, nó có thể có hoặc không. mà tên cấu trúc phải được thiết lập sau dấu ;. Về cái này bạn đọc trong trang 244 trong cuốn: Kỹ thuật lập trình C của Thầy Phạm Văn Ất.. Cách khai báo một struct hoặc union chuẩn như sau:
    - Cách Định nghĩa một kiểu union hoặc Struct:
    typedef union
    {
    //cac thanh phan cua union
    }ten_union;
    typedef struct
    {
    //cac thanh phan cua struct
    }ten_struct;
    Sau các định nghĩa này có thể dùng nó để khai báo các biến Union hoặc struct.
    - Cách Khai báo một biến union hoặc một struct
    union ten_union
    {
    //các thành phần của union
    }
    struct ten_struct
    {
    //các thành phần của struct
    }

    Comment


    • #17
      Em xài WinAVR nhúng trong AVRStudio
      Em tìm ra roài mấy huynh. Em đọc sách bị nhầm cách khai báo giữa 2 thằng C và C++. Đúng ra nó là như vầy:

      Trong C++: thì dùng cách 1 là hợp lệ
      Trong C: thì phải dùng cách 2 hoặc dùng cách của anh quocthai (union INT_TO_BYTE test)

      Gửi qt huynh: cách khai báo union INT_TO_BYTE test là đúng chuẩn C không phải do C30 của dsPIC.
      Last edited by apple; 23-08-2008, 23:56.
      Mấy ai định nghĩa được tình yêu.
      Có gì đâu một buổi chiều.
      Kề dao lên cổ yêu hay chết .
      Gật đầu cái rụp thế là yêu.

      --------
      Apple

      Comment


      • #18
        unsigned int data; // 16bit
        low : *((unsigned char *)&data)
        high : *((unsigned char *)&data+1)

        unsigned long data; // 32bit
        low : *((unsigned char *)&data)
        midlow : *((unsigned char *)&data+1)
        midhigh : *((unsigned char *)&data+2)
        high : *((unsigned char *)&data+3)

        Comment


        • #19
          Có nhiều cách để thực hiện, nhưng hãy chọn cách mà ngoài tối ưu code còn làm chương trình trong sáng dễ đọc.
          Code:
          typedef struct {
              unsigned char Low;
              unsigned char High;
          } Int2Bytes;
          Nếu muốn lấy BYTE cao - thấp của 1 số interger 16 bits bất kỳ
          Code:
          unsigned int i=0x1234;
          ((Int2Bytes*)&i)->High   --> 0x12
          ((Int2Bytes*)&i)->Low   --> 0x34
          Nếu dữ liệu được dùng thường xuyên thì có thể xây dựng kiểu dữ liệu riêng
          Code:
          typedef union{
              unsigned int Data;
              Int2Bytes    Split;
          } DATA_TYPE_NAME;
          
          DATA_TYPE_NAME MyData;
          ...
          MyData.Data=0x1234;
          MyData.Split.High  --> 0x12
          MyData.Split.Low  --> 0x34
          ...
          Good luck!

          Email:
          Phone: 0905.034.086

          Comment

          Về tác giả

          Collapse

          apple Tìm hiểu thêm về apple

          Bài viết mới nhất

          Collapse

          Đang tải...
          X