bc260y.c 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857
  1. #include "CONFIG.h"
  2. #if BC260Y
  3. /**
  4. ******************************************************************************
  5. * 版 本 :V1.0.0
  6. * 作 者 :liuyanbin,helomgxiang
  7. * 版权所有,盗版必究。
  8. * Copyright(C) All rights reserved
  9. ******************************************************************************
  10. * 历史记录
  11. * 序号 版本 变更内容 作者 日期
  12. * 1 V0.0.1 实现4GAT指令 何龙翔 2023/12/10
  13. * 2 V0.0.2 基于4实现NB指令 刘艳斌 2024/1/10
  14. * 3 V0.0.3 整合4g和nb代码 刘艳斌 2024/1/24
  15. * 4 V0.0.4 修改send函数添加sendrai 刘艳斌 2024/2/18
  16. ******************************************************************************
  17. */
  18. #include "stm32f10x.h"
  19. #include <stdio.h>
  20. #include <stdarg.h>
  21. #include <string.h>
  22. #include <stdlib.h>
  23. #include "CONFIG.h"
  24. #include "bc260y.h"
  25. #include "Log_Module.h"
  26. #include "At_Module.h"
  27. #include "Common_Util.h"
  28. static char hexData[800] = {0};//数据发送的中间数据
  29. // 方法声明
  30. void bc260y_reset(void); // 重置状态。该文件中的方法共用状态,在使用下面的方法前需要重置一下状态。
  31. enum Result bc260y_exit_sleep(void); // 退出休眠
  32. enum Result bc260y_exit_sleep_sync(void); // 退出休眠
  33. void bc260y_enter_sleep(void); // 进入休眠
  34. /**
  35. * 查询休眠模式
  36. * 输入<<
  37. *
  38. * 输出>>
  39. * n 睡眠模式。0 禁用,默认;1 启用。
  40. **/
  41. enum Result bc260y_query_sleep(uint8_t * n); // 查询休眠模式。
  42. enum Result bc260y_query_sleep_sync(uint8_t * n); // 查询休眠模式。同步
  43. /**
  44. * 设置休眠模式
  45. * 输入<<
  46. * n 参数。0 禁用;1启用。
  47. * 输出>>
  48. *
  49. **/
  50. enum Result bc260y_set_sleep(uint8_t n); // 设置休眠模式。
  51. enum Result bc260y_set_sleep_sync(uint8_t n); // 设置休眠模式。同步
  52. /**
  53. * 设置功能模式
  54. * 输入<<
  55. * fun 0 最小功能模式;1 全功能模式。
  56. * 输出>>
  57. *
  58. **/
  59. enum Result bc260y_set_cfun(uint8_t fun);
  60. enum Result bc260y_set_cfun_sync(uint8_t fun); // 同步
  61. /**
  62. * 设置ps域网络注册状态
  63. * 输入<<
  64. * n 0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  65. * 输出>>
  66. *
  67. **/
  68. enum Result bc260y_set_cgreg(uint8_t n);
  69. enum Result bc260y_set_cgreg_sync(uint8_t n); // 同步
  70. /**
  71. * 查询ps域网络注册状态
  72. * 输入<<
  73. *
  74. * 输出>>
  75. * n 控制指定URC的上报。0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  76. * stat 网络注册状态。0 未注册;1 已注册,归属地网络; 2 未注册;3 注册被拒绝;4 未知;5 已注册,漫游。
  77. * lac 基站位置区号。用于基站定位,2个字节。
  78. * ci 基站小区ID。用于基站定位,4个字节。
  79. *
  80. **/
  81. enum Result bc260y_query_cgreg(uint8_t * n, uint8_t * stat, uint16_t * lac, uint32_t * ci);
  82. enum Result bc260y_query_cgreg_sync(uint8_t * n, uint8_t * stat, uint16_t * lac, uint32_t * ci); // 同步
  83. /**
  84. * 查询socket服务状态
  85. * 输入<<
  86. * connectID Socket ID。范围1-11
  87. *
  88. * 输出>>
  89. * state Socket服务状态。0 未连接;1 正在连接;2 已建立连接;3 服务正在监听;4 连接断开。
  90. *
  91. *
  92. **/
  93. enum Result bc260y_query_socket_state(uint8_t connectID, uint8_t * state);
  94. enum Result bc260y_query_socket_state_sync(uint8_t connectID, uint8_t * state); // 同步
  95. /**
  96. * 打开socket服务
  97. * 输入<<
  98. * connectID Socket ID。范围1-11
  99. * service_type Socket服务类型。取值为"UDP", "TCP"。
  100. * IP_address 远程服务器地址
  101. * remote_port 远程服务器端口
  102. * access_mode Socket服务的数据访问模式。0 缓存模式;1 直吐模式;2 透传模式。
  103. *
  104. * 输出>>
  105. * err 操作错误代码。0 表示没有错误;其余参考移远文档。
  106. *
  107. **/
  108. enum Result bc260y_open_socket(uint8_t connectID, char * service_type, char * IP_address, uint16_t remote_port, uint8_t access_mode, uint16_t * err);
  109. enum Result bc260y_open_socket_sync(uint8_t connectID, char * service_type, char * IP_address, uint16_t remote_port, uint8_t access_mode, uint16_t * err); // 同步
  110. /**
  111. * 关闭socket服务
  112. * 输入<<
  113. * connectID Socket ID。范围1-11
  114. *
  115. * 输出>>
  116. *
  117. **/
  118. enum Result bc260y_close_socket(uint8_t connectID);
  119. enum Result bc260y_close_socket_sync(uint8_t connectID); // 同步
  120. /**
  121. * 解释:控制是否回显AT+QISEND要发送的数据
  122. * 为了便于处理返回,发送数据时需要关闭回显。
  123. * 输入<<
  124. * echo 是否回显AT+QISEND要发送的数据。0 不回显;1 回显。默认是回显
  125. *
  126. * 输出>>
  127. *
  128. **/
  129. enum Result bc260y_set_qisde(uint8_t echo);
  130. enum Result bc260y_set_qisde_sync(uint8_t echo); // 同步
  131. /**
  132. * 发送数据
  133. * 输入<<
  134. * connectID Socket ID。范围1-11。
  135. * send_length 发送长度。
  136. * data 待发送的数据。
  137. *
  138. *
  139. **/
  140. enum Result bc260y_send(uint8_t connectID, uint8_t * data, uint16_t data_length);
  141. enum Result bc260y_send_rai(uint8_t connectID, uint8_t * data, uint16_t data_length,uint8_t rai);
  142. enum Result bc260y_send_sync(uint8_t connectID, uint8_t * data, uint16_t data_length); // 同步
  143. /**
  144. * 接收数据
  145. * 输入<<
  146. * connectID Socket ID。范围0-11。
  147. *
  148. * 输出>>
  149. * data 接收的数据。
  150. * data_length 接收的数据长度。
  151. **/
  152. enum Result bc260y_recv(uint8_t connectID, uint8_t * data, uint16_t * data_length); // 接收数据
  153. /**
  154. * 接收数据。带计时
  155. * 输入<<
  156. * connectID Socket ID。范围0-11。
  157. *
  158. * 输出>>
  159. * data 接收的数据。
  160. * data_length 接收的数据长度。
  161. *
  162. **/
  163. enum Result bc260y_recv_with_time(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out);
  164. enum Result bc260y_recv_with_time_sync(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out); // 同步
  165. /**
  166. * 解释:关闭模块
  167. * 关闭模块,关闭后会自动重启。
  168. * 输入<<
  169. * n 模块关机方式。0 立即关机;1 正常关机。默认是1
  170. *
  171. *
  172. **/
  173. enum Result bc260y_power_down(uint8_t n);
  174. enum Result bc260y_power_down_sync(uint8_t n); // 同步
  175. /**
  176. * 模块是否启动成功
  177. * 输入<<
  178. *
  179. * 输出>>
  180. *
  181. **/
  182. enum Result bc260y_ready(void);
  183. /**
  184. * 查询信号质量
  185. * 输入<<
  186. *
  187. * 输出>>
  188. * RSRP
  189. * RSRQ
  190. * RSSI
  191. * SINR
  192. **/
  193. enum Result bc260y_qeng_servingcell(int * RSRP, int * RSRQ, int * RSSI, int * SINR);
  194. enum Result bc260y_qeng_servingcell_sync(int * RSRP, int * RSRQ, int * RSSI, int * SINR);
  195. /**
  196. * 查询ICCID
  197. * 输入<<
  198. *
  199. * 输出>>
  200. * iccid SIM卡卡号
  201. **/
  202. enum Result bc260y_query_qccid(char * iccid);
  203. enum Result bc260y_query_qccid_sync(char * iccid);
  204. /**
  205. * 配置发送数据格式
  206. * 输入<<
  207. *n 0数据格式为文本字符串,1为十六进制字符串
  208. *
  209. **/
  210. enum Result bc260y_dataformat(uint8_t n);
  211. enum Result bc260y_dataformat_sync(uint8_t n);
  212. //
  213. // AT指令
  214. static char AT_CMD[256];
  215. // EC800M提供的一些方法
  216. struct BC260Y_Struct bc260y =
  217. {
  218. .reset = bc260y_reset,
  219. .exit_sleep = bc260y_exit_sleep,
  220. .exit_sleep_sync = bc260y_exit_sleep_sync,
  221. .enter_sleep = bc260y_enter_sleep,
  222. .query_sleep = bc260y_query_sleep,
  223. .query_sleep_sync = bc260y_query_sleep_sync,
  224. .set_sleep = bc260y_set_sleep,
  225. .set_sleep_sync = bc260y_set_sleep_sync,
  226. .set_cfun = bc260y_set_cfun,
  227. .set_cfun_sync = bc260y_set_cfun_sync,
  228. .set_cgreg = bc260y_set_cgreg,
  229. .set_cgreg_sync = bc260y_set_cgreg_sync,
  230. .query_cgreg = bc260y_query_cgreg,
  231. .query_cgreg_sync = bc260y_query_cgreg_sync,
  232. .query_socket_state = bc260y_query_socket_state,
  233. .query_socket_state_sync = bc260y_query_socket_state_sync,
  234. .open_socket = bc260y_open_socket,
  235. .open_socket_sync = bc260y_open_socket_sync,
  236. .close_socket = bc260y_close_socket,
  237. .close_socket_sync = bc260y_close_socket_sync,
  238. .set_qisde = bc260y_set_qisde,
  239. .set_qisde_sync = bc260y_set_qisde_sync,
  240. .send = bc260y_send,
  241. .send_rai = bc260y_send_rai,
  242. .send_sync = bc260y_send_sync,
  243. .recv = bc260y_recv,
  244. .recv_with_time = bc260y_recv_with_time,
  245. .recv_with_time_sync = bc260y_recv_with_time_sync,
  246. .power_down = bc260y_power_down,
  247. .power_down_sync = bc260y_power_down_sync,
  248. .ready = bc260y_ready,
  249. .qeng_servingcell = bc260y_qeng_servingcell,
  250. .qeng_servingcell_sync = bc260y_qeng_servingcell_sync,
  251. .query_qccid = bc260y_query_qccid,
  252. .query_qccid_sync = bc260y_query_qccid_sync,
  253. .dataformat= bc260y_dataformat,
  254. .dataformat_sync= bc260y_dataformat_sync
  255. };
  256. // 发送AT指令
  257. static void send_data(uint8_t * data, uint16_t length)
  258. {
  259. // 发送AT指令
  260. AT_Send_Bytes(data, length);
  261. }
  262. // 发送AT指令
  263. static uint8_t send_at_string(char * cmd)
  264. {
  265. uint8_t state = 0;
  266. if(AT_Get_Status() == AT_Status_None)
  267. {
  268. // 发送AT指令
  269. AT_Send_String(cmd);
  270. state = 1;
  271. }
  272. return state;
  273. }
  274. // 获取状态
  275. static enum STATUS getStatus(void)
  276. {
  277. return bc260y.status;
  278. }
  279. // 设置状态
  280. static void setStatus(enum STATUS status)
  281. {
  282. bc260y.status = status;
  283. }
  284. // 获取定时
  285. static uint32_t getTimerMs(void)
  286. {
  287. return bc260y.timer_ms;
  288. }
  289. // 设置定时
  290. static void setTimerMs(uint32_t time)
  291. {
  292. bc260y.timer_ms = time;
  293. }
  294. // 获取ID
  295. static uint8_t getActiveID(void)
  296. {
  297. return bc260y.activeID;
  298. }
  299. static void setActiveID(uint8_t activeID)
  300. {
  301. bc260y.activeID = activeID;
  302. }
  303. // 验证ID
  304. static uint8_t verifyActiveID(uint8_t activeID)
  305. {
  306. if(getActiveID() == 0 || getActiveID() == activeID){ return 1; }
  307. else
  308. {
  309. Log_Printf_Debug("activeID repetition!\r\n");
  310. return 0;
  311. }
  312. }
  313. // 返回超时结果
  314. static enum Result overtime(void)
  315. {
  316. setStatus(Status_Overtime); // 超时
  317. return Result_Failed; // 结果
  318. }
  319. // 返回成功结果
  320. static enum Result success(void)
  321. {
  322. // 成功
  323. setStatus(Status_Success);
  324. // 结果
  325. return Result_Success;
  326. }
  327. // 返回失败结果
  328. static enum Result failed(void)
  329. {
  330. // 失败
  331. setStatus(Status_Failed);
  332. // 失败结果
  333. return Result_Failed;
  334. }
  335. // 重置状态。该文件中的方法共用状态,在使用方法前需要重置一下状态。
  336. void bc260y_reset(void)
  337. {
  338. setStatus(Status_None); // 重置状态
  339. setActiveID(0); // 重置ID
  340. setTimerMs(0); // 重置计时
  341. AT_Clear(); // 清除AT指令
  342. }
  343. // 发送指令并改变状态
  344. enum Result send_at(char * cmd, uint8_t activeID)
  345. {
  346. Log_Printf_Debug(cmd); // 打印AT指令
  347. if(send_at_string(cmd)) // 发送AT指令
  348. {
  349. setActiveID(activeID); // 活动ID
  350. setStatus(Status_Sending); // 设置已发送
  351. setTimerMs(0); // 重置计时
  352. return Result_None; // 未知结果
  353. }
  354. else
  355. {
  356. Log_Printf_Debug("AT指令发送失败\r\n"); // 打印日志
  357. return Result_Failed; // 失败结果
  358. }
  359. }
  360. // 退出休眠
  361. enum Result bc260y_exit_sleep(void)
  362. {
  363. //GPIO_SetBits(WAKE_GPIO, WAKE_GPIO_Pin);// nb拉高io口,唤醒模组
  364. enum Result result = Result_None;
  365. int activeID = 1, time = 500; // 活动ID, 超时时间
  366. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  367. // 判断状态
  368. if(getStatus() == Status_None) // 空闲状态
  369. {
  370. sprintf(AT_CMD, "AT\r\r\n"); // 拼接AT指令
  371. result = send_at(AT_CMD, activeID);
  372. }
  373. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  374. {
  375. Log_Printf_Debug("返回结果过期1,请重置状态\r\n"); // 打印日志
  376. result = failed(); // 失败
  377. }
  378. else if(getTimerMs() > time) // 正在发送状态。判断超时
  379. {
  380. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  381. Log_SendArray_Debug(AT_result(), AT_result_length());
  382. result = overtime(); // 超时
  383. }
  384. if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  385. {
  386. // 发送日志
  387. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  388. Log_SendArray_Debug(AT_result(), AT_result_length());
  389. result = success(); // 成功
  390. }
  391. else if(strstr((char * )AT_result(), "+QNBIOTEVENT:") != NULL)
  392. {
  393. // 发送日志
  394. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  395. Log_SendArray_Debug(AT_result(), AT_result_length());
  396. result = success(); // 成功
  397. }
  398. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  399. {
  400. // 发送日志
  401. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  402. Log_SendArray_Debug(AT_result(), AT_result_length());
  403. result = failed(); // 失败
  404. }
  405. return result;
  406. }
  407. enum Result bc260y_exit_sleep_sync()
  408. {
  409. enum Result result = Result_None;
  410. while(1)
  411. {
  412. result = bc260y_exit_sleep();
  413. if(result != Result_None)
  414. {
  415. // 重置
  416. bc260y.reset();
  417. break;
  418. }
  419. }
  420. return result;
  421. }
  422. // 进入休眠
  423. void bc260y_enter_sleep(void)
  424. {
  425. GPIO_ResetBits(WAKE_GPIO, WAKE_GPIO_Pin); // nb拉低io口,进入睡眠
  426. }
  427. /**
  428. * 查询休眠模式
  429. * 输入<<
  430. *
  431. * 输出>>
  432. * n 睡眠模式。0 禁用,默认;1 启用。
  433. *
  434. **/
  435. enum Result bc260y_query_sleep(uint8_t * n)
  436. {
  437. enum Result result = Result_None;
  438. int activeID = 1, time = 500; // 活动ID, 超时时间
  439. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  440. // 判断状态
  441. if(getStatus() == Status_None) // 空闲状态
  442. {
  443. sprintf(AT_CMD, "AT+QSCLK?\r\r\n"); // 拼接AT指令
  444. result = send_at(AT_CMD, activeID);
  445. }
  446. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  447. {
  448. Log_Printf_Debug("返回结果过期1,请重置状态\r\n"); // 打印日志
  449. result = failed(); // 失败
  450. }
  451. else if(getTimerMs() > time) // 正在发送状态。判断超时
  452. {
  453. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  454. result = overtime(); // 超时
  455. Log_SendArray_Debug(AT_result(), AT_result_length());
  456. }
  457. if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  458. {
  459. // 发送日志
  460. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  461. Log_SendArray_Debug(AT_result(), AT_result_length());
  462. // 处理返回结果
  463. char * saveptr = NULL;
  464. char * split = "\r\n";
  465. // 第一行
  466. char * Line1 = strtok_r((char * )AT_result(), split, &saveptr);
  467. // 第二行
  468. char * Line2 = strtok_r(NULL, split, &saveptr);
  469. // 拆解第二行
  470. char * saveptr_inner = NULL;
  471. char * split_inner = ": ";
  472. strtok_r(Line2, split_inner, &saveptr_inner);
  473. // 获取mode
  474. * n = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  475. result = success(); // 成功
  476. }
  477. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  478. {
  479. // 发送日志
  480. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  481. Log_SendArray_Debug(AT_result(), AT_result_length());
  482. result = failed(); // 失败
  483. }
  484. return result;
  485. }
  486. /**
  487. * 查询休眠模式。同步方法
  488. * 输入<<
  489. *
  490. * 输出>>
  491. * n 睡眠模式。0 禁用,默认;1 启用。
  492. *
  493. **/
  494. enum Result bc260y_query_sleep_sync(uint8_t * n)
  495. {
  496. enum Result result = Result_None;
  497. while(1)
  498. {
  499. result = bc260y_query_sleep(n);
  500. if(result != Result_None)
  501. {
  502. // 重置
  503. bc260y.reset();
  504. break;
  505. }
  506. }
  507. return result;
  508. }
  509. /**
  510. * 设置休眠模式
  511. * n 参数。0 禁用;1启用允许进入Deep Sleep 模式,2允许模块进入入Light Sleep 模式。
  512. **/
  513. enum Result bc260y_set_sleep(uint8_t n)
  514. {
  515. enum Result result = Result_None;
  516. int activeID = 2, time = 500; // 活动ID, 超时时间
  517. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  518. // 判断状态
  519. if(getStatus() == Status_None) // 空闲状态
  520. {
  521. sprintf(AT_CMD, "AT+QSCLK=%d\r\r\n", n); // 拼接AT指令
  522. result = send_at(AT_CMD, activeID);
  523. }
  524. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  525. {
  526. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  527. result = failed(); // 失败
  528. }
  529. else if(getTimerMs() > time) // 正在发送状态。判断超时
  530. {
  531. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  532. result = overtime(); // 超时
  533. }
  534. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  535. {
  536. // 发送日志
  537. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  538. Log_SendArray_Debug(AT_result(), AT_result_length());
  539. result = success(); // 成功
  540. }
  541. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  542. {
  543. // 发送日志
  544. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  545. Log_SendArray_Debug(AT_result(), AT_result_length());
  546. result = failed(); // 失败
  547. }
  548. return result;
  549. }
  550. /**
  551. * 设置休眠模式。同步
  552. * n 参数。0 禁用;1启用。
  553. **/
  554. enum Result bc260y_set_sleep_sync(uint8_t n)
  555. {
  556. enum Result result = Result_None;
  557. while(1)
  558. {
  559. result = bc260y_set_sleep(n);
  560. if(result != Result_None)
  561. {
  562. // 重置
  563. bc260y.reset();
  564. break;
  565. }
  566. }
  567. return result;
  568. }
  569. /**
  570. * 设置功能模式
  571. * fun 0 最小功能模式;1 全功能模式。
  572. **/
  573. enum Result bc260y_set_cfun(uint8_t fun)
  574. {
  575. enum Result result = Result_None;
  576. int activeID = 4, time; // 活动ID, 超时时间
  577. // 校验参数
  578. if(fun == 0){ time = 3000; }
  579. else if(fun == 1){ time = 8000; }
  580. else
  581. {
  582. Log_Printf_Debug("set_cfun params error!\r\n");
  583. return Result_Failed;
  584. }
  585. // 校验ID
  586. if(!verifyActiveID(activeID)){ return Result_Failed; }
  587. // 判断状态
  588. if(getStatus() == Status_None) // 空闲状态
  589. {
  590. sprintf(AT_CMD, "AT+CFUN=%d\r\r\n", fun); // 拼接AT指令
  591. result = send_at(AT_CMD, activeID);
  592. }
  593. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  594. {
  595. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  596. result = failed(); // 失败
  597. }
  598. else if(getTimerMs() > time) // 正在发送状态。判断超时
  599. {
  600. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  601. Log_SendArray_Debug(AT_result(), AT_result_length());
  602. result = overtime(); // 超时
  603. }
  604. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  605. {
  606. // 防止接收不完整
  607. if(AT_wait_time() > 10) // 过10ms之后再取数据,避免数据截断。
  608. {
  609. // 发送日志
  610. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  611. Log_SendArray_Debug(AT_result(), AT_result_length());
  612. result = success(); // 成功
  613. }
  614. }
  615. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  616. {
  617. // 发送日志
  618. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  619. Log_SendArray_Debug(AT_result(), AT_result_length());
  620. result = failed(); // 失败
  621. }
  622. return result;
  623. }
  624. /**
  625. * 设置功能模式
  626. * 输入<<
  627. * fun 0 最小功能模式;1 全功能模式。
  628. * 输出>>
  629. *
  630. **/
  631. enum Result bc260y_set_cfun_sync(uint8_t fun)
  632. {
  633. enum Result result = Result_None;
  634. while(1)
  635. {
  636. result = bc260y_set_cfun(fun);
  637. if(result != Result_None)
  638. {
  639. // 重置
  640. bc260y.reset();
  641. break;
  642. }
  643. }
  644. return result;
  645. }
  646. /**
  647. * 设置ps域网络注册状态
  648. * n 0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  649. **/
  650. enum Result bc260y_set_cgreg(uint8_t n)
  651. {
  652. enum Result result = Result_None;
  653. int activeID = 6, time = 500; // 活动ID, 超时时间
  654. // 校验参数
  655. if(n > 2)
  656. {
  657. Log_Printf_Debug("set_cgreg params error!\r\n");
  658. return Result_Failed;
  659. }
  660. // 校验ID
  661. if(!verifyActiveID(activeID)){ return Result_Failed; }
  662. // 判断状态
  663. if(getStatus() == Status_None) // 空闲状态
  664. {
  665. sprintf(AT_CMD, "AT+CEREG=%d\r\r\n", n); // 拼接AT指令
  666. result = send_at(AT_CMD, activeID);
  667. }
  668. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  669. {
  670. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  671. result = failed(); // 失败
  672. }
  673. else if(getTimerMs() > time) // 正在发送状态。判断超时
  674. {
  675. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  676. result = overtime(); // 超时
  677. }
  678. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  679. {
  680. // 发送日志
  681. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  682. Log_SendArray_Debug(AT_result(), AT_result_length());
  683. result = success(); // 成功
  684. }
  685. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  686. {
  687. // 发送日志
  688. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  689. Log_SendArray_Debug(AT_result(), AT_result_length());
  690. result = failed(); // 失败
  691. }
  692. return result;
  693. }
  694. /**
  695. * 设置ps域网络注册状态
  696. * 输入<<
  697. * n 0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  698. * 输出>>
  699. *
  700. **/
  701. enum Result bc260y_set_cgreg_sync(uint8_t n)
  702. {
  703. enum Result result = Result_None;
  704. while(1)
  705. {
  706. result = bc260y_set_cgreg(n);
  707. if(result != Result_None)
  708. {
  709. // 重置
  710. bc260y.reset();
  711. break;
  712. }
  713. }
  714. return result;
  715. }
  716. /**
  717. * 查询ps域网络注册状态
  718. * 输入<<
  719. *
  720. * 输出>>
  721. * n 控制指定URC的上报。0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  722. * stat 网络注册状态。0 未注册;1 已注册,归属地网络; 2 未注册;3 注册被拒绝;4 未知;5 已注册,漫游。
  723. * lac 基站位置区号。用于基站定位,2个字节。
  724. * ci 基站小区ID。用于基站定位,4个字节。
  725. *
  726. **/
  727. enum Result bc260y_query_cgreg(uint8_t * n, uint8_t * stat, uint16_t * lac, uint32_t * ci)
  728. {
  729. enum Result result = Result_None;
  730. int activeID = 9, time = 500; // 活动ID, 超时时间
  731. // 校验ID
  732. if(!verifyActiveID(activeID)){ return Result_Failed; }
  733. // 判断状态
  734. if(getStatus() == Status_None) // 空闲状态
  735. {
  736. sprintf(AT_CMD, "AT+CEREG?\r\r\n"); // 拼接AT指令
  737. result = send_at(AT_CMD, activeID);
  738. }
  739. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  740. {
  741. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  742. result = failed(); // 失败
  743. }
  744. else if(getTimerMs() > time) // 正在发送状态。判断超时
  745. {
  746. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  747. setStatus(Status_Overtime); // 超时
  748. result = Result_Failed; // 结果
  749. }
  750. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  751. {
  752. // 发送日志
  753. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  754. Log_SendArray_Debug(AT_result(), AT_result_length());
  755. // 处理返回结果
  756. char * saveptr = NULL;
  757. char * split = "\r\n";
  758. // 第一行
  759. char * Line1 = strtok_r((char * )AT_result(), split, &saveptr);
  760. char * saveptr_inner = NULL;
  761. char * split_inner = ": ,\"";
  762. strtok_r(Line1, split_inner, &saveptr_inner);
  763. * n = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  764. * stat = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  765. // Log_Printf_Debug("saveptr_inner: %s\r\n", Line2);
  766. * lac = strtoul(strtok_r(NULL, split_inner, &saveptr_inner), NULL, 16);
  767. * ci = strtoul(strtok_r(NULL, split_inner, &saveptr_inner), NULL, 16);
  768. // 打印
  769. Log_Printf_Debug("mode: %d, stat: %d, lac: %d, ci: %d\r\n", * n, * stat, * lac, * ci);
  770. result = success(); // 成功
  771. }
  772. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  773. {
  774. // 发送日志
  775. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  776. Log_SendArray_Debug(AT_result(), AT_result_length());
  777. result = failed(); // 失败
  778. }
  779. return result;
  780. }
  781. /**
  782. * 查询ps域网络注册状态
  783. * 输入<<
  784. *
  785. * 输出>>
  786. * n 控制指定URC的上报。0 禁止上报网络注册;1 允许上报网络注册;2 允许上报网络注册和位置信息
  787. * stat 网络注册状态。0 未注册;1 已注册,归属地网络; 2 未注册;3 注册被拒绝;4 未知;5 已注册,漫游。
  788. * lac 基站位置区号。用于基站定位,2个字节。
  789. * ci 基站小区ID。用于基站定位,4个字节。
  790. *
  791. **/
  792. enum Result bc260y_query_cgreg_sync(uint8_t * n, uint8_t * stat, uint16_t * lac, uint32_t * ci)
  793. {
  794. enum Result result = Result_None;
  795. while(1)
  796. {
  797. result = bc260y_query_cgreg(n, stat, lac, ci);
  798. if(result != Result_None)
  799. {
  800. // 重置
  801. bc260y.reset();
  802. break;
  803. }
  804. }
  805. return result;
  806. }
  807. /**
  808. * 查询socket服务状态
  809. * connectID Socket ID。范围1-11
  810. * state Socket服务状态。0 未连接;1 正在连接;2 已建立连接;3 服务正在监听;4 连接断开。
  811. *
  812. * activeID 9
  813. **/
  814. enum Result bc260y_query_socket_state(uint8_t connectID, uint8_t * state)
  815. {
  816. enum Result result = Result_None;
  817. int activeID = 9, time = 500; // 活动ID, 超时时间
  818. // 校验ID
  819. if(!verifyActiveID(activeID)){ return Result_Failed; }
  820. // 判断状态
  821. if(getStatus() == Status_None) // 空闲状态
  822. {
  823. sprintf(AT_CMD, "AT+QISTATE=1,%d\r\r\n", connectID); // 拼接AT指令
  824. result = send_at(AT_CMD, activeID);
  825. }
  826. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  827. {
  828. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  829. result = failed(); // 失败
  830. }
  831. else if(getTimerMs() > time) // 正在发送状态。判断超时
  832. {
  833. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  834. result = overtime(); // 超时
  835. }
  836. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  837. {
  838. // 发送日志
  839. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  840. Log_SendArray_Debug(AT_result(), AT_result_length());
  841. // 处理返回结果
  842. char * saveptr = NULL;
  843. char * split = "\r\n";
  844. // 第一行
  845. strtok_r((char * )AT_result(), split, &saveptr);
  846. // 第二行
  847. char * Line2 = strtok_r(NULL, split, &saveptr);
  848. // 查询结果为空
  849. if(strcmp(Line2, "OK") == 0){ * state = 0; }
  850. else
  851. {
  852. // 拆解第二行
  853. char * saveptr_inner = NULL;
  854. char * split_inner = ": ,\"";
  855. strtok_r(Line2, split_inner, &saveptr_inner);
  856. strtok_r(NULL, split_inner, &saveptr_inner);
  857. strtok_r(NULL, split_inner, &saveptr_inner);
  858. strtok_r(NULL, split_inner, &saveptr_inner);
  859. strtok_r(NULL, split_inner, &saveptr_inner);
  860. strtok_r(NULL, split_inner, &saveptr_inner);
  861. * state = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  862. }
  863. // 打印
  864. Log_Printf_Debug("result: %d\r\n", * state);
  865. result = success(); // 成功
  866. }
  867. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  868. {
  869. // 发送日志
  870. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  871. Log_SendArray_Debug(AT_result(), AT_result_length());
  872. result = failed(); // 失败
  873. }
  874. return result;
  875. }
  876. /**
  877. * 查询socket服务状态
  878. * connectID Socket ID。范围1-11
  879. * state Socket服务状态。0 未连接;1 正在连接;2 已建立连接;3 服务正在监听;4 连接断开。
  880. *
  881. * activeID 9
  882. **/
  883. enum Result bc260y_query_socket_state_sync(uint8_t connectID, uint8_t * state)
  884. {
  885. enum Result result = Result_None;
  886. while(1)
  887. {
  888. result = bc260y_query_socket_state(connectID, state);
  889. if(result != Result_None)
  890. {
  891. // 重置
  892. bc260y.reset();
  893. break;
  894. }
  895. }
  896. return result;
  897. }
  898. /**
  899. * 打开socket服务
  900. * 输入<<
  901. * connectID Socket ID。范围1-11
  902. * service_type Socket服务类型。取值为"UDP", "TCP"。
  903. * IP_address 远程服务器地址
  904. * remote_port 远程服务器端口
  905. * access_mode Socket服务的数据访问模式。0 缓存模式;1 直吐模式;2 透传模式。
  906. *
  907. * 输出>>
  908. * err 操作错误代码。0 表示没有错误;其余参考移远文档。
  909. *
  910. * activeID 19
  911. **/
  912. enum Result bc260y_open_socket(uint8_t connectID, char * service_type, char * IP_address, uint16_t remote_port, uint8_t access_mode, uint16_t * err)
  913. {
  914. enum Result result = Result_None;
  915. int activeID = 19, time = 3000; // 活动ID, 超时时间
  916. // 校验ID
  917. if(!verifyActiveID(activeID)){ return Result_Failed; }
  918. // 判断状态
  919. if(getStatus() == Status_None) // 空闲状态
  920. {
  921. sprintf(AT_CMD, "AT+QIOPEN=0,%d,\"%s\",\"%s\",%d,%d,%d\r\r\n", connectID, service_type, IP_address, remote_port, 0, access_mode); // 拼接AT指令
  922. result = send_at(AT_CMD, activeID);
  923. }
  924. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  925. {
  926. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  927. result = failed(); // 失败
  928. }
  929. else if(getTimerMs() > time) // 正在发送状态。判断超时
  930. {
  931. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  932. result = overtime(); // 超时
  933. }
  934. else if(strstr((char * )AT_result(), "+QIOPEN: ") != NULL) // 查询是否返回
  935. {
  936. // 发送日志
  937. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  938. Log_SendArray_Debug(AT_result(), AT_result_length());//
  939. // 处理返回结果
  940. char * saveptr = NULL;
  941. char * split = "\r\n";
  942. // 第一行
  943. strtok_r((char * )AT_result(), split, &saveptr);
  944. // 第二行
  945. char * Line2 = strtok_r(NULL, split, &saveptr);
  946. // 第三行
  947. char * Line3 = strtok_r(NULL, split, &saveptr);
  948. // 查询结果为空
  949. if(strcmp(Line2, "OK") == 0)
  950. {
  951. // 拆解第三行
  952. char * saveptr_inner = NULL;
  953. char * split_inner = ": ,\"";
  954. strtok_r(Line3, split_inner, &saveptr_inner);
  955. uint8_t connID = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  956. * err = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  957. Log_Printf_Debug("result: %d, %d\r\n", connID, * err);
  958. }
  959. result = success(); // 成功
  960. }
  961. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  962. {
  963. // 发送日志
  964. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  965. Log_SendArray_Debug(AT_result(), AT_result_length());
  966. result = failed(); // 失败
  967. }
  968. return result;
  969. }
  970. /**
  971. * 打开socket服务
  972. * 输入<<
  973. * connectID Socket ID。范围1-11
  974. * service_type Socket服务类型。取值为"UDP", "TCP"。
  975. * IP_address 远程服务器地址
  976. * remote_port 远程服务器端口
  977. * access_mode Socket服务的数据访问模式。0 缓存模式;1 直吐模式;2 透传模式。
  978. *
  979. * 输出>>
  980. * err 操作错误代码。0 表示没有错误;其余参考移远文档。
  981. *
  982. * activeID 19
  983. **/
  984. enum Result bc260y_open_socket_sync(uint8_t connectID, char * service_type, char * IP_address, uint16_t remote_port, uint8_t access_mode, uint16_t * err)
  985. {
  986. enum Result result = Result_None;
  987. while(1)
  988. {
  989. result = bc260y_open_socket(connectID, service_type, IP_address, remote_port, access_mode, err);
  990. if(result != Result_None)
  991. {
  992. // 重置
  993. bc260y.reset();
  994. break;
  995. }
  996. }
  997. return result;
  998. }
  999. /**
  1000. * 关闭socket服务
  1001. * 输入<<
  1002. * connectID Socket ID。范围1-11
  1003. *
  1004. * activeID 29
  1005. **/
  1006. enum Result bc260y_close_socket(uint8_t connectID)
  1007. {
  1008. enum Result result = Result_None;
  1009. int activeID = 29, time = 500; // 活动ID, 超时时间
  1010. // 校验ID
  1011. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1012. // 判断状态
  1013. if(getStatus() == Status_None) // 空闲状态
  1014. {
  1015. sprintf(AT_CMD, "AT+QICLOSE=%d\r\r\n", connectID); // 拼接AT指令
  1016. result = send_at(AT_CMD, activeID);
  1017. }
  1018. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1019. {
  1020. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1021. result = Result_Failed;
  1022. }
  1023. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1024. {
  1025. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1026. result = overtime(); // 超时
  1027. }
  1028. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1029. {
  1030. // 发送日志
  1031. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1032. Log_SendArray_Debug(AT_result(), AT_result_length());
  1033. result = success(); // 成功
  1034. }
  1035. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1036. {
  1037. // 发送日志
  1038. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1039. Log_SendArray_Debug(AT_result(), AT_result_length());
  1040. result = failed(); // 失败
  1041. }
  1042. return result;
  1043. }
  1044. /**
  1045. * 关闭socket服务
  1046. * 输入<<
  1047. * connectID Socket ID。范围1-11
  1048. *
  1049. * activeID 29
  1050. **/
  1051. enum Result bc260y_close_socket_sync(uint8_t connectID)
  1052. {
  1053. enum Result result = Result_None;
  1054. while(1)
  1055. {
  1056. result = bc260y_close_socket(connectID);
  1057. if(result != Result_None)
  1058. {
  1059. // 重置
  1060. bc260y.reset();
  1061. break;
  1062. }
  1063. }
  1064. return result;
  1065. }
  1066. /**
  1067. * 解释:控制是否回显AT+QISEND要发送的数据
  1068. * 为了便于处理返回,发送数据时需要关闭回显。
  1069. * 输入<<
  1070. * echo 是否回显AT+QISEND要发送的数据。0 不回显;1 回显。默认是回显
  1071. *
  1072. * activeID 45
  1073. **/
  1074. enum Result bc260y_set_qisde(uint8_t echo)
  1075. {
  1076. enum Result result = Result_None;
  1077. int activeID = 45, time = 1000; // 活动ID, 超时时间
  1078. // 校验ID
  1079. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1080. // 判断状态
  1081. if(getStatus() == Status_None) // 空闲状态
  1082. {
  1083. sprintf(AT_CMD, "ATE%d\r\r\n", echo); // 拼接AT指令
  1084. result = send_at(AT_CMD, activeID);
  1085. }
  1086. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1087. {
  1088. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1089. result = Result_Failed;
  1090. }
  1091. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1092. {
  1093. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1094. result = overtime(); // 超时
  1095. }
  1096. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1097. {
  1098. // 发送日志
  1099. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1100. Log_SendArray_Debug(AT_result(), AT_result_length());
  1101. result = success(); // 成功
  1102. }
  1103. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1104. {
  1105. // 发送日志
  1106. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1107. Log_SendArray_Debug(AT_result(), AT_result_length());
  1108. result = failed(); // 失败
  1109. }
  1110. return result;
  1111. }
  1112. /**
  1113. * 解释:控制是否回显AT+QISEND要发送的数据
  1114. * 为了便于处理返回,发送数据时需要关闭回显。
  1115. * 输入<<
  1116. * echo 是否回显AT+QISEND要发送的数据。0 不回显;1 回显。默认是回显
  1117. *
  1118. * activeID 45
  1119. **/
  1120. enum Result bc260y_set_qisde_sync(uint8_t echo)
  1121. {
  1122. enum Result result = Result_None;
  1123. while(1)
  1124. {
  1125. result = bc260y_set_qisde(echo);
  1126. if(result != Result_None)
  1127. {
  1128. // 重置
  1129. bc260y.reset();
  1130. break;
  1131. }
  1132. }
  1133. return result;
  1134. }
  1135. /**
  1136. * 发送数据
  1137. * 输入<<
  1138. * connectID Socket ID。范围1-11。
  1139. * send_length 发送长度。
  1140. * data 待发送的数据。
  1141. *
  1142. * activeID 49
  1143. **/
  1144. enum Result bc260y_send(uint8_t connectID, uint8_t * data, uint16_t data_length)
  1145. {
  1146. enum Result result = Result_None;
  1147. // char hexData[1024] = {0};
  1148. int activeID = 49, time = 10000; // 活动ID, 超时时间
  1149. // 校验ID
  1150. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1151. // 判断状态
  1152. if(getStatus() == Status_None) // 空闲状态
  1153. {
  1154. memset(hexData,0, sizeof(hexData));
  1155. byteToHexStr(data,hexData, data_length);//nb需要转16进制
  1156. sprintf(AT_CMD, "AT+QISEND=%d,%d,%s\r\r\n", connectID, data_length,hexData); // 拼接AT指令
  1157. result = send_at(AT_CMD, activeID);
  1158. }
  1159. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1160. {
  1161. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1162. result = Result_Failed;
  1163. }
  1164. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1165. {
  1166. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1167. result = overtime(); // 超时
  1168. }
  1169. else if(strstr((char * )AT_result(), "SEND OK\r\n") != NULL) // 查询是否返回
  1170. {
  1171. // 发送日志
  1172. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1173. Log_SendArray_Debug(AT_result(), AT_result_length());
  1174. result = success(); // 成功
  1175. }
  1176. else if(strstr((char * )AT_result(), "SEND FALL\r\n") != NULL) // 查询是否返回
  1177. {
  1178. // 发送日志
  1179. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1180. Log_SendArray_Debug(AT_result(), AT_result_length());
  1181. result = failed(); // 失败
  1182. }
  1183. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1184. {
  1185. // 发送日志
  1186. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1187. Log_SendArray_Debug(AT_result(), AT_result_length());
  1188. result = failed(); // 失败
  1189. }
  1190. return result;
  1191. }
  1192. /**
  1193. * 发送数据
  1194. * 输入<<
  1195. * connectID Socket ID。范围1-11。
  1196. * send_length 发送长度。
  1197. * data 待发送的数据。
  1198. *rai 发送模式,0发送不释放RRC,1发送立即释放RRC,发送返回释放RRC
  1199. * activeID 49
  1200. **/
  1201. enum Result bc260y_send_rai(uint8_t connectID, uint8_t * data, uint16_t data_length,uint8_t rai)
  1202. {
  1203. enum Result result = Result_None;
  1204. int activeID = 49, time = 10000; // 活动ID, 超时时间
  1205. // 校验ID
  1206. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1207. // 判断状态
  1208. if(getStatus() == Status_None) // 空闲状态
  1209. {
  1210. memset(hexData,0, sizeof(hexData));
  1211. byteToHexStr(data,hexData, data_length);//nb需要转16进制
  1212. sprintf(AT_CMD, "AT+QISEND=%d,%d,%s,%d\r\r\n", connectID, data_length,hexData,rai); // 拼接AT指令
  1213. result = send_at(AT_CMD, activeID);
  1214. }
  1215. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1216. {
  1217. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1218. result = Result_Failed;
  1219. }
  1220. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1221. {
  1222. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1223. result = overtime(); // 超时
  1224. }
  1225. else if(strstr((char * )AT_result(), "SEND OK\r\n") != NULL) // 查询是否返回
  1226. {
  1227. // 发送日志
  1228. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1229. Log_SendArray_Debug(AT_result(), AT_result_length());
  1230. result = success(); // 成功
  1231. }
  1232. else if(strstr((char * )AT_result(), "SEND FALL\r\n") != NULL) // 查询是否返回
  1233. {
  1234. // 发送日志
  1235. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1236. Log_SendArray_Debug(AT_result(), AT_result_length());
  1237. result = failed(); // 失败
  1238. }
  1239. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1240. {
  1241. // 发送日志
  1242. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1243. Log_SendArray_Debug(AT_result(), AT_result_length());
  1244. result = failed(); // 失败
  1245. }
  1246. return result;
  1247. }
  1248. /**
  1249. * 发送数据
  1250. * 输入<<
  1251. * connectID Socket ID。范围1-11。
  1252. * send_length 发送长度。
  1253. * data 待发送的数据。
  1254. *
  1255. * activeID 49
  1256. **/
  1257. enum Result bc260y_send_sync(uint8_t connectID, uint8_t * data, uint16_t data_length)
  1258. {
  1259. enum Result result = Result_None;
  1260. while(1)
  1261. {
  1262. result = bc260y_send(connectID, data, data_length);
  1263. if(result != Result_None)
  1264. {
  1265. // 重置
  1266. bc260y.reset();
  1267. break;
  1268. }
  1269. }
  1270. return result;
  1271. }
  1272. /**
  1273. * 接收数据
  1274. * 输入<<
  1275. * connectID Socket ID。范围0-11。
  1276. *
  1277. * 输出>>
  1278. * data 接收的数据。
  1279. * data_length 接收的数据长度。
  1280. *
  1281. **/
  1282. enum Result bc260y_recv(uint8_t connectID, uint8_t * data, uint16_t * data_length)
  1283. {
  1284. // 设置AT为使用中,防止被其他程序占用
  1285. AT_Set_Status(AT_Status_Using);
  1286. enum Result result = Result_None;
  1287. // 校验参数
  1288. if(connectID > 11)
  1289. {
  1290. Log_Printf_Debug("recv params error!\r\n");
  1291. return Result_Failed;
  1292. }
  1293. char cmp[20];
  1294. sprintf(cmp, "+QIURC: \"recv\",%d", connectID); // 拼接AT指令
  1295. // 判断是否接收到
  1296. if(strstr((char * )AT_result(), cmp) != NULL)
  1297. {
  1298. // 防止接收不完整
  1299. uint32_t last_time = AT_wait_time();
  1300. if(last_time > 10) // 过10ms之后再取数据,避免数据截断。
  1301. {
  1302. // 发送日志
  1303. Log_Printf_Debug("AT返回: %d, time_diff: %d\r\n", AT_result_length(), last_time);
  1304. // Log_SendArray_Debug(AT_result(), AT_result_length());
  1305. char * saveptr = NULL;
  1306. char * split = "\r";//删除\n,这个会改变解析的值
  1307. char * Line1 = strtok_r((char * )AT_result(), split, &saveptr);
  1308. uint8_t Line1_Len = strlen(Line1);
  1309. Log_Printf_Debug("Line1(%d): %s\r\n",Line1_Len ,Line1);
  1310. // 分割Line1,获取报文长度
  1311. char * saveptr_inner = NULL;
  1312. char * split_inner = ",";
  1313. strtok_r(Line1, split_inner, &saveptr_inner);
  1314. strtok_r(NULL, split_inner, &saveptr_inner);
  1315. //Log_Printf_Debug("saveptr_inner: %s####\r\n",saveptr_inner);
  1316. * data_length = strtoul(strtok_r(NULL, split_inner, &saveptr_inner), NULL, 10);
  1317. // uint16_t line_length = Line1_Len+4 ;
  1318. // 内存拷贝
  1319. memcpy(data,saveptr_inner+1, *data_length);
  1320. //memcpy(data,AT_result(), *data_length);
  1321. // for(int i =0;i<*data_length;i++)
  1322. // {
  1323. // Log_Printf_Debug("%02x",data[i]);
  1324. // }
  1325. // Log_Printf_Debug("\r\n ####data: %s\r\n",data);
  1326. // 成功
  1327. result = Result_Success;
  1328. // 清理一下AT返回结果缓存
  1329. AT_Clear_Result();
  1330. }
  1331. }
  1332. return result;
  1333. }
  1334. /**
  1335. * 接收数据。带计时
  1336. * 输入<<
  1337. * connectID Socket ID。范围0-11。
  1338. *
  1339. * 输出>>
  1340. * data 接收的数据。
  1341. * data_length 接收的数据长度。
  1342. *
  1343. **/
  1344. enum Result bc260y_recv_with_time(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out)
  1345. {
  1346. enum Result result = Result_None;
  1347. int activeID = 59, time = time_out; // 活动ID, 超时时间
  1348. // 校验ID
  1349. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1350. // 判断状态
  1351. if(getStatus() == Status_None) // 空闲状态
  1352. {
  1353. setStatus(Status_Sending);
  1354. }
  1355. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1356. {
  1357. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1358. result = Result_Failed;
  1359. }
  1360. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1361. {
  1362. Log_Printf_Debug("等待时间超时\r\n"); // 打印日志
  1363. result = overtime(); // 超时
  1364. Log_SendArray_Debug(AT_result(), AT_result_length());
  1365. }
  1366. else
  1367. {
  1368. // 接收数据
  1369. result = bc260y.recv(connectID, data, data_length);
  1370. if(result == Result_Success)
  1371. {
  1372. result = success(); // 成功
  1373. }
  1374. }
  1375. return result;
  1376. }
  1377. /**
  1378. * 接收数据。带计时
  1379. * 输入<<
  1380. * connectID Socket ID。范围0-11。
  1381. *
  1382. * 输出>>
  1383. * data 接收的数据。
  1384. * data_length 接收的数据长度。
  1385. *
  1386. **/
  1387. enum Result bc260y_recv_with_time_sync(uint8_t connectID, uint8_t * data, uint16_t * data_length, uint32_t time_out)
  1388. {
  1389. enum Result result = Result_None;
  1390. while(1)
  1391. {
  1392. result = bc260y_recv_with_time(connectID, data, data_length, time_out);
  1393. if(result != Result_None)
  1394. {
  1395. // 重置
  1396. bc260y.reset();
  1397. break;
  1398. }
  1399. }
  1400. return result;
  1401. }
  1402. /**
  1403. * 解释:关闭模块
  1404. * 关闭模块,关闭后会自动重启。
  1405. * 输入<<
  1406. * n 模块关机方式。0 立即关机;1 正常关机。默认是1
  1407. *
  1408. * activeID 69
  1409. **/
  1410. enum Result bc260y_power_down(uint8_t n)
  1411. {
  1412. enum Result result = Result_None;
  1413. int activeID = 69, time = 3000; // 活动ID, 超时时间
  1414. // 校验ID
  1415. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1416. // 判断状态
  1417. if(getStatus() == Status_None) // 空闲状态
  1418. {
  1419. sprintf(AT_CMD, "AT+QPOWD=%d\r\r\n", n); // 拼接AT指令
  1420. result = send_at(AT_CMD, activeID);
  1421. }
  1422. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1423. {
  1424. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1425. result = Result_Failed;
  1426. }
  1427. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1428. {
  1429. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1430. result = overtime();
  1431. }
  1432. else if(strstr((char * )AT_result(), "POWERED DOWN\r\n") != NULL) // 查询是否返回
  1433. {
  1434. // 发送日志
  1435. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1436. Log_SendArray_Debug(AT_result(), AT_result_length());
  1437. // 成功结果
  1438. result = success();
  1439. }
  1440. return result;
  1441. }
  1442. /**
  1443. * 解释:关闭模块。同步
  1444. * 关闭模块,关闭后会自动重启。
  1445. * 输入<<
  1446. * n 模块关机方式。0 立即关机;1 正常关机。默认是1
  1447. *
  1448. * activeID 69
  1449. **/
  1450. enum Result bc260y_power_down_sync(uint8_t n)
  1451. {
  1452. enum Result result = Result_None;
  1453. while(1)
  1454. {
  1455. result = bc260y_power_down(n);
  1456. if(result != Result_None)
  1457. {
  1458. // 重置
  1459. bc260y.reset();
  1460. break;
  1461. }
  1462. }
  1463. return result;
  1464. }
  1465. /**
  1466. * 模块是否启动成功
  1467. * 输入<<
  1468. *
  1469. * 输出>>
  1470. *
  1471. **/
  1472. enum Result bc260y_ready(void)
  1473. {
  1474. if(AT_Get_Status() != AT_Status_None)
  1475. {
  1476. return Result_None;
  1477. }
  1478. enum Result result = Result_None;
  1479. // 判断是否接收到
  1480. uint8_t RDY[5]="RDY";
  1481. if(memmem(AT_result(),AT_result_length(),RDY,strlen((char *)RDY)) != 0)
  1482. {
  1483. // 发送日志
  1484. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1485. Log_SendArray_Debug(AT_result(), AT_result_length());
  1486. // 成功结果
  1487. result = Result_Success;
  1488. // 清理一下AT返回结果缓存
  1489. AT_Clear_Result();
  1490. }
  1491. return result;
  1492. }
  1493. /**
  1494. * 查询信号质量
  1495. * 输入<<
  1496. *
  1497. * 输出>>
  1498. * RSRP
  1499. * RSRQ
  1500. * RSSI
  1501. * SINR
  1502. **/
  1503. enum Result bc260y_qeng_servingcell(int * RSRP, int * RSRQ, int * RSSI, int * SINR)
  1504. {
  1505. enum Result result = Result_None;
  1506. int activeID = 71, time = 500; // 活动ID, 超时时间
  1507. // 校验ID
  1508. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1509. // 判断状态
  1510. if(getStatus() == Status_None) // 空闲状态
  1511. {
  1512. //sprintf(AT_CMD, "AT+QENG=\"servingcell\"\r\r\n"); // 拼接AT指令
  1513. sprintf(AT_CMD, "AT+QENG=0\r\r\n"); // 拼接AT指令
  1514. result = send_at(AT_CMD, activeID);
  1515. }
  1516. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1517. {
  1518. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1519. result = failed(); // 失败
  1520. }
  1521. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1522. {
  1523. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1524. setStatus(Status_Overtime); // 超时
  1525. result = Result_Failed; // 结果
  1526. }
  1527. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1528. {
  1529. // 发送日志
  1530. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1531. Log_SendArray_Debug(AT_result(), AT_result_length());
  1532. // 处理返回结果
  1533. // char * saveptr = NULL;
  1534. // char * split = "\r\n";
  1535. char * saveptr_inner = NULL;
  1536. char * split_inner = ",\"";
  1537. strtok_r((char * )AT_result(), split_inner, &saveptr_inner);
  1538. strtok_r(NULL, split_inner, &saveptr_inner);
  1539. strtok_r(NULL, split_inner, &saveptr_inner);
  1540. strtok_r(NULL, split_inner, &saveptr_inner);
  1541. strtok_r(NULL, split_inner, &saveptr_inner);
  1542. * RSRP = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1543. * RSRQ = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1544. * RSSI = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1545. * SINR = atoi(strtok_r(NULL, split_inner, &saveptr_inner));
  1546. // 打印
  1547. Log_Printf_Debug("RSRP: %d, RSRQ: %d, RSSI: %d, SINR: %d\r\n", * RSRP, * RSRQ, * RSSI, * SINR);
  1548. result = success(); // 成功
  1549. }
  1550. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1551. {
  1552. // 发送日志
  1553. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1554. Log_SendArray_Debug(AT_result(), AT_result_length());
  1555. result = failed(); // 失败
  1556. }
  1557. return result;
  1558. }
  1559. enum Result bc260y_qeng_servingcell_sync(int * RSRP, int * RSRQ, int * RSSI, int * SINR)
  1560. {
  1561. enum Result result = Result_None;
  1562. while(1)
  1563. {
  1564. result = bc260y_qeng_servingcell(RSRP, RSRQ, RSSI, SINR);
  1565. if(result != Result_None)
  1566. {
  1567. // 重置
  1568. bc260y.reset();
  1569. break;
  1570. }
  1571. }
  1572. return result;
  1573. }
  1574. /**
  1575. * 查询ICCID
  1576. * 输入<<
  1577. *
  1578. * 输出>>
  1579. * iccid SIM卡卡号
  1580. **/
  1581. enum Result bc260y_query_qccid(char * iccid)
  1582. {
  1583. enum Result result = Result_None;
  1584. int activeID = 75, time = 500; // 活动ID, 超时时间
  1585. // 校验ID
  1586. if(!verifyActiveID(activeID)){ return Result_Failed; }
  1587. // 判断状态
  1588. if(getStatus() == Status_None) // 空闲状态
  1589. {
  1590. sprintf(AT_CMD, "AT+QCCID\r\r\n"); // 拼接AT指令
  1591. result = send_at(AT_CMD, activeID);
  1592. }
  1593. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1594. {
  1595. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1596. result = failed(); // 失败
  1597. }
  1598. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1599. {
  1600. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1601. setStatus(Status_Overtime); // 超时
  1602. result = Result_Failed; // 结果
  1603. }
  1604. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1605. {
  1606. // 发送日志
  1607. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1608. Log_SendArray_Debug(AT_result(), AT_result_length());
  1609. // 处理返回结果
  1610. char * saveptr = NULL;
  1611. char * split = "\r\n";
  1612. // 第一行
  1613. char * Line1 =strtok_r((char * )AT_result(), split, &saveptr);
  1614. // // 第二行
  1615. // char * Line2 = strtok_r(NULL, split, &saveptr);
  1616. // 拆解第二行
  1617. char * saveptr_inner = NULL;
  1618. char * split_inner = ": ,\"";
  1619. strtok_r(Line1, split_inner, &saveptr_inner);
  1620. // 字符串拷贝
  1621. strcpy(iccid, strtok_r(NULL, split_inner, &saveptr_inner));
  1622. // 打印
  1623. Log_Printf_Debug("ICCID: %s\r\n", iccid);
  1624. result = success(); // 成功
  1625. }
  1626. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1627. {
  1628. // 发送日志
  1629. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1630. Log_SendArray_Debug(AT_result(), AT_result_length());
  1631. result = failed(); // 失败
  1632. }
  1633. return result;
  1634. }
  1635. enum Result bc260y_query_qccid_sync(char * iccid)
  1636. {
  1637. enum Result result = Result_None;
  1638. while(1)
  1639. {
  1640. result = bc260y_query_qccid(iccid);
  1641. if(result != Result_None)
  1642. {
  1643. // 重置
  1644. bc260y.reset();
  1645. break;
  1646. }
  1647. }
  1648. return result;
  1649. }
  1650. /**
  1651. * 配置发送数据格式
  1652. * 输入<<
  1653. *n 0数据格式为文本字符串,1为十六进制字符串
  1654. *
  1655. **/
  1656. enum Result bc260y_dataformat(uint8_t n)
  1657. {
  1658. enum Result result = Result_None;
  1659. int activeID = 2, time = 500; // 活动ID, 超时时间
  1660. if(!verifyActiveID(activeID)){ return Result_Failed; } // 校验ID
  1661. // 判断状态
  1662. if(getStatus() == Status_None) // 空闲状态
  1663. {
  1664. sprintf(AT_CMD, "AT+QICFG=dataformat,%d,%d\r\n", n,0); // 拼接AT指令
  1665. result = send_at(AT_CMD, activeID);
  1666. }
  1667. else if(getStatus() != Status_Sending) // 上一次的结果没有清除,返回错误,为了保证时效性,需要重置状态。重新调用
  1668. {
  1669. Log_Printf_Debug("返回结果过期,请重置状态\r\n"); // 打印日志
  1670. result = failed(); // 失败
  1671. }
  1672. else if(getTimerMs() > time) // 正在发送状态。判断超时
  1673. {
  1674. Log_Printf_Debug("AT指令返回超时\r\n"); // 打印日志
  1675. result = overtime(); // 超时
  1676. }
  1677. else if(strstr((char * )AT_result(), "OK\r\n") != NULL) // 查询是否返回
  1678. {
  1679. // 发送日志
  1680. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1681. Log_SendArray_Debug(AT_result(), AT_result_length());
  1682. result = success(); // 成功
  1683. }
  1684. else if(strstr((char * )AT_result(), "ERROR\r\n") != NULL) // 查询是否返回
  1685. {
  1686. // 发送日志
  1687. Log_Printf_Debug("AT返回: %d\r\n", AT_result_length());
  1688. Log_SendArray_Debug(AT_result(), AT_result_length());
  1689. result = failed(); // 失败
  1690. }
  1691. return result;
  1692. }
  1693. /**
  1694. * 配置发送数据格式
  1695. * 输入<<
  1696. *n 0数据格式为文本字符串,1为十六进制字符串
  1697. *
  1698. **/
  1699. enum Result bc260y_dataformat_sync(uint8_t n)
  1700. {
  1701. enum Result result = Result_None;
  1702. while(1)
  1703. {
  1704. result =bc260y_dataformat(n);
  1705. if(result != Result_None)
  1706. {
  1707. // 重置
  1708. bc260y.reset();
  1709. break;
  1710. }
  1711. }
  1712. return result;
  1713. }
  1714. #endif