Thông báo

Collapse
No announcement yet.

Một chút thắc mắc về USART của AVR

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

  • #16
    Sau vài ngày nghỉ dưỡng sức và làm việc thì đã đạt được ít kết quả tuy chưa được gọi là khả quan lắm.
    1. Đã nhận dạng được khung truyền. tức là mới biết được nó thuộc khung 1 hay khung 2 ....
    2. Càng làm em lại càng mắc đến vấn đề tách và xử lý dữ liệu sau khi đã được đẩy xuống. Theo em hiểu thì khi từ máy tính đưa xuống dạng chuỗi thì việc IC sẽ nhận dạng chuỗi, nhưng khi em tiến hành xử lý dạng chuỗi với việc sử dụng ngắt thì ...chưa thành công.

    Bác có gợi ý nào cho em để đảm bảo nhận được 2 dữ liệu trong phần nội dung của khung truyền xuống không ahj? e làm hoài mà chưa được ....
    |

    Comment


    • #17
      Bác Toan.LV và bác nào giúp em phân tách dữ liêụ vơí.

      Em giả sử vơí chuôĩ data em nhận được với khung truyền trên e truyền 2 tham số từ trên PC xuống (dữ liêụ dạng float) có dạng: A12.35B253.16@ thì làm thế nào em bóc ra được để lấy được 2 tham số:

      data1 = 12.35
      data2 = 253.16

      Cảm ơn các bác trước!
      |

      Comment


      • #18
        - Bạn hãy căn cứ vào bảng mã ACSII. Để truyền đi chuỗi "A12.35B253.16@" bạn có 2 cách:
        + Cách 1: bạn hãy truyền đi chuỗi mã của chúng: "0x41 0x31 0x32 0x2E 0x33 0x35 0x42 0x32 0x35 0x23 0x2E 0x31 0x36 0x40".
        + Cách 2: Bạn truyền hằng kí tự: " 'A' '1' '2' '.' '3' '5' 'B' '2' '5' '3' '.' '1' '6' '@' " (kí tự đặt trong dấu ' ' là hằng).
        - Khi nhận bạn căn cứ vào các kí tự đánh dấu. Bắt đầu từ khi nhận được ký tự A bạn sẽ lấy các byte dữ liệu tiếp theo bỏ vào các byte chứa phần nguyên của tham số thứ nhất cho đến khi gặp dấu chấm. Bắt đầu từ sau dấu chấm, bạn lấy tiếp các byte phần thập phân cho đến khi gặp ký tự B. Tương tự cho tham số thứ 2.

        Thân mến,
        For a better world

        Comment


        • #19
          Mình thường truyền luôn với mã ASCII. Trước tiên bạn phải thống nhất và quyết dịnh việc đinh dạng frame dựa vào giá trị lớn nhất và nhỏ nhất cần truyền, vi dụ mình dịnh dạng như sau : A cccc.ccc B dddd.ddd@
          (như vậy số lớn nhất mình có thể truyền là 9999.999), bạn định dạng lại tăng hoăc giảm theo yêu cầu của bạn.
          Cuối cùng ban cần truyền là A '0' '0' '1' '2' '.' '3' '5' '0' B '0' '2' '5' '3' '.' '1' '6' '0' @

          Comment


          • #20
            Mình cùng ý tưởng với bác Toàn nhưng post chậm 1 chút, hehe. Chúc mọi người vui và thành công nhé

            Comment


            • #21
              Nguyên văn bởi Toan.Lv Xem bài viết
              - Bạn hãy căn cứ vào bảng mã ACSII. Để truyền đi chuỗi "A12.35B253.16@" bạn có 2 cách:
              + Cách 1: bạn hãy truyền đi chuỗi mã của chúng: "0x41 0x31 0x32 0x2E 0x33 0x35 0x42 0x32 0x35 0x23 0x2E 0x31 0x36 0x40".
              + Cách 2: Bạn truyền hằng kí tự: " 'A' '1' '2' '.' '3' '5' 'B' '2' '5' '3' '.' '1' '6' '@' " (kí tự đặt trong dấu ' ' là hằng).
              - Khi nhận bạn căn cứ vào các kí tự đánh dấu. Bắt đầu từ khi nhận được ký tự A bạn sẽ lấy các byte dữ liệu tiếp theo bỏ vào các byte chứa phần nguyên của tham số thứ nhất cho đến khi gặp dấu chấm. Bắt đầu từ sau dấu chấm, bạn lấy tiếp các byte phần thập phân cho đến khi gặp ký tự B. Tương tự cho tham số thứ 2.

              Thân mến,
              Vâng, làm như vâỵ thì việc bóc tách dữ liệu lại khá lằng nhằng các pác nhỉ?
              Không biết trong CV có hàm nào xử lý chuôĩ mà có thể làm được nhiệm vụ như sau nhỉ:
              ví dụ với chuỗi trên thì làm sao em chỉ cần copy được các kí tự text[1], text[3], text[3] vào được 1 chuôĩ khác nhỉ, ví dụ như text_temp[10] chẳng hạn.

              Vấn đề nưã em muốn tham khảo ý kiến các bác là:
              1. E dùng độ dài của khung dữ liêụ nhận được (trong ngắt của ngắt nhận) e có 1 biến đếm, khi có kí tự nhận được trong bộ đệm nó sẽ tăng biến đếm (lệnh: dem++). Việc này kết thúc khi nhận được trong bộ đệm có xuất hiện kí tự @:
              Code:
              text[dem] = UDR;
              if (UDR == '@') dem = dem;
              else dem++;
              Vâỵ tại sao khi em dùng biến global dem trong việc so sánh để xác định khung thì nó lại toàn trả về giá trị dem = 0 là sao nhỉ? Và đương nhiên là em sẽ không xác định được đâu là khung truyền 1 và đâu là khung truyền 2.

              2. Việc xác định khi nào có dữ liêụ từ PC chuyển xuống e dùng biến rx_counter có ổn không ạh?
              |

              Comment


              • #22
                Hình như đã đọc lần 1 "text[dem] = UDR;" thì khi đọc lần 2 "(UDR == '@')" sẽ cho kết quả bằng 0!?
                !e

                Comment


                • #23
                  Sau 1 ngày rùi mài, hết CV sang VB em cũng đã gọi là tạm hoàn thành, nhưng hình như chưa tối ưu các bác àhh. Vẫn còn tình trạng "đơ chíp" nếu trong vòng lặp kiểm tra e bắn liên tiếp 10 khung dữ liệu xuống VĐK. Hjx ....
                  Đây là vòng lặp của em:

                  while (1)
                  { // co du lieu nhan RS232
                  if (rx_counter != 0)
                  {
                  if(strchr(text,'T')) // Chuỗi khung truyền 1
                  {
                  Xử Lý 1
                  }
                  if(strchr(text,'P')) // Chuỗi khung truyền 2
                  {
                  Xử Lý 2
                  }
                  control();
                  delay_ms(100);
                  }
                  |

                  Comment


                  • #24
                    Mình ko thấy toàn bộ code nên ko thể đánh giá được. Tuy nhiên trong đoạn code này, bạn nên cải thiện khả năng nhận dữ liệu kịp thời bằng việc ko dùng hàm delay_ms(). Đoạn code viết lại như sau:
                    //...........................................
                    unsigned int main_count=0;

                    while (1)
                    { // co du lieu nhan RS232
                    if (rx_counter != 0)
                    {
                    if(strchr(text,'T')) // Chuỗi khung truyền 1
                    {
                    Xử Lý 1
                    }
                    if(strchr(text,'P')) // Chuỗi khung truyền 2
                    {
                    Xử Lý 2
                    }
                    ì(main_count++==5000)
                    {
                    main_count=0;
                    control();
                    }

                    }

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X