搜索
bottom↓
回复: 3

c#USBHID上位机测试软件制作只能读不能写

[复制链接]

出0入0汤圆

发表于 2015-9-24 09:02:57 | 显示全部楼层 |阅读模式
    /// <summary>
        /// 创建链接句柄
        /// </summary>
        /// <param name="lpFileName"></param>
        /// <returns></returns>
        private bool CreateHandle(string lpFileName)
        {
            bool ret = false;



            if (isOpened == false)
            {


                // 以写访问打开此HID设备
                hidWriteHandle = CreateFile(lpFileName, FILE_ACCESS_MASK.GENERIC_WRITE,
                  FILE_SHARE_MODE.FILE_SHARE_WRITE | FILE_SHARE_MODE.FILE_SHARE_READ, 0, FILE_CREATION_DISPOSITON.OPEN_EXISTING, 0, 0);
                // 以读访问打开此HID设备;
                hidReadHandle = CreateFile(lpFileName, FILE_ACCESS_MASK.GENERIC_READ,
                    FILE_SHARE_MODE.FILE_SHARE_WRITE | FILE_SHARE_MODE.FILE_SHARE_READ, 0, FILE_CREATION_DISPOSITON.OPEN_EXISTING, 0, 0);


                if (hidReadHandle != null && hidWriteHandle != null)
                {
                    GetDeviceCapabilities(hidReadHandle);
                  
                  //  StartBackgroundRead();
                    isOpened = true;
                    ret = true;
                }
                else
                {
                 
                }
            }
            return ret;
        }


/// <summary>
      /// 写数据操作
      /// </summary>
      /// <param name="outPacket"></param>
      /// <returns></returns>
        public bool Write(byte[] outPacket)
        {
            if (isOpened)
            {
                uint bytesWritten = 0;
                bool ret = false;



                ret = WriteFile(hidWriteHandle, outPacket, (uint)outPacket.Length, ref bytesWritten, IntPtr.Zero);         

                return ret;
            }
            return false;
        }
        /// <summary>
        /// 读数据操作
        /// </summary>
        /// <param name="inPacket"></param>
        /// <returns></returns>
        public bool Read(ref byte[] inPacket)
        {
            if (isOpened)
            {
                uint bytesRead = 1;
                // 默认Report ID;        

               
                return ReadFile(hidReadHandle, inPacket, (uint)inPacket.Length, ref bytesRead, IntPtr.Zero);
            }
            return false;
        }
数据写老是失败不知怎么原因。。。请大师指导!

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-9-24 11:37:10 | 显示全部楼层
hidReadHandle = CreateFile(lpFileName, FILE_ACCESS_MASK.GENERIC_READ,
                    FILE_SHARE_MODE.FILE_SHARE_WRITE | FILE_SHARE_MODE.FILE_SHARE_READ, 0, FILE_CREATION_DISPOSITON.OPEN_EXISTING, 0, 0);

你用读权限打开的,肯定不能写了.

出0入0汤圆

发表于 2015-9-24 11:58:54 | 显示全部楼层
哈哈,真的可能是你打开设备的设备的时候没给写的权限

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2015-9-24 13:09:01 | 显示全部楼层
apple_eat 发表于 2015-9-24 11:37
hidReadHandle = CreateFile(lpFileName, FILE_ACCESS_MASK.GENERIC_READ,
                    FILE_SHARE ...

读权限打开了就不能写了吗?

不知道怎样弄一个能读有能写的机制,

/// <summary>
        /// 打开指定信息的设备
        /// </summary>
        /// <param name="vID">设备的vID</param>
        /// <param name="pID">设备的pID</param>
        /// <param name="serial">设备的serial</param>
        /// <returns></returns>
        public HID_RETURN OpenDevice(UInt16 vID, UInt16 pID, string sPth)
        {
            if (deviceOpened == false)
            {
                if (sPth == "")
                    return HID_RETURN.NO_DEVICE_CONECTED;

                IntPtr device = CreateFile(sPth, DESIREDACCESS.GENERIC_READ | DESIREDACCESS.GENERIC_WRITE,
                    FILE_SHARE_MODE.FILE_SHARE_WRITE | FILE_SHARE_MODE.FILE_SHARE_READ, 0, CREATIONDISPOSITION.OPEN_EXISTING, 0x40000000, 0);
                DeviceHandle = device;
               

                if (device != null)
                {
                    HIDD_ATTRIBUTES attributes;
                    IntPtr serialBuff = Marshal.AllocHGlobal(512);
                    HidD_GetAttributes(device, out attributes);
                    HidD_GetSerialNumberString(device, serialBuff, 512);
                    string deviceStr = Marshal.PtrToStringAuto(serialBuff);
                    Marshal.FreeHGlobal(serialBuff);
                    if (attributes.VendorID == vID && attributes.ProductID == pID)
                    {
                        IntPtr preparseData;
                        HIDP_CAPS caps;
                        HidD_GetPreparsedData(device, out preparseData);
                        HidP_GetCaps(preparseData, out caps);
                        HidD_FreePreparsedData(preparseData);
                        outputReportLength = caps.OutputReportByteLength;
                        inputReportLength = caps.InputReportByteLength;

                       
                        hidDevice = new FileStream(new SafeFileHandle(device, true), FileAccess.Read, inputReportLength, true);
                        deviceOpened = true;
                        BeginAsyncRead();

                        return HID_RETURN.SUCCESS;
                    }
                }

                return HID_RETURN.DEVICE_NOT_FIND;
            }
            else
                return HID_RETURN.DEVICE_OPENED;
        }


这个也只只能读,写不出去,用BusHound监测没见有OUT的数据。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 09:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表