libusb異步接收數據丟包問題

libusb異步接收數據丟包問題

 
1人已賞
易百納技術社區 小王子🤴 2020-08-25 17:51:11

一、 libusb異步接收數據丟包問題

經過種種的坑,終於可以通過異步傳輸的方式收發數據,但是再實際使用中又出現了一個坑,還是比較致命的坑:對於接收時間間隔較大的數據是完全沒有問題的,但是當下位機以很短的時間間隔快速發送數據時,這是上位機使用libusb接收數據就會出現丟包現象,對於較爲嚴格的數據交互這是不允許存在的。

因爲libusb是一個比較強大的庫,所以出現這種情況我的第一反映是對libusb庫的使用出了問題,肯定是有一些地方我沒注意到,少寫了哪一個步驟導致的。

緊接着我就開始在網上各種查找,結果一無所獲,我有重新看了一遍libusb的API文檔,結果還是一無所獲。

網上查不到資料,我就自己調試程序,一遍遍的調試,擴大傳輸結構中的緩存大小、變化超時時間等方法都沒有用。

最後我嘗試着提交多個接收傳輸結構發現不丟包了,問題解決了。

 

 

https://www.ebaina.com/articles/140000004301

一直以爲接收緩存僅僅只是傳輸結構中的緩存,解決問題後才發現提交多個接收傳輸結構等待接收也屬於多開緩存等待接收

 int rc = 0;
    for(int i = 0;i<100;i++)
    {
        libusb_transfer* transfer = libusb_alloc_transfer(0);
        unsigned char *buf = new unsigned char[64];
        memset(buf,0,64);
        transfer->actual_length = 0;
       libusb_fill_bulk_transfer(transfer,dHand,0x82,buf,64,&callbackRevc,this,0);
        rc = libusb_submit_transfer(transfer);
        if(rc < 0)
        {
            libusb_cancel_transfer(transfer);
            libusb_free_transfer(transfer);
            transfer = nullptr;
            qDebug() << "libusb_submit_transfer file:" << rc;
            return;
        }

        qDebug() << rc;

        qTransferList.append(transfer);
}

二、關閉設備後再次打開提交傳輸失敗

在使用中無意間發現當我不關閉程序,僅僅只對設備進行關閉重新打開時提交傳輸結構失敗,導致無法接收也無法發送。 剛開始以爲時設備關閉不徹底導致的,在多次調試檢查關閉接口後發現關閉設備沒有問題,問題不是出現在關閉上,最後發現是因爲提交的接收傳輸結構沒有取消釋放才導致再次打開設備提交傳輸結構時失敗,所以要在設備關閉時取消傳輸和釋放傳輸。

原本這個問題就這樣解決了,結果又出現了一個問題,取消完所有的接收傳輸然後立即釋放傳輸結構時會導致程序崩潰,原來取消傳輸也是屬於異步操作,取消傳輸後不可以立即調用接口釋放傳輸接口,而是要等待取消傳輸完成後再釋放傳輸結構,取消傳輸完成後會調用回調函數同時當前傳輸結構已經取消,這個時候纔可以釋放傳輸結構

//取消傳輸結構
{
    foreach(auto i,qTransferList){
       libusb_cancel_transfer(i);
    }
    qTransferList.clear();
}
void callbackRevc(struct libusb_transfer *transfer)
{
    if (transfer->status == LIBUSB_TRANSFER_COMPLETED) {
}else if (transfer->status == LIBUSB_TRANSFER_CANCELLED) {
//取消完成,釋放傳輸結構
        libusb_free_transfer(transfer);
    }else{
    }

}

三、同一份代碼,換個設備就通訊不了了

在使用中出現過代碼沒動換個設備就用不了了,這是個非常簡單的坑,稍微有點USB基礎只是都不會出現這個錯誤,當然也可能是忘記了,不同設備可能他們的通訊接口號和端點號都不一樣,需要修改聲明的接口號和傳輸的端點。

Windows上可以使用“UsbTreeView.exe”這個軟件查詢設備信息。當然也可以使用libusb的查詢設備描述符接口,我這裏比較懶,直接查詢各個設備的信息進行匹配的。

接下來補充個概念

接口:應用軟件通過和設備之間的數據交換來完成設備的控制和數據傳輸。通常需要多個管道來完成數據交換,因爲同一管道只支持一種類型的數據傳輸。用在一起來對設備進行控制的若干管道稱爲設備的接口。

所以首先要確定接口號是否正確,接口號若錯了那麼通訊的管道就錯了,端點對也沒用

端點:端點是USB 設備中的可以進行數據收發的最小單元,支持單向或者雙向的數據傳輸。

所以端點號也不能錯,而且輸入輸出的方向也要對應上

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章