ti的工程师及各位大神:
我现在遇到一个问题,主机使用GATT_WriteLongCharValue向从机发送50字节的数据,从机端应该怎么接收(也就是说从机在哪里取到主机发过来的数据)
rivers li:
hello
首先是,GATT_WriteLongCharValue的第一个参数问题,你发的是哪个characteristic,假如是characteristic 1 那么进入peripheral的simpleProfileChangeCB()这个函数中,有个switch,进入相应的case,你使用SimpleProfile_GetParameter( SIMPLEPROFILE_CHAR1, newValueBuf );就将你的数据接收到newValueBuf中了,之后可以对这个数组进行处理。
我有个问题哈,你要使用GATT_WriteLongCharValue发50个字节的话,一次发不了吧,那个函数只能一次发送20个字节的数,我的程序就是在这边卡主了,然后我就想到要组包发送,但是发现连续的调用GATT_WriteLongCharValue这个函数只能响应一次,求解答~
Jone Chen:
回复 rivers li:
hi,rivers
我今天又试了一下,GATT_WriteLongCharValue发50个字节,一次确实发不完,它是这样执行的,每次发20字节,其中前两个字节像是偏移量offset,后18个字节为你要发的字节,也就是说,50个字节,它会分三次(18+18+14)发送,offset分别为0,18,36。。。接着从机那一端,也是根据offset也要分三次写入。。。。。。
不知道这样理解是否正确,有没有高手回答一下?
rivers li:
回复 Jone Chen:
你好chen:
我想问下偏移量的问题,offset是0,18,36,那么offset在什么地方设定呢。这样吧,假如我要发生50个0x5a,那么将偏移量放到数据的哪儿呢~
我这边卡主挺长时间了,一直不是很理解。
0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a //18个
0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a //18个
0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a 0x5a //14个
我要把偏移量放在哪呢?
Jone Chen:
回复 rivers li:
hi rivers:
当使用WriteLongCharValue时,需要设置一个初始的offset,一般直接设为0,还是以发送50byte为例,在发送过程中WriteLongCharValue会自动将50byte分成18+18+14来发送,在这发送的同时也会分别生成offset为0,18,36;;;;然后到从机这边,也是它自动分三次去写也就是三次执行WriteAttrCB(),在WriteAttrCB()的参数中你会发现也有一个offset,这个offset就是上面说的生成的offset,所以你就需要利用这个offset去把这收到的50byte写进去。。。。不知这么说你是否明白?
rivers li:
回复 Jone Chen:
hi chen
谢谢,那我看看,自己调试一下~
rivers li:
回复 Jone Chen:
老大哈~
我自己做了下,但是现在的效果是可以连续发生,但是检查收到的数据,发现收到的数据只有前18个,你说的那个writeattrcb那个函数怎么更改offset哈~
求指点~
rivers li:
回复 Jone Chen:
同志们哈
谁知道offset那边怎么改哈,我好晕啊!!!!
waiting:
回复 rivers li:
请问一下,你是如何接受到50个字节的,我只能收到第一个包的18个字节,是不是要在从机端做什么处理?