Thông báo

Collapse
No announcement yet.

Su dung UART

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

  • Su dung UART

    Mình đang thử dùng UART theo kiểu polling. Chạy rất ổn.
    Đây là đoạn code sử dụng:

    //----------------------------------------------------------------------
    BOOL ReceiveByte()
    {
    BYTE bRxStatus;
    // Wait to receive full byte
    while ( !( bRxStatus=UART_1_bReadRxStatus() & UART_1_RX_COMPLETE ) );
    // data received, now check for errors
    if (( bRxStatus & UART_1_RX_NO_ERROR ) == 0 )
    {
    // no error detected
    bRxData = UART_1_bReadRxData();
    return( TRUE );
    }
    else
    {
    // error detected
    bRxData = bRxStatus;
    return( FALSE );
    }
    }


    //-------------------------------------------------------------
    void TransmitByte( BYTE data )
    {
    // check for the end condition, before sending the next byte
    while( !( UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY ));
    UART_1_SendData(data);
    }

    - Trong chương trình chính mình có viết như sau:

    void main(void)
    {
    Data=0x32;
    .....
    .....

    while (1)
    {
    TransmitByte(Data);
    if (ReceiveByte())
    {
    if (bRxData==0x01) TransmitByte('a');
    if (bRxData==0x02) TransmitByte('b');
    }
    }
    }

    Nhưng khi cho giao tiếp với phần mềm thì mình thấy rằng:
    - Ban đầu khi chạy nó truyền một lần 0x32 (ứng với data), sau đó ko thấy gì nữa. Khi mình gửi 0x01 hoặc 0x02 thì nó sẽ truyền về 'a' và 0x32 hoặc 'b' và 0x32.
    Tại sao lại như vậy? Ý mình thì muốn nó truyền liên tục 0x32 và nếu nó nhận được 0x01 thì nó sẽ gửi trả 'a' hoặc 0x02 thì gửi trả 'b'.
    - Như mình hiểu với đoạn code kia nó sẽ truyền 0x32. Sau đó nó kiểm tra xem có nhận đc byte nào không, nếu nhận được thì sẽ thực hiện bên trong và nếu không thì sẽ bỏ qua và quay trở lại vòng quét và truyền 0x32.
    - Nhưng nó lại không như y mình, nó lại đợi ở câu lệnh: if (ReceiveByte())
    - Bác encoder xem giúp em vấn đề này với, em đã sai ở chỗ nào. và nếu có sai thì em phải viết lại thế nào cho nó đúng? Mong bác giúp đỡ. Hoặc nếu bác nào biết xin giúp em một tay.
    ps: hôm trước em đã thử theo cách của bác encoder là dùng DUAL ADC, và đã chạy rất ổn, cảm ơn bác rất nhiều.
    Kel'Thuzads
    Mail:minhnguyen.ac@gmail.com

  • #2
    Các cao thủ dạo này đi đâu hết rồi? giúp em một tay với...
    Kel'Thuzads
    Mail:minhnguyen.ac@gmail.com

    Comment


    • #3
      Lâu nay bận tìm việc mới quá
      Đoạn code trên của bạn, đúng là trong hàm
      BOOL ReceiveByte()
      {
      BYTE bRxStatus;
      // Wait to receive full byte
      while ( !( bRxStatus=UART_1_bReadRxStatus() & UART_1_RX_COMPLETE ) );
      .....

      câu lệnh while đã làm cho bạn truyền nhận không được như ý muốn. chương trình sẽ bị treo câu lệnh này cho đến khi Uart nhận được byte nào đó.
      để khắc phục bạn nên cho thêm timeout. chờ một khoảng thời gian timeout nếu không nhận được tín hiệu thì thoát ra và làm việc khác.
      Hoặc bạn thử bằng cách thay câu lệnh
      while ( !( bRxStatus=UART_1_bReadRxStatus() & UART_1_RX_COMPLETE ) );
      bằng
      if( !( bRxStatus=UART_1_bReadRxStatus() & UART_1_RX_COMPLETE ) )
      {
      // function body
      .........
      }
      chúc thành công
      Last edited by encoder; 24-03-2007, 10:42.
      CUNG CẤP PSOC, MẠCH NẠP
      CHUYỂN ĐỔI USB <-> RS485 AutoBaud
      RS232 <-> RS485 MultiBaud
      MẠCH NẠP USBPPI S7-200
      Mobile: 0906076116
      Email:

      Comment


      • #4
        Cho minh hỏi, cái command terminator của UART đc đặt default =13. Đó là kí tự gì vậy ?
        AC

        Comment


        • #5
          Cảm ơn bác encoder nhe! hôm nay em mới vào mạng dc. mấy hôm mày mò. và em đã quyết định dùng ngắt cho việc nhận. Nói chung là đã khá ổn rồi.
          Chắc trong quá trình làm sẽ có nhiều vấn đề nảy sinh, em sẽ lại phải làm phiền bác vậy.
          a, anh học khóa bao nhiêu vậy, hiện tại bác bây giờ đang làm ở đâu. Nghành ta ra trường có dễ xin việc không anh.
          Kel'Thuzads
          Mail:minhnguyen.ac@gmail.com

          Comment


          • #6
            to Phúc: "command terminator của UART đc đặt default =13". Cái này thì chỉ có tác dụng khi mà mình dùng các hàm thuộc mức cao thôi, còn với các hàm mức thấp thì không cần thiết. Nếu mình không nhớ lầm thì đó là byte kết thúc của lệnh truyền từ PC xuống, khi đọc thấy byte này thì nó mới đưa hết dữ liệu ra. còn nếu không có byte kết thúc này thì chả bao giờ bạn nhận được tí nào từ PC xuống cả. Ok. Nói chung với những truyền nhận thông thường thì không cần thiết làm đến mức này, phức tạp quá.
            Kel'Thuzads
            Mail:minhnguyen.ac@gmail.com

            Comment

            Về tác giả

            Collapse

            Kel'Thuzads Tìm hiểu thêm về Kel'Thuzads

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

            Collapse

            Đang tải...
            X