当前位置:网站首页>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;
}
边栏推荐
- Design of charging pile mqtt transplantation based on 4G EC20 module
- Working mode of 80C51 Serial Port
- 内存数据库究竟是如何发挥内存优势的?
- 內存數據庫究竟是如何發揮內存優勢的?
- 【順利畢業】[1]-遊覽 [學生管理信息系統]
- Characteristics of PUCCH formats
- Of course, the most widely used 8-bit single chip microcomputer is also the single chip microcomputer that beginners are most easy to learn
- UCI and data multiplexing are transmitted on Pusch - determine the bit number of harqack, csi1 and csi2 (Part II)
- Oracle database SQL statement execution plan, statement tracking and optimization instance
- Windows下MySQL的安装和删除
猜你喜欢

Nr--- Pusch I: sorting out the agreement process

Code word in NR

NR PUCCH format0 sequence generation and detection mechanism

yocto 技术分享第四期:自定义增加软件包支持

Not many people can finally bring their interests to college graduation

单片机学到什么程度能找到工作,这个标准不好量化

Schematic diagram and connection method of six pin self-locking switch

Working mode of 80C51 Serial Port

STM32 port multiplexing and remapping

UCI and data multiplexing are transmitted on Pusch - determine the bit number of harqack, csi1 and csi2 (Part II)
随机推荐
Quelle langue choisir pour programmer un micro - ordinateur à puce unique
Hal library sets STM32 clock
Open Euler Kernel Technology Sharing - Issue 1 - kdump Basic Principles, use and Case Introduction
Happy Dragon Boat Festival—— Zongzi written by canvas~~~~~
2020-08-23
单片机现在可谓是铺天盖地,种类繁多,让开发者们应接不暇
Seven sorting of ten thousand words by hand (code + dynamic diagram demonstration)
我想各位朋友都应该知道学习的基本规律就是:从易到难
Runtime. getRuntime(). GC () and runtime getRuntime(). The difference between runfinalization()
[successful graduation] [1] - visit [student management information system]
[graduation successful] [1] - tour [Student Management Information System]
UCI and data multiplexing are transmitted on Pusch (Part VI) -- LDPC coding
一个可执行的二进制文件包含的不仅仅是机器指令
PIP references domestic sources
【順利畢業】[1]-遊覽 [學生管理信息系統]
Eight working modes of stm32gpio and chip naming rules
I think all friends should know that the basic law of learning is: from easy to difficult
Pymssql controls SQL for Chinese queries
Project cost management__ Topic of comprehensive calculation
Successful graduation [2] - student health management system function development...