Chông treo PIC khi dùng RS232

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • 0903579509
    Đệ tử 4 túi
    • Mar 2007
    • 69

    #1

    Chông treo PIC khi dùng RS232

    Tôi đang sử dụng 2 con PIC6F877A truyền dữ liệu cho nhau. Để chống vấn đề sai số khi truyền và nhận thường kiểm tra như sau:

    putc(1 ký tự);
    c = getc();

    Trong trường hợp việc truyền và nhận không hoàn hão thì pic bị treo tại dòng lệnh C = getc()
    Bác nào có cách nào giải quyết điều này xin chỉ giáo
    Cám ơn nhiều.
    Last edited by 0903579509; 19-09-2010, 05:47 PM.
  • tungnh
    Đệ tử 5 túi
    • Sep 2007
    • 94

    #2
    Nguyên văn bởi 0903579509 View Post
    Tôi đang sử dụng 2 con PIC6F877A truyền dữ liệu cho nhau. Để chống vấn đề sai số khi truyền và nhận thường kiểm tra như sau:

    putc(1 ký tự);
    c = getc();

    Trong trường hợp việc truyền và nhận không hoàn hão thì pic bị treo tại dòng lệnh C = getc()
    Bác nào có cách nào giải quyết điều này xin chỉ giáo
    Cám ơn nhiều.
    Xóa bit OERR và FERR xem sao?
    Windows CE 6 R3

    Comment

    • 0903579509
      Đệ tử 4 túi
      • Mar 2007
      • 69

      #3
      Nguyên văn bởi tungnh View Post
      Xóa bit OERR và FERR xem sao?
      Bạn có thể viết cụ thể hơn được không. Theo tôi nghỉ cũng rất khó, bởi vì trong CCSC dòng lệnh c = getc() được dịch qua ASM như sau:
      0061 btfss 0C.5
      0062 goto 0061
      0063 movf 1A,W
      0064 movwf 43

      Như vậy khi chưa nhận đủ một Frame thì bit 0C.5 (rcif) chưa được set, vòng lặp cứ lặp đi lặp lại tại địa chỉ 062 - 061 - 062 mà không thể thoát ra được.

      Vậy có cách nào để thoát ra không ?

      Comment

      • namqn
        Trưởng lão PIC bang
        • Feb 2006
        • 3020

        #4
        Nguyên văn bởi 0903579509 View Post
        Tôi đang sử dụng 2 con PIC6F877A truyền dữ liệu cho nhau. Để chống vấn đề sai số khi truyền và nhận thường kiểm tra như sau:

        putc(1 ký tự);
        c = getc();

        Trong trường hợp việc truyền và nhận không hoàn hão thì pic bị treo tại dòng lệnh C = getc()
        Bác nào có cách nào giải quyết điều này xin chỉ giáo
        Cám ơn nhiều.
        Bạn có thể thay dòng c = getc() bởi một đoạn code, trong đó bạn kiểm tra cờ nhận trong 1 khoảng thời gian cho trước (100 ms chẳng hạn), nếu hết thời gian mà bạn không thấy cờ nhận được bật thì thoát, còn nếu cờ nhận được bật thì việc dùng hàm getc() để nhận ký tự là an toàn.

        Thân,
        Biển học mênh mông, sức người có hạn.

        Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
        http://www.picvietnam.com/forum/showthread.php?t=1263

        Comment

        • tungnh
          Đệ tử 5 túi
          • Sep 2007
          • 94

          #5
          Nguyên văn bởi namqn View Post
          Bạn có thể thay dòng c = getc() bởi một đoạn code, trong đó bạn kiểm tra cờ nhận trong 1 khoảng thời gian cho trước (100 ms chẳng hạn), nếu hết thời gian mà bạn không thấy cờ nhận được bật thì thoát, còn nếu cờ nhận được bật thì việc dùng hàm getc() để nhận ký tự là an toàn.

          Thân,
          Chuẩn| Đó là kỹ thuật dùng timerout thường dùng khi nhận data.
          Windows CE 6 R3

          Comment

          • 0903579509
            Đệ tử 4 túi
            • Mar 2007
            • 69

            #6
            Nguyên văn bởi namqn View Post
            Bạn có thể thay dòng c = getc() bởi một đoạn code, trong đó bạn kiểm tra cờ nhận trong 1 khoảng thời gian cho trước (100 ms chẳng hạn), nếu hết thời gian mà bạn không thấy cờ nhận được bật thì thoát, còn nếu cờ nhận được bật thì việc dùng hàm getc() để nhận ký tự là an toàn.

            Thân,
            Hiện tại tôi đã dùng Timer2 để tạo một khoảng thời gian 50ms phục vụ cho công việc này, nhưng sao nó thấy phức tạp quá.
            Giải pháp như sau:
            Sau khi putc(1 ký tự) thì bật Timer2, khi Timer2 chảy đủ 50ms thì set bit cờ (timeout chẳng hạn). nhiệm vụ của code là :
            loop:
            if (rcif) { nhận byte data}
            else if (! timeout) { goto loop)
            else { báo lỗi}
            Sau khi thực hiện xong nhiệm vụ thì tắt Timer2.
            Mỗi byte truyền đi đều phải thực hiện công việc như vậy thì phức tạp quá. Không biết có bạn nào có cách gì đơn giản hơn không?

            Cảm ơn các bạn nhiều.

            Comment

            Working...