OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6105|回复: 20

STM32F4USB的上位机开发

[复制链接]
回帖奖励 40 金钱 回复本帖可获得 5 金钱奖励! 每人限 1 次

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
发表于 2018-11-13 21:46:06 | 显示全部楼层 |阅读模式
本帖最后由 海文 于 2018-11-15 12:29 编辑

有没有大佬用过LibUsbDotNet这个开源库搞上位机的吗?我用STM32F4枚举成HID设备作为下位机,使用USB2.0全速,端点设置正确,但是在单片机不断发送数据到上位机的时候,一开始上位机可以接收到单片机的数据,运行几分钟后就接收不到数据了,此时单片机的USB状态是suspend,希望各位大佬可以给点意见,谢谢!
下面这幅图是这个开源库测试USB设备信息的程序得到的结果
1.png (27.59 KB, 下载次数: 0)


关于USB的就只有下面这些了,
        private void Form1_Load(object sender, EventArgs e)
        {
  
            MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);

            // If the device is open and ready
            if (MyUsbDevice == null)
            {
                // The device is not connected or cannot be accessed by libusbdotnet
                messagebox.Text = "Device not connected!" + "\r\n";
                return;
            }
            else messagebox.Text = messagebox.Text + "\r\n" + "Device connected!" + "\r\n";

            //开启接收数据响应
            IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
            if (!ReferenceEquals(wholeUsbDevice, null))
            {
                // Select config #1
                wholeUsbDevice.SetConfiguration(1);
                // Claim interface #0.
                wholeUsbDevice.ClaimInterface(0);
            }

            // open read endpoint 1.
            reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
            writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);

            reader.DataReceived += (OnRxEndPointData);
            reader.DataReceivedEnabled = true;


        }

        static void USB_SendCmd(byte[] buffer, int count)
        {
            ErrorCode ec = ErrorCode.None;

            try
            {

                // open write endpoint 1.
               
                ec = writer.Write(buffer, 2000, out count);
                if (ec != ErrorCode.None) throw new Exception(UsbDevice.LastErrorString);

            }

            catch (Exception ex)
            {
                Console.WriteLine();
                Console.WriteLine((ec != ErrorCode.None ? ec + ":" : String.Empty) + ex.Message);
            }
        }

        long cnt = 0;
        private  void OnRxEndPointData(object sender, EndpointDataEventArgs e)
        {
            Encoding.Default.GetString(e.Buffer, 0, e.Count);
            cnt++;
            //bytesRead = e.Count;
            if (e.Buffer[0] != 0)
            {
                for (int i = 0; i < e.Count; i++)
                {
                    //messagebox.Text = messagebox.Text + " " + readBuffer;
                    RecBuffer【i】 = e.Buffer
【i】;
                    e.Buffer【i】= 0;
                }
                RecFlag = true;
                reader.DataReceivedEnabled = true;
                //messagebox.Text = messagebox.Text + "\r\n";
            }

        }

接收部分显示有点问题,我发截图吧


捕获.PNG (56.8 KB, 下载次数: 0)






正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-13 21:50:03 | 显示全部楼层
本帖最后由 海文 于 2018-11-13 22:18 编辑

我在单独测试USB的时候,使用ST官方的上位机是可以长时间接收数据的,但是我自己做的上位机却也只能运行几分钟,不过在开着官方上位机的时候,我自己编写的上位机就可以长时间运行了,感觉很奇怪,应该是我的上位机的问题,下面是我的上位机打开USB设备的程序,请大佬们指正:
            MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);

            // If the device is open and ready
            if (MyUsbDevice == null)
            {
                // The device is not connected or cannot be accessed by libusbdotnet
                messagebox.Text = "Device not connected!" + "\r\n";
                return;
            }
            else messagebox.Text = messagebox.Text + "\r\n" + "Device connected!" + "\r\n";

            IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
            if (!ReferenceEquals(wholeUsbDevice, null))
            {
                // Select config #1
                wholeUsbDevice.SetConfiguration(1);
                // Claim interface #0.
                wholeUsbDevice.ClaimInterface(0);
            }

            // open read endpoint 1.
            reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
            writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);

            reader.DataReceived += (OnRxEndPointData);
            reader.DataReceivedEnabled = true;
我是使用消息响应的方法接收数据的。
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-13 21:53:34 | 显示全部楼层
下面这幅图是这个开源库测试USB设备信息的程序得到的结果
C:\Users\AM\Desktop\1.png
1.png
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-13 23:23:17 | 显示全部楼层
通宵在线等
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-14 01:49:51 | 显示全部楼层
深夜顶一下
回复 支持 反对

使用道具 举报

0

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
502
金钱
502
注册时间
2016-11-28
在线时间
97 小时
发表于 2018-11-14 04:20:59 | 显示全部楼层
www.embed-net.com 楼主可以参考一下这里的一些帖子
回复 支持 反对

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-11-14 08:27:51 | 显示全部楼层

回帖奖励 +5 金钱

帮顶  
回复 支持 反对

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2018-11-14 08:42:42 | 显示全部楼层
hid,我只用java写过上位机
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-14 08:50:15 | 显示全部楼层
xsx127 发表于 2018-11-14 08:42
hid,我只用java写过上位机

老板叫我用C#啊,没办法
回复 支持 反对

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2018-11-14 10:21:01 | 显示全部楼层

回帖奖励 +5 金钱

装BusHound抓封包, 看看运行状况.
回复 支持 反对

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2018-11-14 10:26:26 | 显示全部楼层

