嗨对话框,
我试图写一个固件,使开发工具包板(基本)一个适配器。
我已经写了一个桌面软件,将通过串口与板通信。
我希望当软件向板子发送命令时,板子能做出相应的响应。例如扫描对等设备,连接到对等设备等。安装在板上的固件也可以发现所连接的对端设备的服务和属性,并通过串口报告给PC上的软件。它还可以从连接的对端设备接收通知数据,并再次向PC软件报告。
我已经阅读了DSP示例,但它发现了对等设备并通过设备名称连接到给定的设备(在代码中预先给出!!!!)。所以你会帮我一个忙,为我写一个指导线吗?谢谢!
我尝试修改了user_sps_host.c中的代码,修改了user_on_adv_report_ind函数如下,也修改了user_on_scanning_completed函数,目的是在获得5台设备时停止扫描。
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]);
add_buffer [j] =缓冲器[0];
add_buffer [j + 1] =缓冲器[1];
j = j + 2;
}
//获得rssi.
char rssi [3];
Sprintf(RSSI,“%D”,Param-> Report.RSSI);
//形成通过UART2发送到PC的数据包
炭包[44];
j = 0;
数据包[j ++] ='*';
数据包[j ++] ='d';
数据包[j ++] ='n';
包[j ++] = ':';
(我= 0;我< 20;我+ +)
{
如果(dn[我]! = 0 x00)
{
包[j + +] = dn(我);
}
}
数据包[j ++] =',';
for(i = 0; i <13; i ++)
{
if(add_buffer [i]!= 0x00)
{
数据包[j ++] = add_buffer [i];
}
}
数据包[j ++] =',';
for(i = 0; I <3; I ++)
{
if(add_buffer [i]!= 0x00)
{
数据包[j ++] = add_buffer [i];
}
}
数据包[j ++] ='\ r';
数据包[j ++] ='\ n';
//发送数据包到PC
printf_string(数据包);
}
无效user_on_scanning_completed (uint8_t status)
{
device_count ++;
if(device_count <= 5)
{
user_scan_start ();
}
别的
{
user_wait_for_cmd();
}
返回;
}
这里,我添加了一个名为user_wait_for_cmd()的函数,该函数用于读取命令,并且如下实现,并且UART2读取完成的回调用于调用user_wait_for_cmd()。但是,该程序提出了JLINK错误,表示CPU正在运行时无法读取寄存器##。这项实施有什么问题?
void user_wait_for_cmd(void)
{
Uint8_t read_length = 25;
while(!read_success)
{
UART2_READ((UINT8_T *)缓冲区,READ_LENGTH,UART2_READ_COMPLETION_CB);
}
}
BOOL READ_SUCCESS;
空白uart2_read_completion_cb (uint8_t状态)
{
if(缓冲区[0] =='c'&& buffer [1] =='m'&& buffer [2] =='d')
{
read_success = true;
printf_string(缓冲);
}
别的
{
read_success = false;
user_wait_for_cmd();
}
}
顺便问一下,我可以在哪里买一个DA14580的加密狗?
嗨wenkangl,
据我所知,它与Pro-Dev套件一起,我不认为这是一个单独出售的。关于您粘贴的代码的一些评论,我可以看到您正在计算在调用user_on_scanning_completed()时发现的设备,这意味着您正在计算设备的扫描周期,每个扫描周期持续几秒钟当您取消扫描过程或扫描操作完成时,请调用user_on_scanning_Complete。广告消息每当设备获取新的广告字符串时都会向user_on_adv_report_ind()表示指示。因此,为了计算扫描设备,您必须做的是检查当前广告字符串的BD地址并检查日志中的条目(您保留录制的设备的位置)并在放置新条目时计算在您的日志中。关于应用代码进行读取时的错误,我不认为您的实现对其负责,请检查设备的默认休眠模式,并确保禁用睡眠模式(您不能启用睡眠模式并在同一时间调试)。此外,您还必须考虑580当它睡觉时,所有外围设备都被断电,包括UART,例如,DSP使用流量控制方案,以便在其允许发送数据时发信号通知外部MCU,自从第580次睡眠时发送数据以来,他们将丢失。
谢谢mt_dialog.
谢谢mt,
我对这一主题有更多的问题,因为我的目标不仅仅是在附近计算设备。
no1。在da1458x_config_basic.h中,睡眠模式已被配置为活动:
# undef CFG_MEM_MAP_EXT_SLEEP
#undef cfg_mem_map_deep_sleep.
然后我向DB发送了扫描命令(cmd_scan),固件确实调用user_scan_start()并运行函数到结尾。但是,在此之后,user_on_adv_report_ind未触发,而且,当我发送了连接命令(cmd_connect)时,程序名为user_connect_to但user_on_scanning_completed和user_on_connection的程序未触发......所以在这种情况下,我的错误执行。
我将函数uart2_read_completion_cb修改如下
Char Buffer [25];
静态UINT8_T UART2_READ_IN_POGRONGER = 0;
空白uart2_read_completion_cb (uint8_t状态)
{
if(缓冲区[0] =='c'&& buffer [1] =='m'&& buffer [2] =='d')
{
uart2_read_in_progress = 0;
printf_string(缓冲);
action_on_command ();
}
别的
{
user_wait_for_cmd();
}
}
void user_wait_for_cmd(void)
{
Uint8_t read_length = 25;
uart2_read_in_progress = 1;
UART2_READ((UINT8_T *)缓冲区,READ_LENGTH,UART2_READ_COMPLETION_CB);
而(UART2_READ_IN_POGRONGER);
}
收到命令的行动如下
空白action_on_command(空白)
{
char cmdid [] = {buffer [4],缓冲区[5]};
uint8 CMD_ID = (uint8)strtol(cmdid,NULL,16);
uint8 hexdata [16] = {0};
Uint8 I = 7;
而(!(缓冲区(我 ]=='\\' && 缓冲(i + 1) = = ' r '))
{
hexdata [I-7] =缓冲器[i];
我+ +;
}
切换(CMD_ID)
{
case cmd_scan:
{
/ / 0 x00
user_scan_start ();
休息;
}
case cmd_connect:
{
/ / 0 x01
uint8 peer_addr [6] = {0x00};
for(i = 0; i <6; i ++)
{
Char temp[] = {hexdata[2*i],hexdata[2*i+1]};
uint8 part_add = (uint8)strtol(temp,NULL,16);
peer_addr[我]= part_add;
}
user_connect_to(0x00,peer_addr);
休息;
}
}
}
user_connect_to如下
无效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();
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
no2。然后我想出了另一个想法。也就是说,即使我解决了上述问题,它仍然无法满足。因为我希望DA14580可以异步地处理至少两个任务,即它不断监视从PC发送的命令(并且DA14580应始终监视PC发送的命令),同时执行其他操作。
例如,它监视来自PC的命令,同时接收由连接的外围设备发送的通知数据,并将数据发送到PC。
另一个例子:当DB接收到通知数据时,我向DB发送停止通知命令。DB应停止上传接收到的通知数据,并将停止通知命令发送到连接的外围设备,并且连接的外围设备将相应地进行。
为此,如果我想使用DSPS项目,应该怎样做?Ps:问题是集中在中心端(软件狗),外围端的任务已经完成。^ _ ^
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
no3。由于加密狗没有单独出售,您是否可以推荐一个适用于DA14580的人?ConnectBlue?
谢谢!
嗨wenkangl,
no1:您已更改的定义会影响设备的内存映射而不是睡眠模式(其在上面的注释中提到的“睡眠模式内存映射配置。”),更改您必须更改app_default_sleep_mode的默认休眠模式使用Arch_sleep_off的user_config.h文件,这是您在调试模式下几秒钟后jlink报告的错误的原因。关于user_on_adv_report_ind未触发的事实(我想通过使用断点来捕获广告指示),如果确实新的扫描程序已启动,则无法通过调试器以来的断点捕获该广告事件从您的580中取消附加。请检查上面,如果您已禁用休眠状态,并且当广告设备实际上是广告并可接受连接时,当您从UART发送相应的命令时调用适当的功能。
No3:从对话框提供的加密狗不是通用的加密狗,您可以连接到Windows机器并被识别为蓝牙模块,它只是一个580,带有Atmel微控制器,用作USB端口的桥梁,仅接受UART命令通过GTL(Propriale Protocol)。我怀疑一般的BLE模块是您想要的,虽然我无法提出建议,但我想支持支持4.0规范的任何BLE加密狗,但在我们使用的大多数应用程序(测试)中我们正在使用Android雷竞技安卓下载手机。
NO2: DSPS示例监视UART并为DSPS_TASK服务(发送通知并接受来自中央的写命令)。当数据在UART中可用时,一个中断发生,ISR被执行,代码负责UART的FIFO并正确处理数据,它不会轮询UART来考虑这是一个额外的任务。您可以将此实现作为一个示例进行研究。
谢谢mt_dialog.
谢谢,山
至于NO2,你提到的ISR是uart2.c中的UART2_Handler(void),收到的数据的DSPS_TASK是uart2_rec_data_avail_isr吗?如果是,我应该把我定义的action_on_command()放在哪里?你的意思是我应该直接修改uart2_rec_data_avail_isr ?
你能解释更多关于DSPS_TASK吗?
非常感谢!
当我通读代码时,我发现uart2_env.rx。在uart2_read中分配回调,当RECEIVED_AVAILABLE时执行uart2_rec_data_avail_isr(),并执行定义的回调。然后在uart2_rec_data_avail_isr()中,回调指针将被清除。如果我的理解是正确的?如果是,这是否意味着我需要调用uart2_read来接收命令,而不是在PC上发送命令并调用action_on_command() ?
嗨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)。我正试图得到中央工作。