当前位置:网站首页>4G module at command communication package interface designed by charging pile
4G module at command communication package interface designed by charging pile
2022-07-03 09:59:00 【Wukong is so timid】
/********************************************************************
* name : AT_cmd
* function : send data at Command and get the results
* Entrance parameters : cmd:at command cmd_len:len
* ret_buf:result buf_len:result len
*
* Export parameters : The correct return is 0, The error is returned as -1
*******************************************************************/
#define LTE_MAX_TRY_TIME (2) // Reading serial port may fail , Try at most 3 Time
#define UART2_AT_COMMAND_TIMEOUT (5*1000)
uint8_t cur_at_rec_len = 0;
int AT_cmd(uint8_t *cmd, uint8_t cmd_len, uint8_t *rcv_buf, uint8_t* rcv_len)
{
// int fd = -1; // File descriptor
// char rcv_buf[512] = {0};
//char send_buf[UART2_TX_BUFFER_LEN]= {0};
// int rcv_len = 0;
int count = 0;
int ret = -1;
uint16_t send_len = 0;
cur_at_rec_len = *rcv_len;
uint32_t flags = 0;
if(NULL == cmd || cmd_len == 0)
{
printf("at err:cmd is NULL\n");
return -1;
}
if(NULL == rcv_buf || rcv_len == NULL)
{
printf("at err:cmd is NULL\n");
return -1;
}
if (cmd_len >= UART2_TX_BUFFER_LEN)
{
printf("at err:cmd is too long =%d\n",cmd_len);
return -1;
}
// printf("**cmd=%s,cmd_len=%d ,strlen(cmd)=%d**\r\n",cmd,cmd_len,strlen(cmd));
// snprintf(send_buf, sizeof(send_buf), "%s\r", cmd);
// memcpy(send_buf,cmd,strlen(cmd));
// while (count < LTE_MAX_TRY_TIME)
{
//tcflush(fd,TCIOFLUSH);
//printf("send at=%s len=%d\r\n",send_buf,strlen(send_buf));
//uart2_dma_send_data(RxBuffer1,RxCounter1-len);
if(cur_at_rec_len != 0)
{
printf("cur_at_rec_len=%d\r\n",cur_at_rec_len);
USART_ITConfig(USART2, USART_IT_IDLE, DISABLE);
USART_DMACmd(USART2, USART_DMAReq_Rx, DISABLE);// close DMA receive
DMA_Cmd(DMA1_Channel6, DISABLE);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
}
send_len = uart2_dma_send_data(cmd,cmd_len);
printf("send start(%s) and rx start,a=%d n=%d\r\n",cmd,send_len,cmd_len);
flags = EVENT_FLAGS_UART2_TX_COMPLETE|EVENT_FLAGS_UART2;
printf("*****osEventFlagsWait s flags =0x%08x %d\r\n",flags,get_curtime());
flags =osEventFlagsWait(evt_id_uart, flags, osFlagsWaitAll, UART2_AT_COMMAND_TIMEOUT);
//flags =osEventFlagsWait(evt_id_uart, EVENT_FLAGS_UART2, osFlagsWaitAny, osWaitForever);
//rx at command response from 4g module
printf("*****osEventFlagsWait e flags =0x%08x %d\r\n",flags,get_curtime());
//if(flags == EVENT_FLAGS_UART2_TX_COMPLETE)
//{
//printf("send at end,rx...\r\n");
//}
if( (flags &EVENT_FLAGS_UART2_TX_COMPLETE) == EVENT_FLAGS_UART2_TX_COMPLETE)
printf("send end\r\n");
else
printf("send fail send_len =%d, cmd_len =%d\r\n",send_len, cmd_len);
//if( (flags &EVENT_FLAGS_UART2) == EVENT_FLAGS_UART2)
// printf("rx end\r\n");
// if(send_len == cmd_len)
if( (flags &EVENT_FLAGS_UART2) == EVENT_FLAGS_UART2)
{
//printf("rx...\r\n");
//uint32_t flags =osEventFlagsWait(evt_id_uart, EVENT_FLAGS_UART2, osFlagsWaitAll, UART2_AT_COMMAND_TIMEOUT);
//UART2_AT_COMMAND_TIMEOUT);
//rx at command response from 4g module
//printf("*****osEventFlagsWait flags =0x%08x\r\n",flags);
printf("rx 11 end\r\n");
if(cur_at_rec_len != 0)
{
printf("cur_at_rec_len=%d\r\n",cur_at_rec_len);
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);// Turn on DMA receive
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
}
//if(flags == EVENT_FLAGS_UART2)
{
//printf("uart2 rx at command response from 4g moduler\r\n");
uart2_rec_at_cmd_response(rcv_buf,rcv_len);
// printf("at recv data is %s\r\n", rcv_buf);
/* Yes OK Indicates that the received data is correct */
if (strlen((const char*)rcv_buf) > 0 && strstr((const char*)rcv_buf, "OK"))
{
printf("rx 11 ok\r\n");
ret = 0;
// break;
}
else
{
printf("at err:recv invalid data is %s\r\n", rcv_buf);
}
}
//else
// {
// printf("send at command,but 4g moduler no response\r\n");
// printf("at err:recv failed =0x%08x\r\n",flags);
//}
}
else
{
printf("at err:rx failed\n");
}
count++;
}
//sleep(1);
return ret;
}
//bool sim800c_send_cmd(char *cmd_data, char *ack, uint8_t retry, uint32_t time_out)
int at_cmd_ack(uint8_t *cmd, uint16_t cmd_len, uint8_t *rcv_buf,uint8_t* rcv_len,uint8_t *ack, uint32_t time_out)
{
// int count = 0;
int ret = -1;
uint16_t send_len = 0;
uint32_t flags = 0;
if(NULL == cmd || cmd_len == 0)
{
printf("at err:cmd is NULL\n");
return -1;
}
if(NULL == rcv_buf || rcv_len == NULL)
{
printf("at err:cmd is NULL\n");
return -1;
}
if (cmd_len >= UART2_TX_BUFFER_LEN)
{
printf("at err:cmd is too long cmd_len=%d\n",cmd_len);
return -1;
}
cur_at_rec_len = *rcv_len;
if(ack == NULL)
{
ret = AT_cmd(cmd, cmd_len, rcv_buf, rcv_len);
return ret;
}
else
{
send_len = uart2_dma_send_data(cmd,cmd_len);
printf("send start(%s) and rx start,a=%d n=%d\r\n",cmd,send_len,cmd_len);
osDelay(100);
flags = EVENT_FLAGS_UART2_TX_COMPLETE|EVENT_FLAGS_UART2;
flags =osEventFlagsWait(evt_id_uart, flags, osFlagsWaitAll, UART2_AT_COMMAND_TIMEOUT);
printf("*****osEventFlagsWait flags =0x%08x t=%d\r\n",flags,get_curtime());
if( (flags &EVENT_FLAGS_UART2_TX_COMPLETE) == EVENT_FLAGS_UART2_TX_COMPLETE)
printf("send end\r\n");
else
{
printf("send fail send_len =%d, cmd_len =%d\r\n",send_len, cmd_len);
goto out;
}
if( (flags &EVENT_FLAGS_UART2) == EVENT_FLAGS_UART2)
{
uart2_rec_at_cmd_response_check_ack(rcv_buf,rcv_len,ack);
printf("rx 1 end,ack=%s,rcv_len=%d\r\n",ack,*rcv_len);
//uart2_rec_at_cmd_response(rcv_buf,rcv_len);
/* Yes OK Indicates that the received data is correct */
//strstr
//if (strlen((const char*)rcv_buf) > 0 && strstr((const char*)rcv_buf, (const char*)ack))
if (strlen((const char*)rcv_buf) > 0 && dx_memmem((char*)rcv_buf, *rcv_len,(char*)ack,strlen((const char*)ack))>=0)
{
ret = 0;
printf("rx 1 ok\r\n");
goto out;
}
//else if (strlen((const char*)rcv_buf) > 0 && dx_memmem((const char*)rcv_buf, rcv_len,"+QIURC: \"recv\",0",strlen(ack))
else if (strlen((const char*)rcv_buf) > 0 && strstr((const char*)rcv_buf, "+QIURC: \"recv\",0"))
{
ret = 1;
printf("rx 2 ok,need to get\r\n");
goto out;
}
else if (strlen((const char*)rcv_buf) > 0 && strstr((const char*)rcv_buf, "+QIURC: \"pdpdeact\","))
{
ret = 2;
printf("rx 3 ok,but error\r\n");
goto out;
}
else
{
ret = -2;
//printf("at err:recv no ack data is %s ,times=%d\n", rcv_buf,times);
printf("at err:recv len=%d,no ack data is %s\r\n", *rcv_len,rcv_buf);
printf("strlen((const char*)rcv_buf)=%d\r\n",strlen((const char*)rcv_buf));
#if 1
int i =0;
for(i=0; i<*rcv_len; i++)
{
printf("0x%02x,",rcv_buf[i]);
if((i+1)%10 == 0)
printf("\r\n");
}
printf("\r\n");
#endif
}
}
//{
printf("rec_wait..\r\n");
unsigned int times = time_out/1000;
rec_wait:
// reset_uart2_rx_buffer();
#if (UART2_RX_DMA ==1)
// DMA_Enable(DMA1_Channel6,UART2_RX_BUFFER_LEN);// Turn on the next time DMA receive
#endif
while(times)
{
times --;
uint32_t flags =osEventFlagsWait(evt_id_uart, EVENT_FLAGS_UART2, osFlagsWaitAll, 1000);
//UART2_AT_COMMAND_TIMEOUT);
//rx at command response from 4g module
printf("*****osEventFlagsWait flags =0x%08x t=%d\r\n",flags,get_curtime());
if( flags == EVENT_FLAGS_UART2)
{
//printf("uart2 rx at command response from 4g moduler\r\n");
uart2_rec_at_cmd_response_check_ack(rcv_buf,rcv_len,ack);
//uart2_rec_at_cmd_response(rcv_buf,rcv_len);
/* Yes OK Indicates that the received data is correct */
if (strlen((const char*)rcv_buf) > 0 && strstr((const char*)rcv_buf, (const char*)ack))
{
ret = 0;
printf("rx 4 ok\r\n");
break;
}
else if (strlen((const char*)rcv_buf) > 0 && strstr((const char*)rcv_buf, "+QIURC: \"recv\",0"))
{
ret = 1;
printf("rx 5 ok,need to get\r\n");
goto out;
}
else if (strlen((const char*)rcv_buf) > 0 && strstr((const char*)rcv_buf, "+QIURC: \"pdpdeact\","))
{
ret = 2;
printf("rx 6 ok,but error\r\n");
goto out;
}
else
{
ret = -2;
printf("at err:recv no ack data is %s ,times=%d\n", rcv_buf,times);
goto rec_wait;
}
}
else
{
ret = -3;
printf("send at command,but 4g moduler no response\r\n");
printf("at err:recv failed =0x%08x ,times=%d\r\n",flags,times);
}
}
//}
//count++;
}
out:
reset_uart2_rx_buffer();
#if (UART2_RX_DMA ==1)
DMA_Enable(DMA1_Channel6,UART2_RX_BUFFER_LEN);// Turn on the next time DMA receive
#endif
//sleep(1);
return ret;
}
边栏推荐
- 2020-08-23
- STM32 interrupt priority management
- 【顺利毕业】[1]-游览 [学生管理信息系统]
- 要选择那种语言为单片机编写程序呢
- Schematic diagram and connection method of six pin self-locking switch
- 自動裝箱與拆箱了解嗎?原理是什麼?
- Basic knowledge of MySQL database (an introduction to systematization)
- Project cost management__ Cost management technology__ Article 8 performance review
- Simple use of MySQL (addition, deletion, modification and query)
- Stm32f407 key interrupt
猜你喜欢
Hal library sets STM32 clock
el-table X轴方向(横向)滚动条默认滑到右边
内存数据库究竟是如何发挥内存优势的?
MYSQL数据库底层基础专栏
Gpiof6, 7, 8 configuration
一个可执行的二进制文件包含的不仅仅是机器指令
嵌入式本来就很坑,相对于互联网来说那个坑多得简直是难走
Stm32f407 key interrupt
[Li Kou brush question notes (II)] special skills, module breakthroughs, classification and summary of 45 classic questions, and refinement in continuous consolidation
学习开发没有捷径,也几乎不存在带路会学的快一些的情况
随机推荐
IDEA远程断点调试jar包项目
【男保姆式】教你打开第一个微信小程序
STM32 general timer output PWM control steering gear
Quelle langue choisir pour programmer un micro - ordinateur à puce unique
2021-01-03
Project cost management__ Plan value_ Earned value_ Relationship among actual cost and Countermeasures
CEF下载,编译工程
Design of charging pile mqtt transplantation based on 4G EC20 module
单片机职业发展:能做下去的都成牛人了,熬不动就辞职或者改行了
Stm32 NVIC interrupt priority management
要選擇那種語言為單片機編寫程序呢
STM32 running lantern experiment - library function version
Fundamentals of Electronic Technology (III)_ Chapter 2 principle of amplification circuit__ Crystal triode and field effect triode
[untitled] proteus simulation of traffic lights based on 89C51 Single Chip Microcomputer
Openeuler kernel technology sharing - Issue 1 - kdump basic principle, use and case introduction
STM32 serial port usart1 routine
STM32 general timer 1s delay to realize LED flashing
Getting started with JMX, MBean, mxbean, mbeanserver
yocto 技术分享第四期:自定义增加软件包支持
没有多少人能够最终把自己的兴趣带到大学毕业上