Thông báo

Collapse
No announcement yet.

vấn đề UART trong ngôn ngữ c

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

  • vấn đề UART trong ngôn ngữ c

    Xin chào các bậc tiền bối. số là thế này: Mình đã viết chương trình AVR bằng ASM lâu năm nay muốn chuyển sang C. mình lập trình cho atmega128 dùng uart để truyền nhận dữ liệu chế độ ngắt cả truyền và nhận viết bằng CV. mình đang thắc mắc ở chổ:
    + CV có 2 hàm truyền nhận là putchar và getchar.vậy thì làm thế nào để biết được mình đang truyền hay đang nhận byte thứ mấy ạ?và 2 hàm này nên đưa vào ctr chính hay chương trình ngắt ạ( vd đưa vào ngắt timer chẳng hạn)
    + khi truyền nhận với nhiều con AVR khác mà con mình làm master thì có dùng được bộ sinh mã của CV không ạ, hay mình phải tự viết code.
    vì mới chập chững học C nên chưa được rõ nhờ các bậc tiền bối chỉ giúp ạ! Xin cám ơn

  • #2
    -Hai hàm getchar và putchar đều nhận và phát từng byte mà, nếu thu phát string thì bạn phải dùng gets hoặc puts

    -Muốn nhận 1 ký tự bằng hàm getchar thì bản thân hàm này làm một vòng lặp trong chương trình chính, chờ tới khi nhận được ký tự mới chuyển sang lệnh kế tiếp. Bản thân hàm này rất dở cả ngắt hay không ngắt. Tưởng tượng khi không nhận được tín hiệu xem như cả chương trình bị treo. Nếu không dùng ngắt thì khi đang xử lý công việc khác nếu có 2-3 ký tự khác chuyển đến thì coi như mất sạch, nên phải dùng ngắt để đưa vào bộ đệm và đọc ra sau. Nếu bạn muốn nhận dữ liệu một cách chắc chắn thì phải sửa lại chương trình ngắt hoặc viết một hàm garchet nào đó để nhận byte
    -Hàm putchar thì đơn giản hơn, đặt 1 ký tự vào thanh ghi bộ đệm và cho phát. Nếu phát không nhiều thì không cần dùng tới ngắt, nếu phát hàng loạt ký tự mà không dùng ngắt thì khi nào phát hết mới thực hiện lệnh kế tiếp được. (tốc độ AVR bây giờ rất nhanh so với tốc độ truyền UART). Tôi không phát nhiều hay liên tục nên không dùng ngắt, chỉ dùng putchar, puts, putsf là cũng ổn
    Đã bỏ nghề về quê chăn gà...

    Comment


    • #3
      thank bác katecka tui đã hiểu được phần nào.bây giờ thực hành tiếp , ko rõ sẽ thỉnh giáo bác tiếp.

      Comment


      • #4
        hình như là bác Katecka nói chưa đúng lắm: trong chế độ uart mà dùng ngắt cho cả truyền và nhận thì hàm getchar và putchar nếu viết trong chương trình chính thì quá trình truyền và nhận đều ko ảnh hưởng đến ctr chính vì lúc này hàm getchar và putchar chỉ làm việc với bộ đệm, còn truyền và nhận vật lý đều thông qua bộ đệm.công việc còn lại của người lập trình là làm sao nhận vào (truyền đi)từ bộ đệm cho đúng thứ tự mong muống . ko biết vậy có chính xác ko nhờ các cao thủ chỉ thêm cho.thanks!

        Comment


        • #5
          -Với getchar, có dùng ngắt hay không bạn vẫn phải dùng getchar thường xuyên để nhận. Nếu bộ đệm rỗng, chuơng trình bạn treo, nếu bạn không getchar liên tục, bộ đệm tràn
          -Với putchar, khi dùng ngắt bạn có thể gọi hàm này liên tục và nó tự cập nhật vào bộ đệm, bộ đệm tự phát đi do đó không ảnh hưởng tốc độ
          -Vấn đề quá nhỏ để tranh luận dông dài, bạn cứ thử khắc biết . Tạo một chuơng trình mẫu và thử với cổng COM máy tính đâu phải là chuyện khó phải không? Thân mến
          Đã bỏ nghề về quê chăn gà...

          Comment


          • #6
            vì như từ đầu đã nói mình đang chập chững học c nên chưa hiểu lằm. có tranh luận mới hiểu ra vấn đề. chứ uart bên asm tui đã giao tiếp với plc và biến tần rồi. một lần nữa cám ơn sự nhiệt tình của bạn!

            Comment


            • #7
              Nguyên văn bởi Katecka Xem bài viết
              -Với getchar, có dùng ngắt hay không bạn vẫn phải dùng getchar thường xuyên để nhận. Nếu bộ đệm rỗng, chuơng trình bạn treo, nếu bạn không getchar liên tục, bộ đệm tràn
              -Với putchar, khi dùng ngắt bạn có thể gọi hàm này liên tục và nó tự cập nhật vào bộ đệm, bộ đệm tự phát đi do đó không ảnh hưởng tốc độ
              -Vấn đề quá nhỏ để tranh luận dông dài, bạn cứ thử khắc biết . Tạo một chuơng trình mẫu và thử với cổng COM máy tính đâu phải là chuyện khó phải không? Thân mến
              Mình cũng đang gặp vấn đề vơi USART, mình truyền nhận giữa hai con AVR có dùng ngắt và bộ đệm nhưng vẫn thường xuyên bị treo. Bạn có cách nào khắc phục vấn đề này chỉ mình với.

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X