Thông báo

Collapse
No announcement yet.

[Thắc mắc] giao tiếp HID usb pic18f

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

  • [Thắc mắc] giao tiếp HID usb pic18f

    Mục đích của mình là có 1 điều khiển máy tính bằng remote thông qua RF.
    Mình giao tiếp usb kiểu HID , máy đã nhận được thiết bị , truyền nhận ok .

    - Do điều khiển thông qua RF nên mạch của mình liên tục ở trong vòng lặp để kiểm tra , chỉ khi nào nhận được tín hiệu (giải mã thành công) thì mới thoát ra truyền lên máy tinh , sau đó lại lặp kiểm tra tiếp.
    - Phần mềm mình viết bằng C# , dùng timer để đọc liên tục mỗi 0.5s , theo lý thuyết thì khi không có dữ liệu truyền lên thì trả về null . Nên mình dùng if kiểm tra, nếu null thì bỏ qua , không thì hiển thị.
    - Nhưng khi mình cắm thiết vị vào là ứng dụng của mình bị treo (C# và mọi thứ bình thường)
    - Khi usb mình giải mã được tín hiệu và truyền lên thì ứng dụng lại chạy và hiển thị lên bình thường , sau đó lại bị treo .

    Tóm lại vấn đề của mình là: khi USB không truyền gì lên (do đang ở trong vòng lặp kiểm tra tín hiệu RF) thì ứng dụng trên C# bị treo ngay hàm nhận dữ liệu , làm treo luôn cả ứng dụng . Khi USB truyền lên thì chay ... hiển thị ... rồi lại treo =.=

    Mong mọi người giúp mình giải quyết vấn đề này . Cảm ơn nhiều .

    Code C# mình viết dựa trên trang web này : https://sites.google.com/site/lhpsci...otiepusbquahid
    Code PIC mình viết bằng CCS .

  • #2
    Nhận dữ liệu từ USB lên C# thì bạn để khối lệnh nhận dữ liệu của C# để trong "try". Trong "catch" bạn có thể không làm gì hoặc hiển thị lên 1 cái label về thông tin lỗi.
    Code:
    try
    {
         // Nhận dữ liệu ở đây
    }
    catch (Exception Err)
    {
        // Có thể giải mã lỗi qua biến Err để hiển thị lên 1 label... hoặc không cần làm gì.
    }

    Comment


    • #3
      Nguyên văn bởi tunglee091 Xem bài viết
      Mục đích của mình là có 1 điều khiển máy tính bằng remote thông qua RF.
      Mình giao tiếp usb kiểu HID , máy đã nhận được thiết bị , truyền nhận ok .

      - Do điều khiển thông qua RF nên mạch của mình liên tục ở trong vòng lặp để kiểm tra , chỉ khi nào nhận được tín hiệu (giải mã thành công) thì mới thoát ra truyền lên máy tinh , sau đó lại lặp kiểm tra tiếp.
      - Phần mềm mình viết bằng C# , dùng timer để đọc liên tục mỗi 0.5s , theo lý thuyết thì khi không có dữ liệu truyền lên thì trả về null . Nên mình dùng if kiểm tra, nếu null thì bỏ qua , không thì hiển thị.
      - Nhưng khi mình cắm thiết vị vào là ứng dụng của mình bị treo (C# và mọi thứ bình thường)
      - Khi usb mình giải mã được tín hiệu và truyền lên thì ứng dụng lại chạy và hiển thị lên bình thường , sau đó lại bị treo .

      Tóm lại vấn đề của mình là: khi USB không truyền gì lên (do đang ở trong vòng lặp kiểm tra tín hiệu RF) thì ứng dụng trên C# bị treo ngay hàm nhận dữ liệu , làm treo luôn cả ứng dụng . Khi USB truyền lên thì chay ... hiển thị ... rồi lại treo =.=

      Mong mọi người giúp mình giải quyết vấn đề này . Cảm ơn nhiều .

      Code C# mình viết dựa trên trang web này : https://sites.google.com/site/lhpsci...otiepusbquahid
      Code PIC mình viết bằng CCS .
      Có 2 giải pháp:
      Một là sửa code:
      while(1)
      {
      if(getDataRF(&data))
      {
      USBsend(data);
      }

      if(USBget(str))
      {
      ReportRF(str);
      }
      }
      }

      Hai là: Sử dụng module thu phát sóng RF chuyên dụng. Module này giao tiếp UART hoặc SPI với PIC18F của bạn.

      Comment


      • #4
        Nguyên văn bởi duong_act Xem bài viết
        Nhận dữ liệu từ USB lên C# thì bạn để khối lệnh nhận dữ liệu của C# để trong "try". Trong "catch" bạn có thể không làm gì hoặc hiển thị lên 1 cái label về thông tin lỗi.
        Nó vẫn treo ban à . Mà mình rà rà lần lần thì thấy hàm try catch hoạt động bình thường khi không có gắn usb vào . Còn gắn vào là bị treo .
        Đây là code chỗ đọc dữ liệu của C#
        Code:
                public byte[] Receive()
                {
                    if (AttachedState)
                    {
                        IntPtr pINBuffer = IntPtr.Zero;
                        uint lpNumberOfBytesRead = 0;
                        byte[] INBuffer = new byte[in_size + 1];
        
                        try
                        {
                            pINBuffer = Marshal.AllocHGlobal((int)in_size);   
                            //Allocate some unmanged RAM for the receive data buffer.
        
                            if (ReadFile(ReadHandleToUSBDevice, pINBuffer, Convert.ToUInt32(in_size+1), ref lpNumberOfBytesRead, IntPtr.Zero))
                            {
                                Marshal.Copy(pINBuffer, INBuffer, 0, (int)lpNumberOfBytesRead);    
                                //Copy over the data from unmanged memory into the managed byte[] INBuffer
                                
                                Marshal.FreeHGlobal(pINBuffer);
                                byte[] data = new byte[in_size];
                                for (int i = 0; i < in_size; i++)
                                {
                                    data[i] = INBuffer[i + 1];
                                }
                                return data;
                            }
                            else
                            {
                                Marshal.FreeHGlobal(pINBuffer);
                                return null;
                            }
        
                        }
                        catch 
                        {
                            if (pINBuffer != IntPtr.Zero)
                            {
                                Marshal.FreeHGlobal(pINBuffer);
                            }
                            return null;
                        }
                    }
                    else return null;
                }
        Bạn coi thử có sai chỗ nào không . Tại mình mới học C# nên không rành lắm về cái này .
        Nếu bạn có code C# giao tiếp HID usb khác thì cho mình xin tham khảo cũng được , cảm ơn trước.

        Comment


        • #5
          Nguyên văn bởi OpenDoor Xem bài viết
          Có 2 giải pháp:
          Mình dùng bộ thu phát RF 315MHz để giảm chi phí thôi .
          Mà theo cách 1 thì mình truyền dữ liệu lên máy tính liên tục à . Cho dù không giải mã được gì cũng truyền lên?

          Comment


          • #6
            Nguyên văn bởi tunglee091 Xem bài viết
            Mình dùng bộ thu phát RF 315MHz để giảm chi phí thôi .
            Mà theo cách 1 thì mình truyền dữ liệu lên máy tính liên tục à . Cho dù không giải mã được gì cũng truyền lên?
            Có lệnh if thì sao truyền dữ liệu liên tục được.

            Comment


            • #7
              Nguyên văn bởi OpenDoor Xem bài viết
              Có lệnh if thì sao truyền dữ liệu liên tục được.
              Cho mình hỏi tý :
              if(getDataRF(&data)) và if(getDataRF(data)) khác nhau thế nào vậy?

              Comment


              • #8
                Nguyên văn bởi tunglee091 Xem bài viết
                Nó vẫn treo ban à . Mà mình rà rà lần lần thì thấy hàm try catch hoạt động bình thường khi không có gắn usb vào . Còn gắn vào là bị treo .
                Mới nhảy qua C# nên chỉ nhầm bạn ạ. Try-catch dùng khi có lỗi thôi.
                Nếu bạn dùng CCS cho PIC. Phương án bạn có thể làm là dùng RTOS của CCS để tạo 2 task chạy song song. 1 task để nhận dữ liệu, task kia để giao tiếp với USB. Nếu dữ liệu nhận chưa xong mà USB có yêu cầu gửi dữ liệu lên thì có thể gửi lên 1 đoạn string báo cho C# biết là chưa có dữ liệu. Nó sẽ không treo nữa.

                Comment


                • #9
                  Mình dùng C++ nhưng mình nghĩ chắc cũng không khác nhau nhiều lắm
                  Vấn đề là ở chỗ Hàm nhận dữ liệu từ USB sẽ chờ cho đến khi nhận được dữ liệu mới trả về nên ứng dụng sẽ bị treo ở đó.
                  Mình đã làm với C++ và giải quyết được vấn đề này (sử dụng các hàm API)
                  Nếu bạn có thể dùng dll thì mình sẽ giúp bạn.
                  Mình sẽ code 1 thư viện dll bằng C++ và bạn sử dụng trong ứng dụng của bạn.
                  Mỗi khi đọc dữ liệu ứng dụng sẽ chờ 500ms nếu không nhận được dữ liệu thì sẽ quay lại từ đầu chứ không phải là chờ đến khi nhận được mới thôi.

                  Comment


                  • #10
                    Cảm ơn bạn .
                    Mình không biết tý gì về C++ hết .
                    Nhưng vấn đề của mình đã được 1 đứa bạn mình giải quyết , Nó viết bằng C# , mình cũng không biết vì sao nhưng nói chung giờ hết treo rồi .

                    Một lần nữa cảm ơn mọi người đã giúp đỡ mình .

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    • tuyennhan
                      Trả lời cho Tiếng Anh cho người Việt
                      bởi tuyennhan
                      Cái thư sai ngay câu chào Dear sir mới đúng Hi chỉ dùng cho người quen , các vấn đề về kỹ thuật nó không trả lời hoặc nói loanh quanh tránh ảnh hưởng đến công ty .
                      Giup1 người cần không giúp người không cần với lại văn mình vợ người nha đừng quên .
                      Hôm qua, 07:44
                    • vi van pham
                      Trả lời cho Tiếng Anh cho người Việt
                      bởi vi van pham
                      Cám ơn những lời chúc tốt đẹp của em.

                      Việc em làm giống như chê sếp dốt, chẳng những không có miếng xôi nào để ăn mà còn chịu nhiều trù dập lên bờ , xuống ruộng.

                      Hãy tránh vết xe đổ của tui đi. Dành thời gian lo cho gia đình....
                      Hôm qua, 02:00
                    • nhathung1101
                      Trả lời cho Tiếng Anh cho người Việt
                      bởi nhathung1101
                      Ngoại ngữ là không thể thiếu, nhất là làm việc với công nghệ.

                      Nhưng học để tán gái hay để đọc datasheet, manual là chuyện cần quan tâm.

                      Và đọc ở nguồn nào đáng tin cậy, chứ cứ lên tictok hay facebook học lỏm thì...
                      22-02-2025, 22:18
                    • dinhthuong80
                      Trả lời cho Tiếng Anh cho người Việt
                      bởi dinhthuong80
                      Bác nói rất khách quan và chính xác. Ngoại ngữ là chìa khóa thăng tiến dù làm gì. Chả thế mà nay nước mình dạy tiếng Anh từ tiểu học.

                      Nhớ hồi năm 2006 em ra Hải Phòng, Hải Dương tìm việc, thời đó ở Bình Dương lương công...
                      22-02-2025, 14:51
                    • dinhthuong80
                      Trả lời cho Tiếng Anh cho người Việt
                      bởi dinhthuong80
                      Cảm ơn bạn, ĐT cũng có ý nghĩ như vậy.

                      Thực ra, lỗi của hãng đó ( gọi là hãng vì không chỉ một model sản phẩm) là về phần cứng, ĐT tuy không biết về lập trình phần mềm nhưng cũng thấy rằng sẽ chẳng khó khăn gì đáng...
                      22-02-2025, 14:39
                    • dinhthuong80
                      Trả lời cho Tiếng Anh cho người Việt
                      bởi dinhthuong80
                      Dạ, bác bảy mấy tuổi đời rồi cũng không kém bố cháu bao nhiêu. Tuổi nghề thì bác cũng đáng tuổi cha chú.

                      Nhưng 2 điều trên thì chưa hẳn đã đáng quí và đáng tôn trọng bằng việc bác rất nhiệt tình chia sẻ kinh nghiệm chuyên...
                      22-02-2025, 14:28
                    • bqviet
                      Trả lời cho Tiếng Anh cho người Việt
                      bởi bqviet
                      Đúng, nếu chú tâm thì chỉ cần mỗi tiếng Việt là đã khá đủ để làm đa số công việc thông thường, ở thời đại ngày nay khi tài liệu sách vở phương tiện thông tin liên lạc đã nhiều. Nhưng cũng chính ở thời nay giao lưu các nước nhiều...
                      21-02-2025, 20:26
                    • mèomướp
                      Trả lời cho Tiếng Anh cho người Việt
                      bởi mèomướp
                      Dạ cháu nghĩ chú dinh... cứ mạnh dạn gửi thư đi ạ, chú có thể gửi bằng văn bản in chuyển phát nhanh sẽ có giá trị hơn. Vấn đề chưa hẳn là cần hãng làm gì đó, mà chỉ đơn giản là mình cảm thấy nhẹ lòng vì đã làm những việc bản...
                      21-02-2025, 12:32
                    • vi van pham
                      Trả lời cho Tiếng Anh cho người Việt
                      bởi vi van pham
                      Những lần hắt hơi sổ mũi làm tôi mệt lã, phải dùng rượu uống để ngũ. Tôi cũng đang uống rượu 1 mình, viết vài dòng này cho em ( có lẽ dt chỉ bằng tuổi em tôi).

                      Dinh thuong dang đi vào vết xe đổ của tôi. Càng chứng minh, có...
                      20-02-2025, 21:31
                    • bqviet
                      Trả lời cho Hỏi về cách hàn linh kiện ( giúp tớ với )
                      bởi bqviet
                      Thiết nghĩ thi thoảng bác lên đây chia xẻ ít kinh nghiệm cũng vui rồi. Còn chuyện con người sinh lão bệnh tử là thường, sống cùng với quy luật đó thôi. Bqv nhớ trước đây bác từng kể về chuyện rang chì ô-xít bằng chảo để phục hồi bình điện, đấy cũng là thành quả đáng nể phục ở thời kỳ thiếu thốn đó.
                      20-02-2025, 17:22
                    Đang tải...
                    X