欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux 下的串口编程

程序员文章站 2024-01-23 14:52:10
...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc,char *argv[])
{
	int fd = open(argv[1],O_RDWR|O_NOCTTY|O_NONBLOCK);
	if(fd < 0){
		perror("open tty");
		return -1;
		}
	
//	struct termios
//  {
//    tcflag_t c_iflag;		/* input mode flags */
//    tcflag_t c_oflag;		/* output mode flags */
//    tcflag_t c_cflag;		/* control mode flags */
//    tcflag_t c_lflag;		/* local mode flags */
//    cc_t c_line;		/* line discipline */
//    cc_t c_cc[NCCS];		/* control characters */
//  };
	//下面所有的 &=~ 都是disable 的意思
	//下面 |= 的是enable的意思
	int usartFd = fd;
	struct	termios oldopts ,opts;

	/*Put the state of FD into *TERMIOS_P*/
	fcntl(fd,F_GETFD,0);
	tcgetattr(fd, &oldopts);

	/* Set both the input and output baud rates stored in *TERMIOS_P to SPEED.  */
	fcntl(fd, F_SETFL, 0);
	cfsetispeed(&opts, B115200);
	cfsetispeed(&opts, B115200);

	/* Enable receiver. Ignore modem status lines. */
	opts.c_cflag |= CREAD|CLOCAL;
	/* Number of bits per byte (mask).  */
	opts.c_cflag &= ~CSIZE;
	opts.c_cflag |= CS8;

	/*disable Parity enable.  */
	opts.c_cflag &= ~PARENB;
	/*disable Two stop bits instead of one.  */
	opts.c_cflag &= ~CSTOPB;
	/*disable flow control */
	opts.c_cflag &= ~CRTSCTS;

	/*disable Do erase and kill processing.  */
	/* disable echo.  */
	/* disable signals.  */
	opts.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
	/*disable Perform output processing.  */
	opts.c_oflag &= ~OPOST;
	/* TCSANOW -> Change immediately.  */
	tcsetattr(fd,TCSANOW , &opts);
	char *s = "poweroff";
	char *enter = "\n";
	int ret = write(fd,s,strlen(s));
	ret = write(fd,enter,strlen(enter));
	if(ret < 0){
		perror("write cmd\n");
		return -2;
		}
	
	close(fd);
	return 0;
}