一個(gè)CH582M作為主機(jī),另一個(gè)CH582M作為從機(jī)。主機(jī)上電后主動(dòng)連接從機(jī),可以連接成功,連接成功后主機(jī)每隔50ms向從機(jī)寫一條數(shù)據(jù),從機(jī)接收到數(shù)據(jù)后把處理的結(jié)果以通知的形式返回給主機(jī)。測(cè)試的時(shí)候,經(jīng)常會(huì)出現(xiàn)連接斷開,或者主機(jī)打印Write Err:1。請(qǐng)問(wèn),該怎么處理?
????????????????req.pValue[0] = 0x3E;
? ? ? ? ? ? ? ? req.pValue[1] = 0x00;
? ? ? ? ? ? ? ? req.pValue[2] = 0x00;
? ? ? ? ? ? ? ? req.pValue[3] = 0x10;
? ? ? ? ? ? ? ? req.pValue[4] = 0x0C;
? ? ? ? ? ? ? ? bStatus_t status = 0;
? ? ? ? ? ? ? ? status = GATT_WriteCharValue(centralConnHandle, &req, centralTaskId);
? ? ? ? ? ? ? ? if(status == SUCCESS)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? centralProcedureInProgress = TRUE;
? ? ? ? ? ? ? ? ? ? tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? PRINT("Write Fail:%d\n",status);
? ? ? ? ? ? ? ? ? ? GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
? ? ? ? ? ? ? ? ? ? tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);
? ? ? ? ? ? ? ? }
這里的PRINT打印的status值是 22.
[17:41:31.218]收←◆Write Fail:22
[17:42:14.987]收←◆Device found...
Connecting...
[17:42:15.068]收←◆Connected...
[17:42:15.141]收←◆exchange mtu:247
[17:42:15.254]收←◆Bonding success
[17:42:15.302]收←◆MTU: f7
[17:42:16.099]收←◆Found Profile Service handle : 21 ~ ffff?
[17:42:16.164]收←◆Found Characteristic 6 handle : 32?
[17:42:16.230]收←◆Found client characteristic configuration handle : 33?
這是主機(jī)復(fù)位后開始連接從機(jī)的打印情況
我做了進(jìn)一步的測(cè)試:主機(jī)不向從機(jī)寫數(shù)據(jù),從機(jī)定時(shí)50ms給主機(jī)發(fā)送通知,這種情況下,不會(huì)出現(xiàn)斷開也不會(huì)出現(xiàn)其他異常。
藍(lán)牙通訊是根據(jù)握手的連接間隔進(jìn)行包交互的,不是用戶怎么傳就怎么傳數(shù)據(jù)包的
??????????? if(centralDoWrite)
??????????? {
??????????????? // Do a write
??????????????? attWriteReq_t req;
??????????????? req.cmd = FALSE;
??????????????? req.sig = FALSE;
??????????????? req.handle = centralCharHdl;
??????????????? req.len = 1;
??????????????? req.pValue = GATT_bm_alloc(centralConnHandle, ATT_WRITE_REQ, req.len, NULL, 0);
??????????????? if(req.pValue != NULL)
??????????????? {
??????????????????? *req.pValue = centralCharVal;
??????????????????? if(GATT_WriteCharValue(centralConnHandle, &req, centralTaskId) == SUCCESS)
??????????????????? {
??????????????????????? centralProcedureInProgress = TRUE;
??????????????????????? centralDoWrite = !centralDoWrite;
??????????????????????? tmos_start_task(centralTaskId, START_READ_OR_WRITE_EVT, DEFAULT_READ_OR_WRITE_DELAY);
??????????????????? }
??????????????????? else
??????????????????? {
??????????????????????? GATT_bm_free((gattMsg_t *)&req, ATT_WRITE_REQ);
??????????????????? }
??????????????? }
??????????? }
雖然定時(shí)調(diào)用發(fā)送任務(wù),但是如果返回失敗,證明底層緩存還有包沒有發(fā)出去,沒有足夠的空間來(lái)傳當(dāng)前這一包數(shù)據(jù)。
需要用戶自己做緩存處理,也不要在發(fā)送的地方死等發(fā)送成功,而是繼續(xù)輪詢,等下次可以發(fā)送。
我現(xiàn)在的需求是主機(jī)發(fā)送數(shù)據(jù),從機(jī)回應(yīng)數(shù)據(jù),這樣一個(gè)通信周期必須在50ms內(nèi)完成。應(yīng)該怎么改程序?
// Minimum connection interval (units of 1.25ms, 6=7.5ms)
#define DEFAULT_DESIRED_MIN_CONN_INTERVAL? ? 6
// Maximum connection interval (units of 1.25ms, 100=125ms)
#define DEFAULT_DESIRED_MAX_CONN_INTERVAL? ? 12
藍(lán)牙的主機(jī)和從機(jī)的這個(gè)參數(shù)我已經(jīng)改成上面的數(shù)據(jù)了。
這個(gè)值*1.25ms就是連接間隔,默認(rèn)一個(gè)連接間隔最多發(fā)一包數(shù)據(jù),默認(rèn)短包19字節(jié)。
peripheral例子默認(rèn)都是1字節(jié)收發(fā)。
CH573 CH582 CH579 peripheral通用外設(shè)例子講解一 - debugdabiaoge - 博客園 (cnblogs.com)
你提到的連接間隔之類的參數(shù)我是理解的,并且做了修改,并且協(xié)商的結(jié)果是0x0C,也就是我設(shè)置的最大值12.現(xiàn)在的現(xiàn)象是兩個(gè)CH582M模塊距離很近的時(shí)候,通信是正常的。但距離稍微遠(yuǎn)一點(diǎn)(大于10cm),通信就失敗。我也考慮過(guò)可能是天線的問(wèn)題,但是從咱的數(shù)據(jù)手冊(cè)上得知,咱的發(fā)射功率可以達(dá)到6dBm。我已經(jīng)把發(fā)射功率調(diào)節(jié)到最大了,通信距離還是稍遠(yuǎn)一點(diǎn)就會(huì)斷開。
留個(gè)郵箱,發(fā)個(gè)可以用的例程給你,或者發(fā)送郵件至hy@wch.cn獲取。
個(gè)人信息保護(hù),已隱藏
已發(fā)送,請(qǐng)查收。
謝謝!已經(jīng)收到了,初步測(cè)試了以下,基本滿足需求。我再詳細(xì)測(cè)試一下,有什么疑問(wèn)隨時(shí)反饋
我也遇到相同的問(wèn)題,連接上后,主機(jī)發(fā)送一段時(shí)間數(shù)據(jù),突然就發(fā)送不成功了,返回的錯(cuò)誤碼也是22,后面變成23了。請(qǐng)問(wèn)怎么才能自由發(fā)送數(shù)據(jù)?
郵件已發(fā)送新的庫(kù)文件,替換庫(kù)文件看看呢,請(qǐng)查收。
也發(fā)我一份程序 郵箱:個(gè)人信息保護(hù),已隱藏
可以下載最新的582EVT例程,庫(kù)已經(jīng)更新,解決了此類問(wèn)題。