记对EHS5串口编程遇到的一个问题, 与串口编程示范

打开CDC-ACM后,

插入EHS5后能看到/dev有出现很多

ttyACM设备,此时,我们可以像串口编程一样使用它

串口测试程序:

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <string.h>
#include <termios.h>

static const char *initGemaltoCmd[]={
	"AT\r\n"
	"AT^SPOW=1,1,1\r\n",
	"ATD13168084836;\r\n",
	"ATD10010;\r\n",
	"AT^SICS=0,conType,GPRS0\r\n",    //5

	"AT^SICS=0,APN,\"internet\"\r\n", 

	"AT^SISS=1,srvType,socket\r\n",
	"AT^SISS=1,conID,0\r\n",
	"AT^SISS=1,address,\"sockudp://54.84.26.193:1234\"\r\n",
	"AT^SISO=1\r\n",                  //10
	"AT^SISC=1\r\n",                 
	"AT^SISW=1,34\r\n",          //12
	"AT^SISW=1,100,0\r\n",
	"AT^SISR=1,1\r\n",               
	"AT^SISR=1,51\r\n",			  // 15 
	"AT^SISR=1,50\r\n",              //16	
	"AT^SISR=1,0\r\n",
	"AT+CSQ\r\n", 
	"AT+GSN\r\n",
	"AT^SISX=\"ping\",0,registration.securenettech.com,1,200\r\n"
};

int main(int argc, char *argv[]){
	int fd[7];
	fd[0] = open("/dev/ttyACM0", O_RDWR|O_NOCTTY|O_NDELAY);
	fcntl(fd[0], F_SETFL, 0);

	//串口
	struct termios option;
	//tcgetattr 使fd指向option结构体
	tcgetattr(fd[0], &option);
	tcflush(fd[0], TCIOFLUSH);
	//设置波特率
	cfsetospeed(&option, B115200);
	cfsetispeed(&option, B115200);
	//修改控制模式,使程序不会占用串口,使程序能够从串口内读入数据
	option.c_cflag |= (CLOCAL|CREAD);


	
	//不使用流控制
	option.c_cflag &= ~CRTSCTS;

	//设置数据位
	option.c_cflag &= ~CSIZE; 	//屏蔽其他标志位
	option.c_cflag |= CS8;
	//设置校验位
	option.c_cflag &= ~PARENB;
	option.c_iflag &= ~INPCK;


	//设置停止位
	option.c_cflag &= ~CSTOPB;
	
	//修改输出模式,输入回显打开
	option.c_iflag &= (ICANON|ECHO|ECHOE|ISIG);
	option.c_oflag &= ~OPOST; 

	//设置等待诗句和最小接收字符
	option.c_cc[VTIME] = 1;
	option.c_cc[VMIN] = 1;
	tcflush(fd[0], TCIFLUSH);//如果发生数据一处,接收数据,但不再读取
	tcsetattr(fd[0], TCSANOW, &option);

	int i = 3;
	char buf[250];
	while(i > -1){
		int k;
		write(fd[0], initGemaltoCmd[i], strlen(initGemaltoCmd[i]));
		tcflush(fd[0], TCIFLUSH);
		memset(buf, 0, sizeof(buf));
		k = read(fd[0], buf, sizeof(buf));
		printf("len=%d,rec:%s\n", k, buf);//回显的内容
		k = read(fd[0], buf, sizeof(buf));
		printf("len=%d,rec:%s\n", k, buf);//回复的内容
		i--;
	}
	return 0;
}

由于回显问题,

如果串口没有设置回显,那么读数据时会出现混乱的样子,类似于

PC: AT

EHS5:T

EHS5:

EHS5:OK

而设置为回显后,则是

PC:AT

EHS5:AT

EHS5:0K

深入了解

    EHS5使用AT命令默认打开回显

    使用ATE0即可关闭回显,不过还是会有一个额外的回车,即打开关闭回显感觉不会很大

猜你喜欢

转载自my.oschina.net/u/3142241/blog/857529