bc260.c 46 KB

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