BLU蓝牙上位机求指导

By chenqiang at 2021-03-06 • 0人收藏 • 243人看过

最近在 网上查到一工具

   系统平台低功耗蓝牙开发接口库,提供BLE设备的枚举、扫描、连接和检测,蓝牙服务和特征的枚举、读写、订阅,控制器版本查询等API函数。支持Windows、Android等系统。

下载地址:

http://www.wch.cn/downloads/WCHBleLib_MultiOS_ZIP.html

想将C++代码转换为AARDIO,但现在回调函数不会用,求指导


image.png

5 个回复 | 最后更新于 2021-02-27
2021-03-06   #1

很想将原来的上位机全部换为AARDIO,支持校长.就是不会回调

2021-03-06   #2

大致看了下, 回调在aardio里根据调用方式stdcall的有

thread.tostdcall

raw.tostdcall

看你那个dll是stdcall,用对应的转换下aar里面的函数成为函数指针即可.

https://www.htmlayout.cn/t/361

可以参考上面的例子, 还有aardio的sio串口库里其实也有这样的回调, 先琢磨下, 试试手, 还是不行的话, 贴上你的代码还有运行遇到的问题.

自己研究出来也是个学习过程, 比别人直接给代码记忆深刻. O(∩_∩)O~

2021-03-06   #3

在这里要代码很不合适,这不是在支持 aardio,更不是在支持 htmlayout.cn,htmlayout.cn 毕竟是 popdes 的个人博客,以分享代码为主,简单的说是抛砖引玉,你先得扔块砖,别人指导你的前提是,你自己有动手写代码, 自己都不愿意帮自己,别人怎么帮你?!我强烈建议大家,无论在哪里看到这种问题,都不要回复,不要帮忙,共同抵制这种风气。


2021-03-06   #4

import win.ui;

/*DSG{{*/

mainForm = win.form(text="BLU蓝牙PC上位机";right=959;bottom=591)

mainForm.add(

button={cls="button";text="检查";left=376;top=40;right=451;bottom=69;dl=1;dt=1;z=1};

button2={cls="button";text="检查";left=376;top=78;right=451;bottom=107;dl=1;dt=1;z=4};

button3={cls="button";text="检查";left=376;top=123;right=451;bottom=152;dl=1;dt=1;z=7};

button4={cls="button";text="检查";left=376;top=163;right=451;bottom=192;dl=1;dt=1;z=10};

button5={cls="button";text="检查";left=376;top=200;right=451;bottom=229;dl=1;dt=1;z=13};

button6={cls="button";text="打开蓝牙";left=380;top=237;right=454;bottom=273;z=16};

edit={cls="edit";left=193;top=41;right=361;bottom=69;dl=1;dt=1;edge=1;multiline=1;z=2};

edit2={cls="edit";left=193;top=79;right=361;bottom=107;dl=1;dt=1;edge=1;multiline=1;z=5};

edit3={cls="edit";left=193;top=124;right=361;bottom=152;dl=1;dt=1;edge=1;multiline=1;z=8};

edit4={cls="edit";left=193;top=163;right=361;bottom=191;dl=1;dt=1;edge=1;multiline=1;z=11};

edit5={cls="edit";left=193;top=200;right=361;bottom=228;dl=1;dt=1;edge=1;multiline=1;z=14};

richedit={cls="richedit";left=1;top=350;right=963;bottom=590;edge=1;multiline=1;z=17};

static={cls="static";text="是否支持低功耗蓝牙:";left=0;top=40;right=189;bottom=71;dl=1;dt=1;font=LOGFONT(h=-20);transparent=1;z=3};

static2={cls="static";text="是否可以作为从机:";left=0;top=78;right=188;bottom=109;dl=1;dt=1;font=LOGFONT(h=-20);transparent=1;z=6};

static3={cls="static";text="是否可以作为主机:";left=1;top=123;right=189;bottom=154;dl=1;dt=1;font=LOGFONT(h=-20);transparent=1;z=9};

static4={cls="static";text="是否支持安全连接:";left=2;top=163;right=190;bottom=194;dl=1;dt=1;font=LOGFONT(h=-20);transparent=1;z=12};

static5={cls="static";text="是否支持广播包:";left=0;top=200;right=188;bottom=231;dl=1;dt=1;font=LOGFONT(h=-20);transparent=1;z=15}

)

/*}}*/


import console;

var blu=raw.loadDll("res/blu.dll",,"scdcll")

   //blu.WCHBLEInit();//初始化调用库,只有执行1次;

mainForm.button.oncommand = function(id,event){

   if(blu.WCHBLEIsLowEnergySupported()){

    mainForm.edit.text="支持";

   }

   else {

    mainForm.edit.text="不支持";

   }

}


mainForm.button2.oncommand = function(id,event){

if(blu.WCHBLEIsPeripheralRoleSupported()){

mainForm.edit2.text="支持";

}

else {

mainForm.edit2.text="不支持";

}

}


mainForm.button3.oncommand = function(id,event){

    if(blu.WCHBLEIsCentralRoleSupported()){

mainForm.edit3.text="支持";

}

else {

mainForm.edit3.text="不支持";

}

}


mainForm.button4.oncommand = function(id,event){

    if(blu.WCHBLEAreLowEnergySecureConnectionsSupported()){

mainForm.edit4.text="支持";

}

else {

mainForm.edit4.text="不支持";

}

}


