[发送AT指令配置a7670C模块上网]

发送AT指令配置a7670C模块上网

内核配置

概要:基于rv1126平台调试SIMCOM 7670C 4G模块。
1,内核配置及内核代码修改
1.1按照芯片data sheet修改kernel代码,添加PID和VID。
此处根据不同的芯片按照其datasheet进行修改。
在这里插入图片描述
1.2 内核配置修改
1.2.1 打开USB gadget的RNDIS功能
在这里插入图片描述
1.2.2使能 USB 串口 GSM、CDMA 驱动
在这里插入图片描述
1.2.3,使能USB network,配置rndis host
在这里插入图片描述

调试验证

2.1 如果内核配置和代码修改正确,设备启动后,ifconfig -a可以看到usb0节点
在这里插入图片描述
2.2 用AT指令测试4G模块与主控是否通讯正常
发送如下指令,如果看到回复OK,就证明4G模块与主控通讯正常。
至此驱动层应该算调试OK了。
cat /dev/ttyUSB2 &
echo -e “at\r\n”>/dev/ttyUSB2
在这里插入图片描述

应用的编写

fd_Card1 = open("/dev/ttyUSB1", O_RDWR);//打开4G USB串口节点
iot_tty_set_speed(st_tty.fd_net, 115200);			//串口配置,关回显
iot_tty_set_Parity(st_tty.fd_net, 8, 'N', 1);
//AT指令发送的函数
iot_tty_send(&st_tty, "AT+CSQ\r\n", &errcode, buf);
int iot_tty_send(tty_dev_t *tty, char *cmd, int *errcode, char *result)
{
	char buf[MAX_AT_SIZE];
	fd_set	rdfds;
	struct timeval tv;
	int count = 0;		//记录超时次数,多次无法获取结果直接退出了,避免发生阻塞
	int i;
	int ret;
	
	int error_cnt = 0;
	BOOL bRecv = FALSE;		//是否已经接收过数据
	char *ptr = NULL;
	char cmd_tmp[64] = {0};		//去掉AT和? \r\n 只保留参数
	
	*errcode = 0;	
	if((ptr=strstr(cmd, "\r")) != NULL)
	{
		memcpy(cmd_tmp, cmd, ptr - cmd);		//去掉 \r
	}
	if((ptr=strstr(cmd_tmp, "?")) != NULL)
	{
		*ptr = '\0';
	}
	if((ptr=strstr(cmd_tmp, "AT")) != NULL)		//去掉AT
	{
		sprintf(cmd_tmp, "%s",ptr + 2);
	}
	printf("send_at_cmd %s\n", cmd);
	pthread_mutex_lock(&tty->mutex);
	if(tty->fd_net > 0)
	{
		BOOL result_flag = FALSE;		//用来判断是否获取到了所需要的命令
		count = 0;
		memset(buf, 0, sizeof(buf));
		ret = write(tty->fd_net, cmd, strlen(cmd));
		if(ret==-1)
		printf("[lxr_test_send_at_cmd_fail][func=%s][LINE=%d]\n",__func__,__LINE__);
		
		while((strstr(buf, "OK") == NULL && strstr(buf, "ERROR") == NULL) || (!result_flag))	//当返回结果存在ok/error,并且获取到对应命令的结果的时候才退出
		{
			memset(buf, 0, sizeof(buf));
			FD_ZERO(&rdfds);
			FD_SET(tty->fd_net, &rdfds);
			tv.tv_sec = 20;
			tv.tv_usec = 0;
			//printf("[lxr_test_message][func=%s][LINE=%d]\n",__func__,__LINE__);
			ret = select(tty->fd_net + 1, &rdfds, NULL, NULL, &tv);
			//printf("[lxr_test_message][func=%s][LINE=%d]\n",__func__,__LINE__);
			if(ret == 0)
			{
				mlog_write("4G module command executes timeout:%s",cmd_tmp);
				printf("select %d, bRecv:%d, count:%d\n", ret, bRecv, count);
				if(bRecv || (count >= 5))		//(已经接收过数据了,后续仍然有超时) 或者 (超时次数过多),则认为此次命令无ok或者error返回,当出错处理
				{
					*errcode = -1;
					break;;
				}
				else
				{
					write(tty->fd_net, cmd, strlen(cmd));
				}
				count ++;
				continue;
			}
			else if(ret < 0)
			{
				printf("select %d\n", ret);
				pthread_mutex_unlock(&tty->mutex);
				return DEV_TTY_SEND_ERR;
			}
			ret = read(tty->fd_net, buf, 128);
			if(ret == 0)
			{
				error_cnt++;
				if(error_cnt > 3)		//可能是wifi模块被硬件复位了,这里只重新打开USB节点
				{	//这里只重新打开节点
					printf("AT read failed error_cnt:%d\n", error_cnt);
					pthread_mutex_unlock(&tty->mutex);
					return DEV_TTY_SEND_ERR;
				}
			}
			else
			{
				error_cnt = 0;
			}
			bRecv = TRUE;
			
			printf("line:%d AT ret = %d buf:%s,\n",__LINE__, ret, buf);			//这里如果一定数量出错时,重新打开USB试试。

			ptr=strstr(buf, cmd_tmp);
			if(ptr != NULL)
			{
				result_flag = TRUE;
				if(result)
				{
					memcpy(result, ptr, strlen(ptr));
				}
			}
			
			if((ret == 1 && strcmp(buf, "\n") == 0) 
				|| (strstr(buf, "ZLTENOCELL") != NULL)
				|| (strstr(buf, "CREG") != NULL)
				|| (strstr(buf, "CGREG") != NULL)
				|| (strstr(buf, "CEREG") != NULL)
				)		//换行和特定信号过滤
				continue;
		}
		
		

		
		if(strstr(buf, "ERROR") != NULL)
		{
			ret = sscanf(buf, "%*[^0-9]%d", errcode);
			if(!*errcode)
				*errcode = -1;
			
		//	printf("串口返回错误:%s!", buf);
			//mlog_write("Abnormal operation of 4G module:%s:%d",cmd_tmp, errcode);
			printf("AT failed :%d--%s\n", *errcode,buf);
		}
		

	}
	else
	{
		printf("ERROR ERROR ERROR !!! ====== tty->fd_net error\n");
		pthread_mutex_unlock(&tty->mutex);
		return -1;
	}
	pthread_mutex_unlock(&tty->mutex);
	
	return 0;
}

