完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
当我试图向GATT写一些价值时,我遇到了一个非常奇怪的问题。基本上我有一个链接的事件列表。我试图遍历整个列表并把每个值发送给我的智能手机。
奇怪的是: 我的BLE设备只发送10个通知呼叫。例如,在我的智能手机上为单个事件输出的是时间戳、用户代码和用户ID。看起来像这样: 2007—03-01T13:00:20VS2D9F036A1T13G21JM0 所以,如果我尝试多说4个事件,输出应该是这样的: 2007—03-01T13G21J21JM0720013021T13:00:20VS2D9F036A1T13G21JM1,2007—03-01T13:00:20VS2D9F036A1T13G21JM2,2007—03-01T13:00:20VS2D9F036A1T13G21JM3 然而,我在智能手机上所收到的全部信息是: 2007—03-01T13:00:20VS2D9F036A1T13G21JM02007 03-01T13:00:20VS2D9F036A1T13G21JM1,2007—03-01T13:00:20VS2D9F036A1T13G21JM2,2007—03-01T13:00∶20 这是我的函数,它通过我的链表循环,并把数据发送到一个要打印的函数: /**打印所有当前记录的事件。*/ValuePrimeStudio(){ UARTHUUTARTPUSTORD(“打印事件”); /获取链表结构事件的第一个项目: /或计数器加载,并确保我们正在/通过我们的整个链表。计数器=0; /通过链表运行。我打印出所有//TEMP的值,以确保每个项/ /正在完全循环。这将正确地打印出所有数据到UART。(临时)!{NULL){ /更新我们的计数器+ +; //打印所有数据到UART以验证UARTHARUTARTPUTHEPT字符串(“ω”);UARTHARUARTPATSHIFT字符串(TEMP->tiME);UARTURUUARTPATSHIPE字符串(TEMP->Name);UARTHUARUARTPUTHOT字符串(TEMP-GT;USEID);UARTHARUARTARPTESTRONT(“γ”); /将我们的事件发送到智能手机PRTENTEVER(TEMP); //移动到列表TEMP= TEMP-GT的下一个项目; } //将我们的计数器转换成可以打印到UART CHAR*STR=MALLC(16)的东西;SNPRTNF(STR,16,“%D”,计数器); /正确地打印出4个应该是…UARTHUUARTPATSHIFT(“计数器=”);UARTHUARUTARPTESTROST(STR); 自由(STR); UARTHUUART字符串(“完成打印”); //我们的终止值,所以应用程序知道它可以开始解析数据。如果队列中有3个以上的事件,则永远不会达到这一点。StEdValeToGoTaT((UTI8*)”---,SIZEOF(“-----”); } 非常漂亮。在上面的代码中,所有来自链表的数据都在UARTcorrectly发送和打印。因此,我知道整个列表正在运行。以下是我的公关功能: /**打印出单个事件。一个起始位和结束位也将被发送。 “PARAM事件”是指向需要发送的事件的指针。*/ValuePrTunEnter(StuttEngult*事件){StEnvestEtogAtt((Unt8*)&事件:&时间,sieOf(事件& GT;时间));StordValueGOATT((UTI8*)和事件-GT;名称,SIZEOF(事件-GT;名称));StordValueGOATT((UTI8*)和事件-GT;USEID,SIZEOF(事件-GT;USERID)); 这里是我的StordValueGoATT函数: /**将GATT配置文件上的给定值发送到所连接的设备。 @ PARAM值将发送一个uTI8Cube值:PARAM大小被传递的值的大小。通常用“sieof”来询问。*/ValueSunValueToGATT(UTI8*ValueUnt16大小){CyLyxGATSH-HealLayValueEntfft TimePANDEL3; TyPHANDEL3.CAPSENSEXARCHARER句柄;TEMPANDEL3.Value.Val=值;TEMPANDEL3.Value.Le=大小;CyLay-GATScript WrreAdvestTalk值(&;TEMPANDLE 3,0,和CyByLyCon句柄,CyByLyGATTHYBJBROLARYLY启动);CyBLY-GATS通知(CyByLyCon句柄,and MaPhandLe3);} 我真的不知道为什么只有10个交易MAX正在发生?这是一种时间阈值吗? |
|
相关推荐
10个回答
|
|
|
GATT通知不能保证到达(对于这样的通知,有不同的呼叫)。它也可能被接收器吞咽(例如,当处理时间太长)时,我想。
IIRC有一个单独的呼叫来确保通知的传递(或者至少当它未被传递时得到通知),但是我现在记不起来它是如何调用的。 |
|
|
|
|
|
通知应在正常情况下传递,但您似乎没有检查CyBygGATSnNoTIFICTION()调用的返回值。这就是我开始故障排除的地方,除非这个API调用返回成功代码(0),否则不要继续进行下一个分组。
堆栈具有有限的缓冲空间来传输任何类型的数据包,链路层协议不能比每12.5毫秒更快地发送任何数据包。我怀疑您正在很快地填充缓冲器,然后所有后续尝试失败。 此外,请注意,如果只需要将数据推送到远程客户端,就不需要CyBygGATScript AtestTealValueAudio()API调用。如果需要在RAM中保存最新值的本地副本,则可以保留该函数调用;将其留在那里不会有任何伤害,但如果您不需要更新服务器上的本地副本,则可以将其取出。 |
|
|
|
|
|
非常感谢你的回复!你有没有链接到一些关于如何检查CybulgGATSnNoTIFICTION()的返回值的文档,我很难在这上面找到任何东西。
|
|
|
|
|
lxhzx 发表于 2019-10-31 11:32 我抓到了。我想的另一个选择是为每一个需要发送的数据创建一个不同的服务。为时间、价值、日期服务。你对这个方法有什么想法吗? |
|
|
|
|
|
CyyBuffGATSnNoTrimeCuffic()API方法具有CyByLyApIIReultTyt的返回类型,并且可以在BLE组件数据表(PDF)或API文档(上下文敏感帮助文件)中找到关于其预期的可能返回值的文档。您可以通过右键单击PSoC Creator内部的示意图中的BLE组件来访问其中之一,然后单击相关菜单项。
在你的情况下,你可能想做如下的事情: 当(CyByLyGETSTATE())= CyByLyStayEx连接和& CyByLyGATS通知(CyByLyCon句柄,and MePhandLe3)!{CyByrErrRoxOK){/*重试,直到成功*/CyByLePraceSeScript();} 这是一个阻塞循环,但在你的情况下可能是合适的,因为没有办法让数据传输更快,而你(大概)不能跳过任何数据。 关于您提出的不同关贸总协定结构,这种方法没有效率优势。无论如何,如果你已经将这些数据块分割成单独的通知包,这将不会造成任何伤害,但是没有办法并行发送多个数据包。您仍然需要按顺序推送通知。这就是说,如果它有助于客户端或服务器端实现的逻辑代码布局,而不是试图压缩每一个吞吐量的最后一点,那么您可以使用任何GATT结构对设计者来说是最有意义的。 就个人而言,我喜欢保持GATT结构尽可能简单,而不会导致不合理的结构(例如,不相关的数据被塞进一个单一的特征)。最好的效率来自于将输出数据包填充到MTU限制,通常每个通知20字节。 |
|
|
|
|
|
为什么不创建一个服务,它的属性都有三个值作为字段?这样你就可以用一个写调用发送一个事件。 或者,您可以创建一个较大数组的属性,并同时发送多个值(例如每秒一次)。 |
|
|
|
|
|
我想你的意思是我应该更新这个方法看起来像下面这样:
空StEnvestEtoGATT(UTI8*ValueUnt16大小){ CyLay-GalsStAdLoLyValueNtfft TEMPANDEL3;TEMPANDEL3.THACKHANDER = CyByLeDelcPysSeCopnSexCARIGA句柄;TEMPANDEL3.Value.Val=值;TEMPANDEL3.Value.Le=大小; 当(CyByLyGETSTATE())= CyByLyStayEx连接和& CyByLyGATS通知(CyByLyCon句柄,and MePhandLe3)!= CyBelyErrRoxOK){ 聚伞花序; } 尝试以上,我只能发送1完整的事件,然后它陷入在循环永远?我已经能够记录CyByHyrRoSuffiDILO操作的错误。我想,如果它是一个记忆,也许它不会返回一个CyByError RealMyMyLyLyOffice失败吗? |
|
|
|
|
stwjt 发表于 2019-10-31 13:02 嗯,看看你的其余部分一直到最外面的函数调用,它看起来像CyByLePraceSeXVScript(),而不是在CybLyGATStNoTIFICTION()失败的情况下被定期调用。我建议改变一下…循环做ADO {…}同时()循环,以使CyByLoPraceSeSvs.()的循环体每次尝试发送通知时至少执行一次。 你也可能想通过这个论坛帖子来了解一个潜在的相关问题: HTTP://www. CyPress .COM/FUMU/PROCE-BLASE/BUST-BLE通知 |
|
|
|
|
柱子图宁 发表于 2019-10-31 13:21 因此,通过这样做,我能够得到几乎所有数据的原始输出: 做{ 聚伞花序; }(CyBLyGETSTATE()= = CyByLyStayEx连接和& CyByLyGATS通知(CyByLyCon句柄,and MePhandLe3)!= CyByrErrRoRooKo&&(CysLygGATGETBUSTSTATUS()==CyLyth-StaskStAtEsi-Fiel-Field); 但它还没有全部通过:(我甚至尝试添加延迟,正如你提到的帖子中提到的,它仍然不起作用。我感觉我们离得很近!! 因此,我以100毫秒的延迟添加了一个想法,即每个值将以100毫秒的间隔发送。然而,似乎前3个数据点是延迟发送的,然后一个大的块被传递……不确定这是否意味着什么。 |
|
|
|
|
柱子图宁 发表于 2019-10-31 13:21 所以我能让它起作用……但我不知道为什么它会起作用。我改变了我的主要方法循环看起来像这样: 插入位置=0; 对于(;;){if(CyLaygGATGETBuSTATUSSUE)= = CyLythStaskStaseEnFiel&As&EssDunEngEngs&&TAMP!{NULL){ 如果(CurrestsEndoSt==0){sEndoValeToGATT((Unt8*)and Timp & Gt;time,sieOf(TEMP->Time));CurrrnsEndoSt+++;}否则(CurrutsEndoSt==1){sDealEvtoGoTATT((Unt8*)& TAMP & Gt;name,sieOf(TEMP-GT;name));CurrrnsEndoSt+++;}否则(CurrthsEndoSt==2){StEnvestEtogATT((Unt8*)&;TAMP & Gt;USEID,SIEZOF(TEMP-GT;USERID));CurrrnsEndoSt==0;TEMP= TEMP->NEXT;} 如果(TEMP= NULL){sDealValeToGATT((UTI8*)”---“,SIZEOF(“-----”));} CyByLePraceSeScript(); 否则{CyByPro SeaServEx();} CysLyEnLIPPM(CyBLyBLISSH DeSLIM); 我真的不知道为什么这对我的其他方法工作,但它如此高兴哈! |
|
|
|
|
只有小组成员才能发言,加入小组>>
787个成员聚集在这个小组
加入小组cyUSB3014一直显示2.1,不能到3.0情况,谁遇到过
7315 浏览 0 评论
2484 浏览 1 评论
2178 浏览 1 评论
4042 浏览 1 评论
请问可以直接使用来自FX2LP固件的端点向主机FIFO写入数据吗?
2087 浏览 6 评论
CY8C4025LQI在程序中调用函数,通过示波器观察SCL引脚波形,无法将pin0.4(SCL)下拉是什么原因导致?
7804浏览 2评论
CYUSB3065焊接到USB3.0 TYPE-B口的焊接触点就无法使用是什么原因导致的?
6367浏览 2评论
CX3连接Camera修改分辨率之后,播放器无法播出camera的画面怎么解决?
757浏览 2评论
729浏览 2评论
使用stm32+cyw43438 wifi驱动whd,WHD驱动固件加载失败的原因?
8210浏览 2评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-12 04:32 , Processed in 1.957794 second(s), Total 91, Slave 74 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
5535