我有Ch9140弄了个蓝牙转485的板子,现在有需求需要多个定时发送数据,参照“BleUartLib”中Android中的例程,发现用“TYPE_TIMING”方式进行发送就行。
但现在的问题是,“TYPE_TIMING”方式发送只有第1个生效,其它的都发送不出去,请问下是什么原因导致的?要如何解决?
谢谢指导!
我有Ch9140弄了个蓝牙转485的板子,现在有需求需要多个定时发送数据,参照“BleUartLib”中Android中的例程,发现用“TYPE_TIMING”方式进行发送就行。
但现在的问题是,“TYPE_TIMING”方式发送只有第1个生效,其它的都发送不出去,请问下是什么原因导致的?要如何解决?
谢谢指导!
Demo中的定时发送使用的是AsyncTask。同一个进程下,所有AsyncTask任务都会到达同一个队列,也就是说只有上一个AsyncTask执行完,下一个才会执行。所以您这边的第一个调用有效,第二个没有生效。
解决方发:不使用AsyncTask,可以使用Rxjava/kotlin协程/线程池,也可以新建两个线程处理发送。
如有问题可以直接联系我:zhangpc@wch.cn
谢谢大神的指导!
我重写了TimerTask类为MyTimerTask,在该类的doInBackground()中处理多个数据的定时发送,执行myTimingTask.execute()时传递进去了BytesTaskBean数组,现在暂时解决了问题。
-----------------------------------------------
对于CH9140蓝牙芯片我还有一个疑问,就是调用CH9140BluetoothManager.getInstance().write()发送数据时,需要考虑时间间隔吗?还是说我发完1个就可以立马发送第2个。
下面的代码会有问题吗,能不能保证data1和data2都正常通过CH9140发送出去(如不能需怎样改写):
new Thread(){
public void run() {
CH9140BluetoothManager.getInstance().write(data1,data1.length);
}
}.start();
new Thread(){
public void run() {
CH9140BluetoothManager.getInstance().write(data2,data2.length);
}
}.start();
我测试程序时发现,同时发蓝牙数据时经常导致程序崩溃(比如后台有一个定时发送数据的Task,现在又需要单发一条,可能刚好碰上后台定时任务也正在发送数据),请问要如何解决?
1.我们提供的写数据的api,都是写完成后才返回的,可以连续发送不需要时间间隔
2.请尽量避免使用多线程同时发送数据,会造成多个线程抢占手机蓝牙芯片驱动,大概率发送失败
3.TimeTask也是基于线程池实现的,同时发送发生也会冲突
4.可以使用Lock锁或者Sync关键字,确保同时只会有一个线程调用发送函数。
如有问题可以直接联系我:zhangpc@wch.cn