社区导航

 
查看: 2048|回复: 1

[原创] 【CH554式改评测】CH554和libusb(下)

[复制链接]

3308

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2018-4-16 16:46:50 | 显示全部楼层 |阅读模式

【CH554式改评测】CH554和libusb(上)
http://bbs.eeworld.com.cn/forum. ... &fromuid=305293
(出处: 电子工程世界-论坛)
上集吹了一下怎么修改windows驱动,和单片鸡代码的乱改

接下来请出UI钜献
Q......T......
QQ图片20180416163436.gif

要配套libusb使用的文件有两个
libusb.a和lusb0_usb.h
库文件和头文件
说好的开源呢
记得把lusb0_usb.h包含上
上集里面提到的VID、PID和endPoint必须对得上
7.png
1.png
2.png
不对不通,妥妥滴

面向对象真好用
上点初学的代码
  1. bool MainWindow::openUSB(struct usb_device *dev)
  2. {
  3.     devOpenFlg = false;

  4.     devHandle = usb_open(dev);
  5.     if(!devHandle)
  6.     {
  7.         qDebug() << "error opening device: ";
  8.         qDebug() << usb_strerror();
  9.         return false;
  10.     }
  11.     else
  12.     {
  13.         QString svid = QString::number(dev->descriptor.idVendor, 16);
  14.         QString spid = QString::number(dev->descriptor.idProduct, 16);
  15.         qDebug() << "success: device " << svid << " : "<<  spid << " opened";
  16.         devOpenFlg = true;
  17.     }
  18.     if (usb_set_configuration(devHandle, MY_CONFIG) < 0)
  19.     {
  20.         qDebug() << "error setting config #" << MY_CONFIG << " : " << usb_strerror();
  21.         usb_close(devHandle);
  22.         return false;
  23.     }
  24.     else
  25.     {
  26.         qDebug() << "success: set configuration #" << MY_CONFIG;
  27.     }

  28.     if (usb_claim_interface(devHandle, 0) < 0)
  29.     {
  30.         qDebug() << "error claiming interface #" << MY_INTF;
  31.         qDebug() << usb_strerror();
  32.         usb_close(devHandle);
  33.         return false;
  34.     }
  35.     else
  36.     {
  37.         qDebug() <<  "success: claim_interface #" << MY_INTF;
  38.     }
  39.     return true;
  40. }

  41. bool MainWindow::closeUSB()
  42. {
  43.     if(devHandle)
  44.     {
  45.         devOpenFlg = false;
  46. //        UsbListener::quit();
  47.         int ret = usb_close(devHandle); // Exit Thread
  48.         if(ret == 0)
  49.         {
  50.             qDebug() << "Close USB Device success, ret = " << ret << "\n";
  51.             return true;
  52.         }
  53.         else
  54.         {
  55.             qDebug() << "Close USB Device failed, ret = " << ret << "\n";
  56.             return false;
  57.         }

  58.     }
  59.     else {}
  60.     return false;
  61. }
  62. bool MainWindow::sendData(QByteArray &data)
  63. {
  64.     if(true == devOpenFlg)
  65.     {
  66.         int ret = 0;
  67.         char *tmp = data.data();

  68.         ret = usb_bulk_write(devHandle, EP_OUT, tmp, data.length(), 5000);
  69.         if (ret < 0)
  70.         {
  71.             qDebug() << "error writing:";
  72.             qDebug() << usb_strerror() << ret;

  73.             return false;
  74.         }
  75.         else
  76.         {
  77.             qDebug() << "success: bulk write " << ret <<  " bytes";
  78.             return true;
  79.         }
  80.     }
  81.     else{}

  82.     return false;
  83. }

  84. struct usb_device * MainWindow::my_usb_get_device_list(const unsigned short idVendor,const unsigned short idProduct)
  85. {
  86.     struct usb_bus *bus;
  87.     int bus_cnts,dev_cnts;
  88.     bus_cnts = usb_find_busses(); /* find all busses */
  89.     dev_cnts = usb_find_devices(); /* find all connected devices */
  90.     if(dev_cnts == 0)
  91.     {ui->statusBar->showMessage(tr("未发现设备"));}
  92.     else{}
  93.     if(bus_cnts == 0)
  94.     {ui->statusBar->showMessage(tr("未发现总线"));}
  95.     else{}
  96.     for (bus = usb_get_busses(); bus; bus = bus->next)
  97.     {
  98.         for (dev = bus->devices; dev; dev = dev->next)
  99.         {
  100.             /* for specified device
  101.             if (dev->descriptor.idVendor == MY_VID
  102.                         && dev->descriptor.idProduct == MY_PID)
  103.             {
  104.                 return usb_open(dev);
  105.             }
  106.             */
  107.             if((dev->descriptor.idVendor == idVendor) && (dev->descriptor.idProduct == idProduct))
  108.             {
  109.                 QString svid = QString::number(dev->descriptor.idVendor, 16);
  110.                 QString spid = QString::number(dev->descriptor.idProduct, 16);
  111.                 qDebug("VID:PID = %x:%x\n", dev->descriptor.idVendor, dev->descriptor.idProduct);
  112.                 ui->statusBar->showMessage(tr("设备已插入,VID:PID=%1:%2\n").arg(svid).arg(spid));
  113.                 return dev;
  114.             }
  115.             else{}
  116.         }
  117.     }
  118.     return NULL;
  119. }

  120. bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
  121. {
  122.     MSG *msg = reinterpret_cast<MSG *>(message);
  123.     eventType.count();
  124.     *result = *result;
  125.     int msgType = msg->message;
  126.     if(msgType == WM_DEVICECHANGE)
  127.     {
  128.         switch(msg->wParam)
  129.         {
  130.         case DBT_DEVICEARRIVAL:
  131.             /* break; */
  132.         case DBT_DEVICEREMOVECOMPLETE:
  133.             /* break; */
  134.         case DBT_DEVNODES_CHANGED:
  135.         {
  136.             dev = my_usb_get_device_list(MY_VID, MY_PID);
  137.             if(NULL != dev)
  138.             {
  139.                 QString svid = QString::number(dev->descriptor.idVendor, 16);
  140.                 QString spid = QString::number(dev->descriptor.idProduct, 16);
  141.                 ui->statusBar->showMessage(tr("设备已插入,VID:PID=%1:%2\n").arg(svid).arg(spid));
  142.                 usb_init(); /* initialize the library */
  143.                 usb_set_debug(250);
  144.                 openUSB(my_usb_get_device_list(MY_VID,MY_PID));
  145.             }
  146.             else
  147.             {
  148.                 ui->statusBar->showMessage(tr("设备已移除"));
  149.             }
  150.         }
  151.             break;
  152.         default:
  153.             break;
  154.         }
  155.     }
  156.     return false;
  157. }


  158. void MainWindow::on_sendButton_clicked()
  159. {
  160.     QByteArray data;
  161.     QString tmp;
  162.     tmp = ui->input_box->text();
  163.     data = tmp.toUtf8();
  164.     sendData(data);
  165. }

  166. void MainWindow::on_scanButton_clicked()
  167. {

  168. }

  169. void MainWindow::on_reopenButton_clicked()
  170. {

  171. }

  172. void MainWindow::timerEvent(QTimerEvent *e)
  173. {
  174.     int ret;
  175.     char tmp[BUF_SIZE];
  176.     if(e->timerId() == read_timer)
  177.     {
  178.         ret = usb_bulk_read(devHandle, EP_IN, tmp, sizeof(tmp), 10);
  179.         if(ret > 0)
  180.         {
  181.             qDebug() << "success: bulk read " << ret << " bytes";
  182. //            QString strTmp;
  183. //            QString strOut;
  184. //            for(int i = 0; i < ret; i++)
  185. //            {
  186. //                strTmp.sprintf("%02X ", (unsigned char)tmp[i]);
  187. //                strOut.append(strTmp);
  188. //            }
  189. //            qDebug() << strOut;
  190.             QByteArray rcv_buf(tmp, ret);// Receive Data Proccess Function
  191.             qDebug() << rcv_buf;
  192.             ui->textBrowser->insertPlainText(rcv_buf);
  193.             ui->textBrowser->insertPlainText("\r");
  194.             rcv_buf.clear();
  195.         }
  196.         else{}
  197.     }
  198. }

  199. void MainWindow::timerUpdate()
  200. {

  201. }
复制代码


可以实时监测CH554 USB_DEVICE热插拔功能
HID设备数据IN采用最2的方式
10ms查询一次,大神们来耻笑楼主吧
不要说什么线程,撸起键盘就是码
8.png
可以发送接收数据
不知道为毛,单片鸡侧会多打印2个字节数据出来
回头再debug一下

9.png
10.png
热插拔测试一下

先到这....


此内容由EEWORLD论坛网友ljj3166原创,如需转载或用于商业用途需征得作者同意并注明出处




此帖出自单片机论坛
So what......


回复

使用道具 举报

228

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2018-4-16 18:38:34 | 显示全部楼层
单价1元含税的USB和Touchkey单片机CH551G已大批量出货,试样QQ:1258305301


回复

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-12-16 18:36 , Processed in 0.098014 second(s), 15 queries , Gzip On, MemCache On.

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