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

                    Đang tải...
                    X