大家好,
我现在正在使用SDK 5.0.4处理DA14580 BLE模块,无法通过arch_printf命令发送0。
发送0时,FW跳转到第141行的hardfault_handler.c文件并停留在那里。
if((GetWord16(SYS\u STAT\u REG)&DBG\u向上)==DBG\u向上)
__asm(“BKPT#0\n”);
任何帮助都会很好。
关键词:
设备:
嗨,耶胡达诺沃德斯,
我试图复制你提到的问题,但我能够通过arch_printf()发送“0”。我在SDK 5.0.4的ble_app_barebone例子中工作,我使用的是Pro-DK。我来描述一下我做了什么确保你们做了相同的构型。
#elif HW_配置_PRO_DK
#定义UART2\U TX\U GPIO\U端口GPIO\U端口0
#定义UART2_TX_GPIO_PIN GPIO_PIN_4
#定义UART2\U RX\U GPIO\U端口GPIO\U端口0
#定义UART2\U RX\U GPIO\U引脚GPIO\U引脚5
如果您有我们的另一个DK,或者您在定制板上工作,请使用适当的GPIO修改上述定义
如果我理解错了什么,请告诉我您想要完成什么,或者提供给我热调用arch_printf()到您的代码中。
谢谢,下午好
抱歉说得不够清楚。
是的,我可以通过arch_printf发送0。
问题是当我试图通过UART回显输入时。如果插入的其中一个字节是0x00,那么当我试图打印包含该字节的数组的元素时,就会出现此错误。我认为原因是0不认为是“值”,所以当我试图打印它时,它找不到打印的东西,因此错误。
我又检查了一下这个问题,我想我确定现在的问题是什么。
我使用arch_printf函数打印数组。例如,如果数组的内容是:
示例arr[2]={0x01,0x02};
我想逃跑
arch_printf(示例arr);
打印出来的是01,02,这正是我想要的。当ExampleArr的第一个元素为0x00时,问题开始出现,然后软件运行到
if((GetWord16(SYS\u STAT\u REG)&DBG\u向上)==DBG\u向上)
__asm(“BKPT#0\n”);
错误。
如果第二个元素是0x00,则没有问题。
当我试图使用arch_printf打印0像这样:
ExampleVar=0;
arch_printf(“%x”,示例变量);
没有错误,但实际上打印的是ASCII值0,也就是30。我需要打印0值,而不是符号…
嗨,耶胡达诺沃德斯,
您能试一下这段代码吗?
uint8_t ExampleArr[3] = {0x00, 0x01, 0x02};
对于(uint8_t i=0;i<3;i++)
{
arch_printf(“%x”,示例arr[i]);
}
arch_printf(“\n\r”);
否则,请提供您的代码片段,因为您正在使用它到您的固件。
谢谢,下午好
你好
正如我提到的,arch_printf函数通过地址arch_printf(ExampleArr)而不是值arch_printf(ExampleArr[I])获取要打印的数组。更清楚地说,如果我有一个名为ExampleVar=0x01的变量,那么写入arch\u printf(&ExampleVar)的结果是1,打印在终端上,但如果ExampleVar=0x00,则arch\u printf(&ExampleVar)的结果是错误!!
我没有使用您的方法的原因是输出的值不是实际值,而是它的ASCII兼容。所以,如果我回到我之前的例子,这是它在两种情况下的样子:
1)
ExampleVar=0x01;
arch_printf(&ExampleVar);
打印输出为:1
ExampleVar=0x00;
arch_printf(&ExampleVar);
打印出来的是:错误
2)
ExampleVar=0x01;
arch_printf(“%x”,示例变量);
打印日期:31
ExampleVar=0x00;
arch_printf(“%x”,示例变量);
打印日期:30
我真希望问题现在已经弄清楚了。
嗨,耶胡达诺沃德斯,
很抱歉耽搁了。我试图测试您的代码,这段代码片段arch_printf(&ExampleVar)不能由Keil构建。这是一个相当奇怪的情况,因为如果我理解正确,这可以从你的方面构建。而且,我的结果和你的不一样。请查看以下内容:
ExampleVar=0x01;
arch_printf(“%x”,示例变量);
输出结果为:1(而不是31,它是ASCII字符1)
ExampleVar=0x00;
arch_printf(“%x”,示例变量);
打印输出为:0(而不是0的ASCII字符30)
如果您修改了arch_printf()函数的源代码,请告诉我?您可以尝试在新的SDK路径中执行相同的操作吗?请注意,我使用的是D14580系列(SDK5.0.4)的最新SDK
谢谢,下午好
你好
不,我根本没有修改你的arch_prinf源代码。
但我有一个更好的解决办法。打印数组的值在任何位置,我只是使用了uart2_write (arr *,大小,NULL)函数,当* arr打印数组的指针,印刷尺寸大小,以字节为单位,和零是空指针,需要描述的功能。
嗨,耶胡达诺沃德斯,
因为您没有修改arch_prinf()函数,所以有点奇怪,因为我得到的结果与您的不同。顺便说一句,很高兴你解决了你的问题,这是你的指示。
谢谢,下午好
亲爱的论坛专家,
我正在使用sdk5.0.4开发DA14580。
我想知道主机如何从从机接收SMP请求。
我已经运行了我的代码,在下面附加,嗅探从机,但是在用户函数中没有回调。
好像是无效的?
主机如何从从机接收SMP请求?
由于advcance,
酒神
嗨,狄俄尼索斯,
谢谢你的问题,但它与这个论坛线程无关。如果我理解正确的话DA14580是一个中心。由于您是中心服务器,因此不能向外设请求安全性。如果您有任何其他后续问题,请创建一个新的论坛线程。如果你不知道如何创建一个新的论坛帖子,请让我知道,我会为你提供适当的步骤。
谢谢,下午好
嗨YehudaNovodes,
你可以试试我的代码,它可以发送十六进制,如下:
外部无效uart_回调(uint8_t res);
uint8_t数据=0x00;
uart2_写入(和数据,1,uart_回调);
陈蓬莱你好,,
谢谢你的指点。
问候,PM_DIalog