AT的指令的使用

send_at_cmd AT+CEREG?

line:113 AT ret = 31 buf:AT+CEREG? //获取服务状态
+CEREG: 0,1

OK
,
srv_status[1]
svr_mode->srv_status = Normal Service

send_at_cmd AT+CPIN? //卡是否正常

line:113 AT ret = 31 buf:AT+CPIN?
+CPIN: READY

OK
,
svr_mode->bSim = 1
send_at_cmd AT+CPSI? //判断网络模式

line:113 AT ret = 99 buf:AT+CPSI?
+CPSI: LTE,Online,460-00,0x2799,225199169,124,EUTRAN-BAND34,36275,3,0,16,31,31,3

OK
,
svr_mode->mode = 4G
send_at_cmd AT+CICCID//获取CCID号

line:113 AT ret = 48 buf:AT+CICCID 
+ICCID: 89860040192032676363

OK
,
iccid_tmp:89860040192032676363 len=20
//下面是获取信号强度的AT指令
send_at_cmd AT+CSQ

line:113 AT ret = 28 buf:AT+CSQ
+CSQ: 16,99

OK
,
rssi:-101dBm, act:99
====>>>stat:Normal Service
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,需要了解SIMCOM A7670C是一款基于3G网络的通信模块,需要使用串口进行通信。因此,我们需要编写一个C语言的串口驱动程序来控制SIMCOM A7670C模块。 以下是一个简单的串口驱动程序示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> #define BAUDRATE B115200 #define MODEMDEVICE "/dev/ttyUSB0" #define _POSIX_SOURCE 1 int open_serial_port() { int fd; struct termios newtio; fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY); if (fd < 0) { perror("open_serial_port: Unable to open serial port"); exit(1); } memset(&newtio, 0, sizeof(newtio)); newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; newtio.c_lflag = 0; newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 1; tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio); return fd; } void write_serial_port(int fd, char *data) { int len = strlen(data); write(fd, data, len); } void read_serial_port(int fd, char *buffer, int buffer_size) { int bytes_read = read(fd, buffer, buffer_size); buffer[bytes_read] = '\0'; } int main() { int fd = open_serial_port(); char *command = "AT\r\n"; write_serial_port(fd, command); char response[256]; read_serial_port(fd, response, sizeof(response)); printf("Response: %s\n", response); close(fd); return 0; } ``` 这个驱动程序打开了一个串口设备文件,设置了波特率和其他串口参数,然后可以通过write_serial_port函数写入AT指令,通过read_serial_port函数读取SIMCOM A7670C模块的响应。 这只是一个简单的示例,你需要根据具体的需求来修改和完善代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I&You

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值