Thông báo

Collapse
No announcement yet.

mình có cái giao tiếp PC mãi mà ko chạy

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

  • mình có cái giao tiếp PC mãi mà ko chạy

    đây là code nhận data ở vdk, ko hiểu sao nó chỉ nhận ký tự cuối cùng thôi, a em nào biết vụ này thì chỉ cho t với.
    Attached Files

  • #2
    Cũng đã đọc qua và thấy chỗ này:
    PHP Code:
    void nhan_data(voidinterrupt 4
    {
        while(
    RI==1)
            {
                
    RI=0;
                
    _data_receive_=SBUF;
            }

    Lẽ ra sau khi nhận data mới xóa cờ RI chứ !
    Làm như bạn có thể data sẽ bị mất trước khi được sao lưu vào bộ nhớ hoặc thanh ghi nào đó.
    Thử làm lại xem có được không nhé !

    Comment


    • #3
      t đã thử đảo lại rồi,
      void nhan_data(void) interrupt 4
      {
      while(RI==1)
      {
      _data_receive_=SBUF;
      RI=0;
      }
      }
      nhưng vẫn ko đc, chỉ nhận môi xkys tự cuối cùng thôi

      Comment


      • #4
        Sau khi nhận được bit Stop thì 8051 tự động bật cờ RI, khi đó ta chỉ cần cất byte trong SBUF đi và xóa cờ RI do đó không cần phải dùng while(RI == 1).

        Comment


        • #5
          tình hình vẫn chưa khá hơn, vẫn chỉ nhận 1 ký tự cuối cùng, multi có yahoo ko, chat luôn cho nhanh, t la nam_coi89

          Comment


          • #6
            Theo tui, biến "_data_receive_" dùng để đọc dữ liệu vào không được xử lý trước khi dữ liệu mới nhập vào gây ra tình trạng bị đè mất dữ liệu thôi. Cho nên ký tự cuối cùng k bị đè nên còn lại ấy mà. Ngoài ra cũng cần lưu ý khi truyền ký tự từ PC xuống với kiểu mã ASCII có thể truyền tới 2,3 byte cho 1 ký tự cũng có thể gây ra tình trạng trên.

            Comment


            • #7
              kevo1tinh nói cụ thể hơn đi, xử lý là thế nào?trường hợp 2,3 byte cho 1 ký tự thì phải giải quyết ra sao

              Comment


              • #8
                unsigned int i=0,j=0;
                .................................
                P1=_data_receive_;
                mang[i]=_data_receive_;
                write_data(P1);
                .......................
                Ban xem lai bien i.

                Than ai!
                Last edited by anhtoan; 21-09-2009, 06:22.

                Comment


                • #9
                  Cũng đã đọc qua và thấy chỗ này:
                  PHP Code:
                  void nhan_data(void) interrupt 4
                  {
                  while(RI==1)
                  {
                  RI=0;
                  _data_receive_=SBUF;
                  }
                  }
                  Lẽ ra sau khi nhận data mới xóa cờ RI chứ !
                  Làm như bạn có thể data sẽ bị mất trước khi được sao lưu vào bộ nhớ hoặc thanh ghi nào đó.
                  Thử làm lại xem có được không nhé !
                  Việc xóa cờ RI trước hay sau khi đọc dữ liệu là không quan trọng bởi vì thanh ghi SBUF nhận của 8051 được đệm(Buffer- Truyền không có) (tức là trước khi bít cuối cùng của byte tiếp theo truyền xong, vẫn còn có thể đọc được dữ liệu của byte trước). Thông thường thì hay xóa cờ RI trước khi đọc dữ liệu.
                  - Chương trình xử lý ngắt cổng nối tiếp này cũng chưa ổn. Do cổng nối tiếp của 8051 chỉ có 1 vector ngắt mà có đến 2 nguyên nhân gây ra ngắt cho nên khi vào ngắt cần phải kiểm tra xem ngắt xảy ra là do nguyên nhân nào. Bạn hoasua_2005 có thể tham khảo đoạn chương trình sau:
                  void SIO_Interrupt(void) interrupt SIO_VECTOR
                  {
                  if (RI)
                  {
                  RI = 0;//Nếu ngắt xảy ra do nhận dữ liệu thì xóa RI cho lần
                  //nhận tiếp theo
                  //Làm gì thì làm ở đây
                  }
                  else
                  {
                  TI = 0;//Nếu ngắt do truyền thì xóa TI cho lần sau
                  }
                  }
                  - Lỗi của bạn là chỉ nhận byte cuối cùng vậy chắc là bạn truyền cùng lúc nhiều bytes. --> Lỗi ở đây là do thuật toán. Bạn chỉ dùng 1 biến để đọc dữ liệu nhận được vậy thì byte sau nhận sẽ ghi đè vào byte trước và cuối cùng chỉ nhận được byte cuối. Muốn nhận đủ các byte thì phải dùng mảng để chứa tất cả các byte đã truyền xuống. Bạn thử lại xem.

                  Thân.
                  Toản.lv
                  For a better world

                  Comment


                  • #10
                    - Chương trình do bạn viết chỉ nhận được byte cuối là đúng rồi.
                    - Như các bạn khác nói ở trên, chương trình bạn viết do lỗi ở cái biến i
                    - Bạn dùng biến i để quy định cho số phần tử trong cái mảng có 30 phần tử của bạn, bạn quy định ban đầu i = 0, ở chương trình chính, khi có byte đầu tiên chuyển xuống VXL thực hiện nhận byte đó bằng chương trình ngắt, sau đó bạn đưa dữ liệu byte đầu tiên đã nhận đc vào mảng vị trí i=0 của mảng, tức là vị trí đầu mảng "mang[i]=_data_receive_". hết byte đầu tiên.
                    - Đến byte tiếp theo vi xử tiếp tục nhận dữ liệu, sau đó nó lại đưa dữ liệu vào vị trí mang[0], do biến i của bạn lúc này vẫn bằng 0, như vậy byte đầu tiên đã không còn. bạn muốn dữ lại byte đầu tiên trong mảng thì bạn phải tăng biến i lên chứ.
                    - Theo mình bạn nên viết thế này:
                    void nhan_data(void) interrupt 4
                    {
                    while(RI==1)
                    {
                    RI=0;
                    _data_receive_=SBUF; //bỏ cái nì đi
                    mang[i] = SBUF;
                    i++;
                    if i>30 //mảng có tối đa 30 phần tử
                    {
                    i = 0; //xóa biến i về 0 khi nào lưu đầy mảng
                    }
                    }
                    }
                    - Như vậy bạn sẽ lưu đc tối đa 30byte truyền xuống cho VXL
                    - Trong chương trình chính bạn chỉ cần thực hiện đọc từ mảng ra, vậy là ok.
                    - Bạn thử xem nhé

                    Comment


                    • #11
                      A ! Có 2 cao thủ bên ETech.
                      Đúng rồi phải dùng mảng để lưu tin nhắn. Nhưng chỉ lo tăng biến i trong mảng, không lo tăng giá trị con trỏ hiển thị trên LCD thì kết quả cuối cùng chũng chỉ là byte cuối mà thôi.
                      Phải không chú Toản ?

                      Comment


                      • #12
                        Phần chỉnh sửa hay quá.nếu không bạn có thể tham khảo thêm ở đây
                        http://dientuvietnam.net/forums/showthread.php?t=28595
                        NBHVDNTG_C5!no trace

                        Comment


                        • #13
                          thnksssssssss các bờ rô.t làm đc rồi, thay cái biến i thành x, x khai báo toàn cục là ok.nhờ bác tienhuypro giúp đỡ nên đã xong sớm hơn dự kiến :d

                          Comment


                          • #14
                            Xong rồi thì vẽ thêm hoa lá cành tí nhỉ ?
                            Khi nhận được tin nhắn thì dưới LCD hiện màn hình thông báo:
                            hàng 1: " Have new sms "
                            hàng 2: hiển thị 1 chữ OK và Cancel cho phép xem tin nhắn hoặc hủy bỏ không xem trở về màn hình Desktop.
                            Nếu bấm OK thì vào xem nội dun tin nhắn, sử dụng phím Up và Down nếu màn hình không đủ hiển thị nội dung tin nhắn.

                            Comment


                            • #15
                              hê hê, đương nhiên rồi. truyền nhận đc là có nhiều trò để nghịch lắm.cảm ơn tất cả anh em đã giúp đỡ

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X