嗨对话框,
我正在尝试编写一个固件,使开发套件板(基本)是一个加密狗。
我已经写了一个桌面软件,将通过串口与板通信。
我希望当软件向电路板发送命令时,电路板可以相应地响应。例如扫描与对等设备连接的对等设备等。计算机中安装的固件还可以发现它连接的对等设备的服务和归属,并通过串行端口向软件报告它们。它还可以从连接的对等设备收到通知数据,然后再次报告到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的数据包
char packet [44];
j = 0;
数据包[j ++] ='*';
数据包[j ++] ='d';
数据包[j ++] ='n';
数据包[j ++] =':';
for(i = 0; i <20; i ++)
{
if(dn [i]!= 0x00)
{
包[j ++] = dn [i];
}
}
数据包[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(数据包);
}
void user_on_scanning_Completed(UINT8_T状态)
{
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;
void 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;
void 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);
}
收到命令的行动如下
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;
虽然(!(缓冲区[i] ==''\\'&& buffer [i + 1] =='r'))
{
hexdata [I-7] =缓冲器[i];
I ++;
}
切换(CMD_ID)
{
case cmd_scan:
{
// 0x00.
user_scan_start();
休息;
}
case cmd_connect:
{
// 0x01
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 [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();
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
no2。然后我想出了另一个想法。也就是说,即使我解决了上述问题,它仍然无法满足。因为我希望DA14580可以异步地处理至少两个任务,即它不断监视从PC发送的命令(并且DA14580应始终监视PC发送的命令),同时执行其他操作。
例如,它监视PC的命令,同时接收连接的外围设备发送的通知数据并将数据发送到PC。
另一个例子:当DB接收到通知数据时,我向DB发送停止通知命令。DB应停止上传接收到的通知数据,并将停止通知命令发送到连接的外围设备,并且连接的外围设备将相应地进行。
为此目的,如果我想使用DSP项目,我该怎么办?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:DSP示例监视UART并服务于DSPS_TASK(发送通知并从中中心接受写入命令)。当数据在UART中可用时,发生ISR的ISR并且代码处理UART的FIFO并正确处理数据,它不会轮询UART考虑此额外任务。您可以作为示例研究此实现。
谢谢mt_dialog.
谢谢,山
至于NO2,是您提到的ISR是UART2.c中的uart2.cher(void),以及收到的数据的dsps_task是uart2_rec_data_avail_isr?如果是这样,我应该在哪里放置我定义的action_on_command()?你的意思是,我应该直接修改UART2_REC_DATA_AVAIL_ISR吗?
你能在DSPS_TASK上解释更多吗?
非常感谢!
并且当我通过代码读取时,我发现UART2_ENV.RX.Callback被分配在UART2_READ中,并且当接收时,执行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)。我正试图得到中央工作。