mainForm.button5.oncommand = function(id,event){

    if(blu.WCHBLEIsAdvertisementOffloadSupported()){

mainForm.edit5.text="支持";

}

else {

mainForm.edit5.text="不支持";

}

}


mainForm.button6.oncommand = function(id,event){

//设备枚举

//class BLENameDevID{BYTE Name[1024] ;  BYTE DevID[1024];  int Rssi}

BLENameDevID  = raw.toarray( 24 )

BLENameDevID.array[1] = {BYTE Name[260] ;  BYTE DevID[260];  int Rssi}; 

//var BLENameDevID =  {  BYTE Name[260] ;  BYTE DevID[260];  int Rssi } 

var pNum=10;

var DevIDFilter="";//蓝牙名称,空为所有;

WCHBLEEnumDevice=blu.api("WCHBLEEnumDevice","int (int scanTimes,string &DevIDFilter,struct &pBLENameDevIDArry,addr &pNum)");

a=WCHBLEEnumDevice(2500,DevIDFilter,BLENameDevID,pNum)

//console.dump(WCHBLEEnumDevice(2500,DevIDFilter,BLENameDevID,pNum))

for(i=1;10;1){

    if(tostring(BLENameDevID.array[i].Name)[1]!=""){

    mainForm.richedit.appendText(BLENameDevID.array[i].Name,BLENameDevID.array[i].DevID,BLENameDevID.array[i].Rssi )

     mainForm.richedit.appendText('\r\n' )

    }   

}


pFunReadCallBack = function (a,b) {

                console.log(a,b);


bmac="BluetoothLE#BluetoothLE00:e0:4c:82:5a:0a-85:cb:3e:cf:00:13"

ConnectStatus=raw.tostdcall( pFunReadCallBack,"void(int,byte)");

WCHBLEOpenDevice=blu.api("WCHBLEOpenDevice","void(string deviceID,pointer ConnectStatus)" )

var flag=WCHBLEOpenDevice(bmac,ConnectStatus)


console.dump(flag)

}



mainForm.show();

return win.loopMessage();


2021-03-06   #5

回复#4 @chenqiang :

看你上面的callback定义, 貌似没啥问题,

dll引用是stdcall,你拼错了,void*可以用ADDR, UCHAR用BYTE, 

另外你这里演示的是open的callback, 函数名最好一致

我这里调用dll会提示少了个api-ms-xxxxxx.dll, 网上下载了个还是不行, 没法测试, 可能需要注意的地方是raw.tostdcall, 如果调用会报错, 那么可以改用多线程的thread.tostdcall,当然如果用了thread,那么callback函数里就要加一句import console , 才能输出信息. 你自己再测测.

这里void*

var blu=raw.loadDll("res/blu.dll",,"stdcall")
FunDevConnChangeCallBack = function (a,b) {
     console.log(a,b);	
}
ConnectStatus=raw.tostdcall( FunDevConnChangeCallBack,"void(ADDR,BYTE)");
WCHBLEOpenDevice(bmac,ConnectStatus)

没设备测写了个简单的测试: 

import win.ui;
/*DSG{{*/
mainForm = win.form(text="BLU蓝牙PC上位机";right=657;bottom=368)
mainForm.add(
button={cls="button";text="Button";left=376;top=276;right=602;bottom=331;z=1};
button2={cls="button";text="Button";left=79;top=268;right=305;bottom=323;z=2}
)
/*}}*/

import console;
console.open()


var dll = raw.loadDll("/WCHBLEDLL.dll","dddd","stdcall");
//pFunDevConnChangeCallBack = dll.api("pFunDevConnChangeCallBack","void(ADDR,BYTE )" )
WCHBLEEnumDevice=dll.api("WCHBLEEnumDevice","void(INT,string,struct&,INT&)" )
WCHBLEOpenDevice=dll.api("WCHBLEOpenDevice","ADDR(string deviceID,pointer ConnectStatus)" )
WCHBLECloseDevice = dll.api("WCHBLECloseDevice","void(ADDR)" )
FunDevConnChangeCallBack = function (a,b) {
    import console
     console.dump(a,b); 
}
ConnectStatus=raw.tostdcall( FunDevConnChangeCallBack,"void(ADDR,BYTE)");
var dev,num = WCHBLEEnumDevice(2000,"",{BYTE name[260];BYTE devID[260];int rssi},10);
console.log(num);
console.dump(dev)
console.log(dev.name)
console.log(dev.devID)
var devHwnd;// = WCHBLEOpenDevice(dev.devID,ConnectStatus)

mainForm.button.oncommand = function(id,event){
	 WCHBLECloseDevice(devHwnd);
}

mainForm.button2.oncommand = function(id,event){
	devHwnd = WCHBLEOpenDevice(dev.devID,ConnectStatus)
	if(devHwnd==null){
		console.log("打开失败")
	}else {
		console.log("ok")
	}
	
}

mainForm.show();
win.loopMessage();

用蓝牙鼠标测试,能连接能显示, 但是回调的那个并没有执行, 我估计应该是dll这个回调有问题,或者还没理解这个dll咋用....

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前在学aardio+halcon机器视觉.
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
苏扬博客:苏扬博客
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
本 站 主 站:Stm32cube中文网
Htmlayout界面在线学习文档
Sciter中文在线文档Sciter在线学习文档
aardio在线手册Aardio在线手册

赞助商:才仁机械
下载站:非凡软件站
Loading...