完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
现在NB-IOT模组应用越来越流行,经常需要进行AT指令的配置,AT指令配置又涉及到字符串的处理,经过小编摸爬滚打几个模组后,终于找到了快捷的操作AT指令和编写自己AT指令的办法,在此向大家分享,如有问题还望指出修正,谢谢大家!
一、调两个头文件 #include #include 二、重定义串口 “printf” //串口重定义 int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (unsigned char *)&ch, 1, 0xFFFF); return ch; } 三、定义全局变量 uint8_t rx_buff[256]; //uart receive buff uint8_t rx_data; //uart receive data value uint8_t rx_count =0; //uart receive data count char *str1; //AT commnd string pointer char *str2; char imei[20]; 四、串口中断函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART1) { rx_buff[rx_count]= rx_data; rx_count ++; HAL_UART_Receive_IT(&huart1,&rx_data,1); } } 五、主函数main的内容 while (1) { str1 = (char *)rx_buff; //get uart data //"ATrn" command *************************** //如果串口缓存中有“AT”字符串,那么打印 “AT TEST OK” if(strstr(str1, "AT") != NULL) { printf("rnAT TEST OKrn"); rx_count = 0; //clear buff data //清除数组数组,全部赋值为 零 memset((char *)rx_buff, 0, strlen((const char*)rx_buff)); } else { //get IMEI //如果串口缓存中有“IMEI”字符串,那么执行以下语句 str2 = strstr(str1, "IMEI"); if( str2!= NULL) //"IMEI:123456000000789" command { //pirntf receive all data //打印接收到的IMEI数据段 printf("rnreceive data:%srn",str2); //pirntf receive all data //get IMEI //取出IMEI数据,从第6开始,取出后面15位数据 strncpy((char*)(imei), (char*)(&str2[5]), 15); printf("IMEI:%srn",imei); rx_count = 0; memset((char *)rx_buff, 0, strlen((const char*)rx_buff)); //clear buff data 0 } } //LED闪烁查看单片机运行状态 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); HAL_Delay(500); } 六、展示效果 最后送上大家喜欢的,直接上源码,_ 路径:WL-open-projects/STM32/at-demo-20200607-1610.rar ------------------------------------------------------------------------------------- 本段取出字符串中间的一段数据的方法; void uart_testfunction(void) { char *str1 = NULL; //AT commnd string pointer char *str2 = NULL; char userData[256]; //定义数组 char *pcBegin = NULL; char *pcEnd = NULL; if(uart1_state.bits.interrupt_idle == ON) { uart1_state.bits.interrupt_idle = OFF; printf("rn串口1接收数据:%srn",uart1_data.uart1_rxbuff); //接收到的字符串 //Open source and win each other filename=uarttestfile.txt //Learn from each other str1 = (char *)uart1_data.uart1_rxbuff; //取出串口数据 str2 = strstr(str1, "filename="); //取出”filename=“以后的字符串 if(str2 != NULL) //对比存在需要的数据 { pcBegin = strstr(str2, "filename="); //str2:获取需要以后的数据 pcEnd = strstr(str2, "Learn"); //找到结束符,实际测试不能用换行符,直接查看英文字符吧 pcBegin += 9; //补偿”filename=“长度的地址位 if((pcBegin != NULL) && (pcEnd != NULL)) //开始和结束都有对应的字符 { memcpy(userData, pcBegin, (pcEnd-pcBegin)); //从pcBegin地址开始,复制出(pcEnd-pcBegin)个数据 } printf("文件名:%srn",userData); //打印字符串 memset((char *)uart1_data.uart1_rxbuff, 0, strlen((const char*)uart1_data.uart1_rxbuff)); //clear buff data 0 } } } 串口发送的字符串1: Open source and win each other filename=uarttestfile.txt Learn from each other 串口发送的字符串2: Open source and win each other filename=uarttest123456789file.txt Learn from each other 源码在上面的github中,文件名是: “demo-adc-vet6-串口读取字符串中的任意数据” |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1641 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1562 浏览 1 评论
990 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
691 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1610 浏览 2 评论
1869浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
655浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
525浏览 3评论
541浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
514浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 16:23 , Processed in 0.843943 second(s), Total 78, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号