我有Ch9140弄了個藍牙轉(zhuǎn)485的板子,現(xiàn)在有需求需要多個定時發(fā)送數(shù)據(jù),參照“BleUartLib”中Android中的例程,發(fā)現(xiàn)用“TYPE_TIMING”方式進行發(fā)送就行。
但現(xiàn)在的問題是,“TYPE_TIMING”方式發(fā)送只有第1個生效,其它的都發(fā)送不出去,請問下是什么原因?qū)е碌??要如何解決?
謝謝指導(dǎo)!
我有Ch9140弄了個藍牙轉(zhuǎn)485的板子,現(xiàn)在有需求需要多個定時發(fā)送數(shù)據(jù),參照“BleUartLib”中Android中的例程,發(fā)現(xiàn)用“TYPE_TIMING”方式進行發(fā)送就行。
但現(xiàn)在的問題是,“TYPE_TIMING”方式發(fā)送只有第1個生效,其它的都發(fā)送不出去,請問下是什么原因?qū)е碌??要如何解決?
謝謝指導(dǎo)!
Demo中的定時發(fā)送使用的是AsyncTask。同一個進程下,所有AsyncTask任務(wù)都會到達同一個隊列,也就是說只有上一個AsyncTask執(zhí)行完,下一個才會執(zhí)行。所以您這邊的第一個調(diào)用有效,第二個沒有生效。
解決方發(fā):不使用AsyncTask,可以使用Rxjava/kotlin協(xié)程/線程池,也可以新建兩個線程處理發(fā)送。
如有問題可以直接聯(lián)系我:zhangpc@wch.cn
謝謝大神的指導(dǎo)!
我重寫了TimerTask類為MyTimerTask,在該類的doInBackground()中處理多個數(shù)據(jù)的定時發(fā)送,執(zhí)行myTimingTask.execute()時傳遞進去了BytesTaskBean數(shù)組,現(xiàn)在暫時解決了問題。
-----------------------------------------------
對于CH9140藍牙芯片我還有一個疑問,就是調(diào)用CH9140BluetoothManager.getInstance().write()發(fā)送數(shù)據(jù)時,需要考慮時間間隔嗎?還是說我發(fā)完1個就可以立馬發(fā)送第2個。
下面的代碼會有問題嗎,能不能保證data1和data2都正常通過CH9140發(fā)送出去(如不能需怎樣改寫):
new Thread(){
public void run() {
CH9140BluetoothManager.getInstance().write(data1,data1.length);
}
}.start();
new Thread(){
public void run() {
CH9140BluetoothManager.getInstance().write(data2,data2.length);
}
}.start();
我測試程序時發(fā)現(xiàn),同時發(fā)藍牙數(shù)據(jù)時經(jīng)常導(dǎo)致程序崩潰(比如后臺有一個定時發(fā)送數(shù)據(jù)的Task,現(xiàn)在又需要單發(fā)一條,可能剛好碰上后臺定時任務(wù)也正在發(fā)送數(shù)據(jù)),請問要如何解決?
1.我們提供的寫數(shù)據(jù)的api,都是寫完成后才返回的,可以連續(xù)發(fā)送不需要時間間隔
2.請盡量避免使用多線程同時發(fā)送數(shù)據(jù),會造成多個線程搶占手機藍牙芯片驅(qū)動,大概率發(fā)送失敗
3.TimeTask也是基于線程池實現(xiàn)的,同時發(fā)送發(fā)生也會沖突
4.可以使用Lock鎖或者Sync關(guān)鍵字,確保同時只會有一個線程調(diào)用發(fā)送函數(shù)。
如有問題可以直接聯(lián)系我:zhangpc@wch.cn