从4G模组读取实时时间代码

1、嵌入式软件研发硬件,当没有RTC时,有4G网络或者有线网络,从网络上获取时间。

2、因目前做一款设备,偶尔服务器不在线,授时不成功,设备是4G设备,那么从4G上获取当前时间显得有些必要。

3、今天简单写了个测试程序,主要部分代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "serial.h"

int getChars(char* source, char* buf)
{
    int i=0,j=0,flag=0;
    while(source[i]!='\0')
    {
        if(flag==0 && source[i]=='\"')
        {
            flag=1;
        }
        else if(flag==1 && source[i]=='\"')
        {
            buf[j]='\0';
            return 1;
        }
        else if(flag==1 && source[i]!='\"')
        {
            buf[j++]=source[i];
        }
        i++;
    }
    return 0;
}
int Buf2Data(char *s, char *time)
{
	int buf_len,j;

	buf_len = strlen(s);
	//如果分解的字符串为空或者长度小于6,则返回 
	if( (s == NULL) || (buf_len <17 ))
	{ 
	   return -1;
 	 }
	char *p = s;
	char *str[2];
	char *str1[3];
	char *q;
	char *l;
	q = strtok(s,",");
	for(j=0;j<2;j++)
	{
	     str[j] = q;
		 q =strtok(NULL,"|");
		 printf("str[%d] is %s\n",j,str[j]);
	}
	l = strtok(str[0],"/");
	
	for(j=0;j<3;j++)
	{			
		 str1[j] = l;
		 l = strtok(NULL,"/");
	}
	for(j=0;j<3;j++)
		{
		time[j] = atoi(str1[j]);
	}
	l = strtok(str[1],":");
	for(j=0;j<3;j++)
	{			
		 str1[j] = l;
		 l = strtok(NULL,":");
	}

	time[3] = atoi(str1[0])+8;
	
	time[4] = atoi(str1[1]);
	time[5] = atoi(str1[2]);

	return 0;
}

int get_Time(char * com_port,int baud)
{
	int tty_fd;
	int readBytes;
	char bufGet[32];
	char time[6];
	tty_fd = InitCom(com_port);
	if(tty_fd < 0)
	{
		printf("open tty error:%s\n",com_port);
		return -1;	
	}
	SetConfig(tty_fd,baud,8,'N',1);
	char buf[512];
	memset(buf,0,512);
	sprintf(buf,"%s","AT+CCLK?\r");
	write(tty_fd,buf,strlen(buf));
	sleep(1);
	memset(buf,0,512);
	readBytes = read(tty_fd,buf,512);
	//printf("the readBytes is %d\n",readBytes);
	close(tty_fd);
	if(getChars(buf,bufGet) < 0)
		return -1;
	
	Buf2Data(bufGet,time);
	printf("get chars is : %s,time:%d %d %d %d %d %d\n",bufGet,time[0],time[1],time[2],time[3],time[4],time[5]);
	return 0;
}

int main(int argc, char *argv[])
{
	if(argc < 2)
		{
		printf("./exec comName baud\n");
		return -1;
		}
	get_Time(argv[1],atoi(argv[2]));
	return 0;
}

4、上面代码只是部分,串口操作部分需要自己去写,或者网上有好多关于串口配置的代码。

### ESP32 S3 连接4G模块并发送AT命令 对于ESP32 S3连接4G模块并通过USB发送AT命令的操作,通常涉及硬件连接配置以及软件编程两大部分。 #### 硬件连接设置 为了使ESP32 S3能够通过USB接口向4G模块发送AT指令,在物理层面上需确保两者之间有正确的串行通信线路相连。一般情况下,这涉及到将ESP32的UART端口与4G模块的数据收发针脚相匹配[^1]。具体来说: - **TXD**(传输数据)引脚应连接到4G模块的RXD; - **RXD**(接收数据)引脚则要接到对方的TXD上; - 同时注意电源供应和地线(GND)之间的良好接触以保障稳定工作状态; 此外,还需确认所选4G模块支持USB转TTL功能以便于后续操作中的电脑调试环节。 #### 软件开发指南 在完成上述电气层面准备工作之后,则可以着手编写程序来实现预期的功能目标——即利用Arduino IDE或其他兼容IDE加载至ESP32上的固件代码执行特定任务。下面给出一段简单的C/C++风格伪代码用于说明如何初始化串口通讯并向指定设备发出查询信号强度(`+CSQ`)请求作为例子: ```cpp #include <HardwareSerial.h> // 创建一个新的硬件序列对象, 使用默认参数(9600波特率) HardwareSerial SerialAT(Serial); void setup() { // 开启ESP32自带的第一个USART通道 Serial.begin(115200); // 初始化第二个串口实例准备对接外部4G模组 SerialAT.begin(9600, SERIAL_8N1, RX_PIN_NUM, TX_PIN_NUM); } void loop() { String response; // 发送获取当前服务小区质量等级(CSQ)信息的命令给SIM卡所在位置处等待回应... sendCommand("AT+CSQ\r\n",response); // 打印返回的结果字符串到监视器窗口里查看实际效果 Serial.println(response); } ``` 此段示范性源码片段展示了怎样创建一个额外的`HardwareSerial`类实体代表除主控台以外另一路独立运作着的异步字符流交换渠道,并调用了成员函数`.begin()`指定了相应的比特率值还有输入/输出管脚编号。接着定义了一个循环体内部用来周期性的尝试读取来自远端节点反馈的消息内容并且显示出来供开发者分析判断之用。 值得注意的是,这里假设读者已经熟悉了基本的单片机编程概念和技术细节,因此省去了某些较为基础的知识点介绍部分。如果希望进一步了解有关于此主题更深入的内容或者遇到任何疑问都可以查阅官方文档资料库获得帮助和支持[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值