回帖奖励 +5 金钱

代码不全啊,多加try catch慢慢查吧
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-14 10:40:02 | 显示全部楼层
sammy902583 发表于 2018-11-14 10:21
装BusHound抓封包, 看看运行状况.

不知道为什么这个抓包工具什么都没有显示,用官方上位机的时候才有显示,运行我自己写的上位机是没有显示的,但是我的上位机一开始的时候也能接收到数据。
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-14 10:41:59 | 显示全部楼层
本帖最后由 海文 于 2018-11-14 11:09 编辑
HCHDaLeiGe 发表于 2018-11-14 10:26
代码不全啊,多加try catch慢慢查吧

关于USB的就只有下面这些了,
        private void Form1_Load(object sender, EventArgs e)
        {
  
            MyUsbDevice = UsbDevice.OpenUsbDevice(MyUsbFinder);

            // If the device is open and ready
            if (MyUsbDevice == null)
            {
                // The device is not connected or cannot be accessed by libusbdotnet
                messagebox.Text = "Device not connected!" + "\r\n";
                return;
            }
            else messagebox.Text = messagebox.Text + "\r\n" + "Device connected!" + "\r\n";

            //开启接收数据响应
            IUsbDevice wholeUsbDevice = MyUsbDevice as IUsbDevice;
            if (!ReferenceEquals(wholeUsbDevice, null))
            {
                // Select config #1
                wholeUsbDevice.SetConfiguration(1);
                // Claim interface #0.
                wholeUsbDevice.ClaimInterface(0);
            }

            // open read endpoint 1.
            reader = MyUsbDevice.OpenEndpointReader(ReadEndpointID.Ep01);
            writer = MyUsbDevice.OpenEndpointWriter(WriteEndpointID.Ep01);

            reader.DataReceived += (OnRxEndPointData);
            reader.DataReceivedEnabled = true;


        }

        static void USB_SendCmd(byte[] buffer, int count)
        {
            ErrorCode ec = ErrorCode.None;

            try
            {

                // open write endpoint 1.
               
                ec = writer.Write(buffer, 2000, out count);
                if (ec != ErrorCode.None) throw new Exception(UsbDevice.LastErrorString);

            }

            catch (Exception ex)
            {
                Console.WriteLine();
                Console.WriteLine((ec != ErrorCode.None ? ec + ":" : String.Empty) + ex.Message);
            }
        }

        long cnt = 0;
        private  void OnRxEndPointData(object sender, EndpointDataEventArgs e)
        {
            Encoding.Default.GetString(e.Buffer, 0, e.Count);
            cnt++;
            //bytesRead = e.Count;
            if (e.Buffer[0] != 0)
            {
                for (int i = 0; i < e.Count; i++)
                {
                    //messagebox.Text = messagebox.Text + " " + readBuffer;
                    RecBuffer = e.Buffer;
                    e.Buffer = 0;
                }
                RecFlag = true;
                reader.DataReceivedEnabled = true;
                //messagebox.Text = messagebox.Text + "\r\n";
            }

        }
回复 支持 反对

使用道具 举报

14

主题

204

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2443
金钱
2443
注册时间
2017-9-13
在线时间
559 小时
发表于 2018-11-14 10:53:01 | 显示全部楼层
OnRxEndPointData 这个函数for循环那里没太看明白是要做什么
回复 支持 反对

使用道具 举报

3

主题

259

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2317
金钱
2317
注册时间
2016-12-2
在线时间
354 小时
发表于 2018-11-14 10:58:40 | 显示全部楼层
海文 发表于 2018-11-14 10:40
不知道为什么这个抓包工具什么都没有显示,用官方上位机的时候才有显示,运行我自己写的上位机是没有显示 ...

可能LibUsb在BusHound之前就拦截封包了, 所以BusHound抢不到资料可以收.

不知道有没有办法用其他工具写上位机交叉验证看看, 到底是上位机还是STM32, 还是LibUsb有问题.

回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-14 11:02:02 | 显示全部楼层
HCHDaLeiGe 发表于 2018-11-14 10:53
OnRxEndPointData 这个函数for循环那里没太看明白是要做什么

我只是把数据存放到一个全局变量那里,其他地方需要用到
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-14 11:05:48 | 显示全部楼层
sammy902583 发表于 2018-11-14 10:58
可能LibUsb在BusHound之前就拦截封包了, 所以BusHound抢不到资料可以收.

不知道有没有办法用其他工具 ...

我单独测试USB传输,使用官方上位机是可以长时间接收数据的,我单独运行自己写的上位机却不行,先开官方上位机再开我的上位机才可以长时间接收数据,我觉得应该不是单片机的问题,我的上位机是仿造他这个开源库的例程的,非常尴尬。
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-14 11:10:58 | 显示全部楼层
HCHDaLeiGe 发表于 2018-11-14 10:53
OnRxEndPointData 这个函数for循环那里没太看明白是要做什么

好像显示有点问题,我发截图吧


捕获.PNG
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-14 14:05:40 | 显示全部楼层
在线等
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-14 20:54:47 | 显示全部楼层
难受,通宵的第二个晚上
回复 支持 反对

使用道具 举报

9

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
337
金钱
337
注册时间
2016-4-15
在线时间
126 小时
 楼主| 发表于 2018-11-15 11:01:26 来自手机 | 显示全部楼层
好烦,公司电信断网了,手机在线等(づ ●─● )づ
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 00:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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