tty.c

来自「minigui PDA系统 可实现手机功能」· C语言 代码 · 共 122 行

C
122
字号
/***************************************************************
 *  TTY SERIAL ROUTES 
 *  use ttyS2 to ctrol GPRS
 *  by Qu zheng hang <qu_zhenghang@163.com>   
 *  2008-7-14 
***************************************************************/

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

//默认波特率
#define BAUDRATE B9600

#define COM2 "/dev/ttyS2"

static int fd;
static struct termios oldtio,newtio;

//==============================================================
//初始化串口
int tty_init()
{
	fd = open(COM2, O_RDWR);
	if ( fd < 0 )
	{
		perror(COM2);
		exit(-1);
	}
	
	//保存当前设置
	tcgetattr(fd,&oldtio);
	//从&newtio指针所指的内存地址位置开始,将sizeof(newtio)字节置为0
	bzero(&newtio, sizeof(newtio));
	//memset(&newtio,0x00,sizeof(newtio));
	
	/*控制标志设定,含义如下:             */
	/*BAUDRATE:设定bps的速度              */
	/*CRTSCTS:硬体流量控制*/
	/*CS8:8n1(8位,无校验位,1个终止位)   */
	/*CLOCAL:本地连线,没有主机控制功能   */
	/*CREAD:只能接收字元                  */
	newtio.c_cflag = BAUDRATE | /*CRTSCTS |*/ CS8 /*| CLOCAL | CREAD */;
	newtio.c_iflag = IGNPAR | ICRNL;       /*忽略奇偶校验位,将输入中的回车翻译为新行*/
	newtio.c_oflag = 0;                    /*Raw模式输出*/
	newtio.c_lflag = ICANON;               /*启用标准模式*/
	
	newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */  
	newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */ 
	newtio.c_cc[VERASE]   = 0;     /* del */ 
	newtio.c_cc[VKILL]    = 0;     /* @ */ 
	newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */ 
	newtio.c_cc[VTIME]    = 0;     /* 不使用分割字元组的计时器 */ 
	newtio.c_cc[VMIN]     = 1;     /* 在读取到 1 个字元前先停止 */ 
	newtio.c_cc[VSWTC]    = 0;     /* '\0' */ 
	newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */  
	newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */ 
	newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */ 
	newtio.c_cc[VEOL]     = 0;     /* '\0' */ 
	newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */ 
	newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */ 
	newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */ 
	newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */ 
	newtio.c_cc[VEOL2]    = 0;     /* '\0' */ 
	
	tcflush(fd, TCIFLUSH);         /*刷新收到的数据但是不读*/
	tcsetattr(fd,TCSANOW,&newtio); /*设置新参数*/
	
	return 0;
}

//==============================================================
//读gprs串口数据
int tty_read(char *buf, int nbytes)
{
	return read(fd,buf,nbytes);
}

//==============================================================
//写gprs串口数据
int tty_write(char *buf, int nbytes)
{
	int i;
	
	for(i=0; i<nbytes; i++)
	{
		write(fd,&buf[i],1);
		usleep(100);
	}
	
	return tcdrain(fd);            /*等待直到所有写入 fd 引用的对象的输出都被传输*/	
}

//==============================================================
//写gprs串口命令
int tty_writecmd(char *buf, int nbytes)
{
	int i;
	
	for(i=0; i<nbytes; i++)
	{
		write(fd,&buf[i],1);
		usleep(100);
	}
	write(fd,"\r",1);	
	usleep(300000);	
	
	return tcdrain(fd);
}

//==============================================================
//恢复并关闭gprs串口
int tty_end()
{
	//恢复旧设置
	tcsetattr(fd,TCSANOW,&oldtio);
	//关闭串口
	close(fd);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?