|
打开串口:
fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY ); //打开COM1
初始化串口:
int setup_com(int fd){
struct termios options;
tcgetattr(fd, &options);
/* Set the baud rates to 9600...*/
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
/* Enable the receiver and set local mode...*/
options.c_cflag |= (CLOCAL | CREAD);
/* Set c_cflag options.*/
options.c_cflag &= ~PARENB; //无校验
options.c_cflag &= ~PARODD;
options.c_cflag &= ~CSTOPB; //1个停止位
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8; //8个数据位
/* Set c_iflag input options */
options.c_iflag &=~(IXON | IXOFF | IXANY);
options.c_iflag &=~(INLCR | IGNCR | ICRNL);
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/* Set c_oflag output options */
options.c_oflag &= ~OPOST; //RAW数据模式
/* Set the timeout options */
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 0;
tcsetattr(fd, TCSANOW, &options); //设置COM参数并立即生效
return 1;
}
其中:
c_cflag : 控制选项
c_lflag : 线选项
c_iflag : 输入选项
c_oflag :输出选项
c_cc :控制字符
c_ispeed :输入数据波特率
c_ospeed :输出数据波特率
c_cflag: CLOCAL 本地模式,不改变端口的所有者
CREAD 表示使能数据接收器
PARENB 表示偶校验
PARODD 表示奇校验
CSTOPB 使用两个停止位
CSIZE 对数据的bit使用掩码
CS8 数据宽度是8bit
c_lflag: ICANON 使能规范输入,否则使用原始数据(本文使用)
ECHO 回送(echo)输入数据
ECHOE 回送擦除字符
ISIG 使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信号
c_iflag: IXON 使能输出软件控制
IXOFF 使能输入软件控制
IXANY 允许任何字符再次开启数据流
INLCR 把字符NL(0A)映射到CR(0D)
IGNCR 忽略字符CR(0D)
ICRNL 把CR(0D)映射成字符NR(0A)
c_oflag: OPOST 输出后处理,如果不设置表示原始数据(本文使用原始数据raw)
c_cc[VMIN]: 最少可读数据
c_cc[VTIME]: 等待数据时间(10秒的倍数)
write(fd,"AT\015\012",4 );
write(fd,"AT+CMGF=1\015\012",11 );
write(fd,"AT+CMGS=\042+2145551212\042,129\015\012", 27);
write(fd,"This is a test. WOW!",19);
close(fd); |
|