Thông báo

Collapse
No announcement yet.

RX8 help!`

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

  • RX8 help!`

    Em dùng RX8 để nhận dữu liệu từ TX8.
    Trong khi truyền một string thì nhận tốt. Nhưng khi truyền byte bằng lệnh:
    TX8_SendData();

    TX8_PutChar();
    hoặc
    TX8_PutSHexInt();

    thì không nhận được dữu liệu. Đặc biệt là với những hàm này khi em truyền lên PC thì nhận tốt hơn nữa khi dùng hàm RX8_bReadRxStatus() để khiển tra trạng thái của thanh ghi bên nhận thì luôn cho kết quả là 0x11, trạng thái này không hề có trong các trạng thái có thể có của thanh ghi.
    Ở bên nhận em đã thử cả cho phép ngắt và cấm ngắt nhưng kết quả vẫn vậy

    Em up 2 project lên mong các đại ca chỉ giúp.

    Cám ơn
    Attached Files

  • #2
    Tx8?

    Chào bạn, mình rất tiếc vì không thể giúp được gì, hơn nữa lại có vài câu hỏi nhỏ mong bạn giải đáp(và mong bạn thông cảm cho sự thiếu hiểu biết của mình, vì mình mới tìm hiểu Psoc mà). Bạn viết là bạn đã truyền string lên PC rất tốt, còn mình đang gặp mấy vấn đề trong việc chuyển data từ Psoc ra PC:
    1/Trên giao diện của chương trình giao tiếp của mình(cho dù mình đã lập trình cho Psoc truyền đi cái gì bằng bất cứ lệnh gì) chỉ có mỗi 1 kí tự , mà lại rất lăng nhăng(không phải là kí tự trong bảng chữ cái).Không biết là có phải chuyển đổi kiểu dữ liệu gì khi truyền lên không, hay là tại cái chương trình giao tiếp trên PC?
    2/Khi thì mình thấy hiện ra cái gì đó trên màn hình, khi thì không. Thường thì mình phải reset nguồn cho Psoc và restart cái chương trình giao tiếp thì mới thấy kí tự lăng nhăng đó, rất khó hiểu??
    3/Kí hiệu // là kí hiệu cho chú thích đúng không, sao mình thấy người ta(và cả bạn nữa) cứ viết các câu lệnh sau kí hiệu đó thế, ví dụ như trong chính cái code của bạn:
    // TX8_CPutString("123456789");

    // TX8_PutCRLF();
    // TX8_PutChar(data);
    Hy vọng bạn đừng chê cười và càng hy vọng bạn sẽ giải đáp mấy câu hỏi trên. Cảm ơn trước nhé!

    Comment


    • #3
      Mình cũng đã sử dụng phần này rùi. Không mang theo chương trình ở đây nhưng có vài ý kiến không biết có giúp được bạn ko?
      - Câu lệnh sau dấu // ko thể thực hiện được, bạn ấy dùng như vậy là không muốn xóa đi, để có thể test từng đoạn, từng lệnh, hoặc để sử dụng về sau...
      - Trước đây mình dùng hàm TX8_bReadTxStatus(void), ở đây nó có thêm phần kiểm tra trạng thái mà thôi. Nó truyền 1 byte dữ liệu. Dữ liệu ở đây bạn truyền cái gì cũng được hết. Như vậy truyền OK luôn.
      - Trên PC, mình viết bằng VC sử dụng MSCOM32. Mình thiết lập để nhận từng byte một (cái này tùy mục đich người sử dụng), sau đó chuyển sang kiểu mình muốn (ký tự hay là số). Mình sử dụng kiểu polling. Nhận OK luôn.
      - Truyền từ PC xuống thì dễ hơn, PSoC đều nhận đúng hết kô cần quan tâm.
      Đơn giản chỉ có vậy. bạn thử xem nhé. Mình sẽ tìm lại bài của mình và post lên cho các bạn tham khảo.Chúc thành công.
      "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

      Comment


      • #4
        To trieuvuhai:
        1/Trên giao diện của chương trình giao tiếp của mình(cho dù mình đã lập trình cho Psoc truyền đi cái gì bằng bất cứ lệnh gì) chỉ có mỗi 1 kí tự , mà lại rất lăng nhăng(không phải là kí tự trong bảng chữ cái).Không biết là có phải chuyển đổi kiểu dữ liệu gì khi truyền lên không, hay là tại cái chương trình giao tiếp trên PC?
        Tôi đã gặp trường hợp như bạn. Sau đó tôi kiểm tra lại mạch thấy một số sai sót như:
        - nối trực tiếp Psoc với PC(không qua RS232)
        - Không nối chung đất psoc và PC
        - Đặt tốc độ truyền nhận, parity khác nhau.

        Sau khi khắc phục được là chạy OK.

        Chúc thành công!

        Comment


        • #5
          To nemo3110
          tôi xem qua code của bạn thấy có một số điểm sau không ổn:
          chương trình nhận:
          dòng kiểm tra if của bạn chưa chặt
          Code:
           if(bRxStatus=RX8_bReadRxStatus()==RX8_RX_COMPLETE)
          nên thay bằng
          Code:
                if ( !( bRxStatus=RX8_bReadRxStatus() & RX8_RX_COMPLETE ))
          nếu muốn đợi cho nhận hết một byte thì dùng hàm while thay vì if

          thay đoạn code
          Code:
                    if(bRxStatus!=RX8_RX_NO_ERROR)
          bằng
          Code:
                    if (( bRxStatus & RX8_RX_NO_ERROR ) == 0 )
          bên hàm truyền thử cho thêm phần delay giữa các lần truyền để tăng thêm hiệu quả thay vì gửi liên tù tì

          while (1) { TX8_SendData(data);}
          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


          • #6
            Xin cảm ơn, và lại hỏi tiếp

            Cảm ơn mọi người quá, chỉ một ngày mà đã có 3 phản hồi rồi, thật xúc động.
            Em đã khắc phục được cái vụ lúc có lúc không, bây giờ em đã nhận được một loạt rồi, xóa còn chẳng hết . Nhưng vẫn còn mấy vướng mắc như thế này:
            -Theo như clock đưa vào TX8 là 1Mhz/13, thì tốc độ truyền là 9600 bps, thế mà khi em đặt bit rate là 4800,2400, và cả 600 , vẫn thấy truyền mạnh ! hơ hơ.
            -Và vẫn chuyện cũ là nó toàn đưa ra kí tự "?,@" hay đại loại thế. Em làm cái chương trình trên PC giống như hướng dẫn của anh Ngô Hải Bắc bằng VC++.Anh ý bảo là dữ liệu đến cổng COM là kiểu VARIANT, và chỉ cần ép kiểu cho về CString là được, đoạn code phần nhận thế này :
            void CRS232TUTDlg::OnOnCommMscomm1()
            {
            // TODO: Add your control notification handler code here
            UpdateData() ;
            switch(m_mscomm1.GetCommEvent ())
            {
            case 1://comEvSend
            break;
            case 2://comEvReceive
            VARIANT data=m_mscomm1.GetInput();
            m_strReceive +=(CString)data.bstrVal ;
            break;
            case 3://comEvCTS
            break;
            case 4://comEvDSR
            break;
            case 5://comEvCD
            break;
            case 6://comEvRing
            break;
            case 7://comEvEOF
            break;
            };
            UpdateData(false);
            }
            Trong đó m_mscomm1 là biến của điều khiển MS Com 6.0,m_strReceive là biến cho cái hộp hiển thị dữ liệu nhận được.Còn về InputMode thì em nghĩ là cho value của nó bằng 1(dữ liệu nhận được kiểu binary) đúng không ạ?
            Ôi bất lực luôn.Mong là tối mai em lại có được vài ba phản hồi nữa để em giải quyết xong vụ này,quyết tâm kill thằng RS232 !

            Comment


            • #7
              bạn truyền tốc độ 9600 mà bên nhận lại đọc với tốc độ thấp hơn tất nhiên là vẫn nhận được dữ liệu như thường, nhưng dữ liệu đó không chính xác. Bạn thử tưởng tượng bên truyền cứ 1/9600 (s) truyền đi một bit còn bên nhận lại đọc 1/4800 (s) 1bit -> đáng lẽ phải đọc bit này thì có khi lại đọc bit sau đó. như vậy dữ liệu nhận được toàn kí tự lạ giống như bạn nói.
              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


              • #8
                Em đã hiểu về chuyện tốc độ truyền, nhưng thực ra là khi em để 9600bps thì vẫn chẳng có kí hiệu gì khả dĩ đọc được cả, em đang thử ép thằng VARIANT sang kiểu khác xem sao, các anh thấy có gì chưa ổn mong cứ góp ý cho em nhé.

                Comment


                • #9
                  neu ep thang VARIANT sang kiểu Cstring thì ở dưới PSoC bạn cũng truyền theo kiểu string. Dùng hàm UART_PutString(...) hoặc UART_PutCString(...).
                  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


                  • #10
                    - Việc truyền và nhận đúng tốc độ là điều cần thiết.
                    - Mạch phần cứng phải chuẩn, ổn định.
                    - Nếu áp dụng vào bài toán cụ thể ( chẳng hạn thu thập số liệu và điều khiển ) thì nên định khung dữ liệu truyền (kiểm soát được lỗi, dễ dàng quản lý, dễ dàng xử lý...), và nên truyền theo kiểu số. Khung truyền có thể là : ID-Mã lệnh-Dữ liệu-Kiểm tra lỗi..., tùy vào mục đích sử dụng.
                    "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

                    Comment


                    • #11
                      Cảm ơn các anh đã góp ý, em sẽ tiếp tục thử xem sao.Anh nào có cái code nào hay hay về phần này cứ up lên cho bọn đàn em được nhờ nhé.

                      Comment


                      • #12
                        Minh lục mãi mà ko thấy code ngày xưa. nhưng có một chút thế này ko biết có giúp gì dc ko?
                        Phần trên VC++:

                        // Khoi tao cho CommPort
                        if( m_Comm.GetPortOpen())
                        m_Comm.SetPortOpen(FALSE);
                        // Setting comport
                        m_Comm.SetCommPort(1); //("COM1")
                        // Setting Handshaking
                        m_Comm.SetHandshaking(0);
                        m_Comm.SetSettings("9600,N,8,1");
                        m_Comm.SetRThreshold(0); //
                        m_Comm.SetSThreshold(0);
                        // set for input direction
                        m_Comm.SetInputLen(1);
                        m_Comm.SetNullDiscard(FALSE);
                        m_Comm.SetInBufferSize(1024);
                        m_Comm.SetInputMode(0); //0-text : 1- Binary
                        m_Comm.SetOutBufferSize(1024);
                        m_Comm.SetPortOpen(TRUE);
                        .
                        .
                        .
                        .

                        // Gui 1 byte
                        void CTerminalDlg::OnBnSb()
                        {
                        // TODO: Add your control notification handler code here

                        UpdateData(TRUE);

                        CString m_sb = (CString)m_SB;
                        if (m_SB != 0)
                        {
                        m_Comm.SetOutput((COleVariant)m_sb);
                        }

                        }

                        //
                        .
                        .
                        .
                        .
                        .
                        // Nhan 1 byte
                        void CTerminalDlg::OnBnRb()
                        {
                        // TODO: Add your control notification handler code here

                        VARIANT bData;
                        BYTE m_rb;

                        if(m_Comm.GetInBufferCount())
                        {
                        bData=m_Comm.GetInput();
                        unsigned short* m_uRB = bData.bstrVal;
                        m_rb=*m_uRB;
                        m_RB=m_rb;
                        }
                        else
                        {
                        m_RB=0;
                        }

                        UpdateData(FALSE);

                        }

                        //
                        //
                        //
                        //
                        - Phần trên PSoC:
                        // Su dung ngat nhan
                        #pragma interrupt_handler UART_RX_ISR


                        BYTE bRxData;
                        BYTE bTxData;
                        .
                        .
                        .
                        .

                        //----------------------------------------------------------------------------
                        // Ham ngat nhan tu PC
                        //----------------------------------------------------------------------------
                        void UART_RX_ISR()
                        {
                        BYTE bRxStatus;
                        bRxStatus = UART_1_bReadRxStatus();
                        if (( bRxStatus & UART_1_RX_NO_ERROR ) == 0 )
                        {
                        bRxData = UART_1_bReadRxData();
                        }
                        }

                        .
                        .
                        .
                        .

                        //----------------------------------------------------------------------------
                        // Ham truyen mot byte toi PC
                        //----------------------------------------------------------------------------

                        void TransmitByte( BYTE data )

                        {
                        while( !( UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY ));
                        UART_1_SendData(data);
                        }

                        .
                        .
                        .
                        .
                        .

                        Chạy khá ổn. Các bạn hãy thử xem nhé. Mình nhớ trước đây truyền tới 500byte dữ liệu liền lúc mà chẳng sai lấy tí nào.
                        Chúc các bạn thanh công
                        "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

                        Comment


                        • #13
                          Tốt rồi, em sẽ nghiên cứu kĩ cái code này(anh Inn thật là tốt).Em hơi thắc mắc ở chỗ, thay vì dùng UART như anh thì TX8 cũng có tác dụng tương tự khi chỉ cần truyền byte từ psoc lên PC đúng chứ ạ?

                          Comment


                          • #14
                            Chính xác vậy. Bạn chỉ việc thay UART = TX8 là được. Chạy ổn lắm đó.
                            "Tiền có thể mua được đồng hồ, nhưng không mua được thời gian. Vì vậy chúng ta hãy biết quí trọng thời gian hơn"

                            Comment


                            • #15
                              Bạn TrieuVuHai ko biết đã khắc phục được lỗi truyền dữ liệu lên PC mà chỉ nhận được kí tự ? chưa. Mình cũng lập trình giao tiếp Rs232 bằng VC++ theo hướng dẫn của anh Ngô Hải Bắc và cũng bị lỗi y như vậy.Khi nối tắt chân Rx và Tx thì truyền nhận ok, nhưng khi nối với VDK thì lại chỉ nhận được kí tự ? trên hộp hiển thị kí tự nhận về. Mình đã thử code của anh Innovated nhưng vẫn bị lỗi như vậy.
                              Mong nhận được hướng dẫn của mọi người.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X