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 + -
显示快捷键?