Thông báo

Collapse
No announcement yet.

phát hiện 1 lỗi trong code UART của codevisionAVR

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

  • phát hiện 1 lỗi trong code UART của codevisionAVR

    Code:
     
    // đây là đoạn code bi lỗi.
     
    // USART Receiver buffer
    //#define RX_BUFFER_SIZE 64
    char rx_buffer[RX_BUFFER_SIZE];
    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif
    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;
    //USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    rx_buffer[rx_wr_index]=data;
    if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE) // SAI Ở ĐÂY 
    // PHẢI SỬA LÀ if (++rx_counter == RX_BUFFER_SIZE+1) 
    {
    rx_counter=0;
    rx_buffer_overflow=1;
    };
    };
    }
    // :D :D 
    // MOI NGƯỜI CHÚ Ý NHÉ
    Last edited by VNarmy; 06-11-2008, 13:28.
    ngu dốt lớn nhất đời người là dối trá

  • #2
    Có sai gì đâu? Cái này cho biết khi nào đầy buffer thì flush buffer thôi mà. Đúng là mảng a[n] thì có n phần tử, đếm tới n+1 thì flush là đúng nhưng CV bắt buộc phải là n thì cũng hợp lý thôi, ít nhất phải chừa một khoảng trống chứ
    Đẹp từng kilomét

    Comment


    • #3
      ^_^ đúng thế.Nhưng nếu bạn để bufer là 8 sau đó bạn chuyền liên tiếp 8 byte thì chắc chắn sẽ mất byte cuối cùng.để là +1 sẽ ko sao.nếu bạn để bufer la 16 thì bạn cứ để như thế cũng ko vấn đề j.
      ngu dốt lớn nhất đời người là dối trá

      Comment


      • #4
        Nguyên văn bởi gah5n2 Xem bài viết
        ^_^ đúng thế.Nhưng nếu bạn để bufer là 8 sau đó bạn chuyền liên tiếp 8 byte thì chắc chắn sẽ mất byte cuối cùng.để là +1 sẽ ko sao.nếu bạn để bufer la 16 thì bạn cứ để như thế cũng ko vấn đề j.
        Bạn đã thử chưa? Với toán tử ++rx_counter tôi nghĩ là ko sao hết.
        AVR đã quay trở lại: ATMEGA32: 66k, ATMEGA8A: 30k, ATMEGA48: 30k.
        Xem thêm tại Online Store ---> Click here
        Mob: 0982.083.106

        Comment


        • #5
          ^_^ tớ đã thử rồi
          ngu dốt lớn nhất đời người là dối trá

          Comment


          • #6
            codevision

            haha.. trong codevision neu chon "BUFFER_SIZE 8" thi truyen tu 0-->7 chu lam gi ma toi 8.truc day minh cung nham nhu vay day.

            Comment


            • #7
              trong codivision co mot loi ve "Alphanumeric LCD" neu khi lcd dang chay , neu rut lcd ra roi cam vao lai thi, lcd bi treo khong hien thi duoc, do "codivision" kiem tra co bao ban ma khong co timerout.

              Comment


              • #8
                nó không hiển thị được là đúng chứ không phải lỗi đâu vì khi rút LCD ra khi cắm vào thì ta phải ghi lệnh khởi tạo cho nó thì mới chạy được nên khi mình cắm vào nó thường không ghi lệnh vào nữa nên không hiển thị được. muốn hiển thị được thì hàm khởi tạo cho LCD phải đặt trong hàm while(1). hoặc có lệnh kiểm tra nếu như ghi dữ liệu vào LCD mà không thấy phản hồi thì ta phải khởi tạo cho nó.
                Never forget who you are!

                Comment


                • #9
                  Mảng trong c là bắt đầu từ 0.Khi khai báo mảng 8 byte thì thứ tự từ 0-7 là data của người dÙng,trình dịch padding 1 byte zero vào byte thứ 8 trong kiểu khai báo char hoặc unsigned char.
                  , , ,

                  Comment

                  Về tác giả

                  Collapse

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

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

                  Collapse

                  Đang tải...
                  X