嗨对话框,
I am trying to write a firmware that makes the development kit board (basic) a dongle.
我已经写了一个桌面软件,将通过串口与主板进行通信。
I hope that when the software sends commands to the board, the board could response accordingly. e.g. scan peer devices, connected to peer devices , etc. The firmware installed in the board could also discover the services and attributions of the peer device it connects to, and report these to the software on PC via serial port. It could also receive the notify data from the connected peer device and , again, report to the PC software.
我已经阅读了DSP示例,但它发现了对等设备并通过设备名称连接到给定的设备(在代码中预先给出!!!!)。所以你会帮我一个忙,为我写一个指导线吗?谢谢!
And I tried to modify the code in user_sps_host.c, the user_on_adv_report_ind function is modified as follows, and I also modified the user_on_scanning_completed function, in the purpose to stop scanning when obtained 5 devices.
void user_on_adv_report_ind(struct gapm_adv_report_ind const * param)
{
//获取设备名称
uint8 i=0,j=0;
uint8 len = sizeof(param-> report.data);
char dn [20] =“”;
for(i = 0; ireport.data [i]> = 0x20 && param-> report.data [i] <= 0x7e)
{
dn [j ++] = param-> report.data [i];
}
}
//获取设备地址
len = sizeof(param-> report.addr.addr);
char add_buffer[13]="";
j=0;
for(i = 0; ireport.adv_addr.addr [len - i - 1]);
添加缓冲区[j]=缓冲区[0];
add_buffer [j + 1] =缓冲器[1];
j = j + 2;
}
//获得rssi.
char rssi[3];
Sprintf(RSSI,“%D”,Param-> Report.RSSI);
//形成通过UART2发送到PC的数据包
char packet[44];
j=0;
数据包[j ++] ='*';
packet[j++]='D';
数据包[j ++] ='n';
packet[j++] = ':';
for(i=0; i<20; i++)
{
if(dn[i] != 0x00)
{
packet[j++] = dn[i];
}
}
数据包[j++]=',';
对于(i=0;i<13;i++)
{
如果(添加缓冲区[i]!=0x00)
{
packet[j++]=添加缓冲区[i];
}
}
数据包[j++]=',';
对于(i=0;i<3;i++)
{
如果(添加缓冲区[i]!=0x00)
{
packet[j++]=添加缓冲区[i];
}
}
数据包[j ++] ='\ r';
数据包[j ++] ='\ n';
// send the packet to the PC
printf_string(数据包);
}
void user_on_scanning_completed (uint8_t status)
{
设备计数++;
if(device_count <= 5)
{
user_scan_start();
}
其他的
{
用户_wait_for_cmd();
}
返回;
}
在这里,我添加了一个名为user \u wait \u for \u cmd()的函数,用于读取命令,实现如下,uart2 read completed回调用于调用user \u wait \u for \u cmd()。但是,程序出现了一个JLINK错误,即在CPU运行时不能读取寄存器。这个实现的问题是什么?
void user_wait_for_cmd(void)
{
uint8_t read_length = 25;
而(!阅读(成功)
{
uart2\u read((uint8\u t*)缓冲区,读取长度,uart2\u read\u completion\u cb);
}
}
博尔阅读成功;
void uart2_read_completion_cb(uint8_t status)
{
if(buffer[0]=='C'&&buffer[1]=='M'&&buffer[2]=='D')
{
read_success = true;
printf_string(buffer);
}
其他的
{
read_success = false;
用户_wait_for_cmd();
}
}
顺便问一下,在哪里可以买到DA14580的加密狗?
嗨wenkangl,
据我所知,它与专业开发工具包,我不认为是单独出售。关于您粘贴的代码的一些注释,我可以看到您正在计算在调用user \u on \u scanning \u completed()时发现的设备,这意味着您正在计算设备的扫描周期,每个扫描周期都会持续几秒钟,当您取消扫描过程或扫描操作完成时,会调用用户\u on \u scanning \u complete。每次设备获取新的广告字符串时,广告消息都会作为指示发送给用户\u adv\u report \u ind()。因此,为了计算扫描的设备数,您必须检查当前广告字符串的bd地址,并检查日志中的条目(保存记录设备的位置),然后在日志中放置新条目时进行计数。关于在应用代码进行读取时遇到的错误,我不认为是您的实现造成的,请检查设备的默认睡眠模式,并确保禁用了睡眠模式(不能同时启用和调试睡眠模式)。此外,您还必须考虑这样一个事实,即580休眠时,所有外围设备(包括UART)都断电,例如,DSP使用a流控制方案,以便在允许或不允许发送数据时向外部MCU发送信号,因为如果在580休眠时发送数据,它们将丢失。
谢谢mt_dialog.
谢谢mt,
关于这个话题我有更多的问题,因为我的目标不仅仅是计算附近的设备。
no1。在da1458x_config_basic.h中,睡眠模式已被配置为活动:
#undef CFG_MEM_MAP_EXT_SLEEP
#undef CFG\u MEM\u MAP\u DEEP\u睡眠
然后我向DB发送了一个扫描命令(CMD\u SCAN),固件调用了用户\u SCAN\u start(),并将函数运行到底。但是,在那之后,没有触发用户在报告上的用户,而且,当我发送连接命令(CMD\u CONNECT)时,程序名为user\u CONNECT\u to,但是用户在报告上的用户扫描完成,用户在连接上的用户没有触发。。。所以在这种情况下,我的实现有什么问题。
I have modified the function uart2_read_completion_cb as follows
Char Buffer [25];
静态UINT8_T UART2_READ_IN_POGRONGER = 0;
void uart2_read_completion_cb(uint8_t status)
{
if(buffer[0]=='C'&&buffer[1]=='M'&&buffer[2]=='D')
{
uart2\u read\u in\u progress=0;
printf_string(buffer);
action_on_command();
}
其他的
{
用户_wait_for_cmd();
}
}
void user_wait_for_cmd(void)
{
uint8_t read_length = 25;
uart2_read_in_progress = 1;
uart2\u read((uint8\u t*)缓冲区,读取长度,uart2\u read\u completion\u cb);
while(uart2读取进行中);
}
收到命令的行动如下
void action_on_command(void)
{
char cmdid [] = {buffer [4],缓冲区[5]};
uint8 CMD_ID = (uint8)strtol(cmdid,NULL,16);
uint8 hexdata[16]={0};
uint8 i = 7;
while(!(buffer[i]=='\\' && buffer[i+1]=='r'))
{
hexdata [I-7] =缓冲器[i];
i++;
}
开关(CMD\u ID)
{
case CMD\u扫描:
{
// 0x00
user_scan_start();
休息;
}
case CMD\u连接:
{
// 0x01
uint8对等地址[6]={0x00};
对于(i=0;i<6;i++)
{
char temp[] = { hexdata[2*i],hexdata[2*i+1] };
uint8 part_add = (uint8)strtol(temp,NULL,16);
peer_addr[5-i] = part_add;
}
user_connect_to(0x00,peer_addr);
休息;
}
}
}
user_connect_to如下
void user_connect_to(uint8_t peer_addr_type, uint8_t *peer_addr)
{
app_easy_gap_start_connection_to_set(peer_addr_type,peer_addr,ms_to_doubleslots(user_con_intv));
app_easy_gap_start_connection_to();
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二。然后我想到了另一个主意。也就是说,即使我解决了上述问题,它仍然不能令人满意。因为我希望DA14580至少可以异步处理两个任务,也就是说,它一直监视PC发送的命令(DA14580应该一直监视PC发送的命令),同时做其他事情。
For example, it monitors the command from PC while receiving notified data sent by a connected peripheral device and send the data to the PC.
另一个例子:当DB接收到通知数据时,我向DB发送停止通知命令。DB应停止上传接收到的通知数据,并将停止通知命令发送到连接的外围设备,并且连接的外围设备将相应地进行。
For this purpose, what should I do if I want to use the DSPS project? ps: the question is focus on the central end (dongle), the task for the peripheral end has already been done. ^_^
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
no3。由于加密狗没有单独出售,您是否可以推荐一个适用于DA14580的人?ConnectBlue?
谢谢!
嗨wenkangl,
NO1:您更改的定义会影响设备的内存映射,而不会影响睡眠模式(在上面的“睡眠模式内存映射配置”注释中提到),要更改默认睡眠模式,您必须在关闭ARCH\u Sleep\u的情况下更改user\u config.h文件中的app\u default\u Sleep\u mode,这就是JLink在调试模式下几秒钟后报告错误的原因。关于没有触发\u adv \u report \u ind上的用户\u这一事实(我假设您正试图通过使用断点捕获广告指示),如果新的扫描过程确实已经启动,那么您将无法通过断点捕获该广告事件,因为调试器已从580中解除连接。请检查以上,如果您确实禁用了sleep,并且从UART发送相应命令时调用了正确的函数,请检查广告设备是否确实在广告并且可以接受连接。
No3:从对话框提供的加密狗不是通用的加密狗,您可以连接到Windows机器并被识别为蓝牙模块,它只是一个580,带有Atmel微控制器,用作USB端口的桥梁,仅接受UART命令通过GTL(Propriale Protocol)。我怀疑一般的BLE模块是您想要的,虽然我无法提出建议,但我想支持支持4.0规范的任何BLE加密狗,但在我们使用的大多数应用程序(测试)中我们正在使用Android雷竞技安卓下载手机。
NO2: The DSPS example monitors the UART and serves the DSPS_TASK (send notifications and accept write commands from the central). When data are available in the UART an interrupt occurs the ISR is executed and the code takes care of the FIFO of the UART and handles the data properly, it doesn't poll the UART to consider this an additional task. You can study this implementation as an example.
谢谢mt_dialog.
谢谢,山
as for NO2, is the ISR you mentioned is UART2_Handler(void) in uart2.c and the DSPS_TASK for data received is uart2_rec_data_avail_isr? if so, where should I put the action_on_command() I defined ? do you mean that I should modify uart2_rec_data_avail_isr directly?
can you explain more on the DSPS_TASK ?
非常感谢!
当我阅读代码,我发现art2_env.rx.callback is assigned in uart2_read, and when RECEIVED_AVAILABLE the uart2_rec_data_avail_isr() is executed and the defined callback is executed. and then in uart2_rec_data_avail_isr() the callback pointer will be cleared. if my understanding is right? if so, does it mean that I need to call uart2_read to get the command received, rather than I send a command on PC and the action_on_command() is called?
嗨wenkangl,
DSP和实现的脱胶机制使用不同的UART(580中有两个相同的UART模块),因此每个UART都有单独的ISR处理程序。如何处理您的中断和数据,这取决于您的应用程序以及您想要实现它的方式。关于DSPS_Task(Task_sps_server更加确切)是DSPS设备的配置文件任务,您可以在UM-B-038串行端口服务应用程序文档中找到更多信息。
是的,您的理解是正确的,在UART2获取数据上的数据后,您将清除回调,您只需调用UART2_READ()即可继续执行任何您正在做的事情,并且当您在UART中获取数据时,中断将继续进行中断,当您达到您的数据的大小时,您的回调(在调用UART读取时设置的一个)将被调用并通知您所指定的数据已到达,并且将禁用UART中断。这意味着如果您的命令具有指定大小,则可以在等待它时设置每个命令的大小,或者您可以指定将读取第一个字节作为命令大小的命令格式(读取一个字节为大小)和然后根据该特定大小命令设置回调,或者您可以始终等待一个字节并等待命令的终端字符(指示命令结束),有相当少的选项如何实现这一目标但是我在上面提到的,这取决于你希望如何实现的方式。
谢谢mt_dialog.
谢谢mt,
因此要监视UART,我必须经常调用UART2_READ(),并且我的解决方案到数据包的大小是这样,我使用固定的长度分组(25如代码中所示),并且该命令将是预先的- 处理使其始终为25(在数据包的末尾添加0,因此它的长度为25)。我正试图得到中央工作。