linux串口操作例子

https://blog.csdn.net/morixinguan/article/details/80898172?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159187175619725219943733%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159187175619725219943733&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-1-80898172.pc_v1_rank_blog_v1&utm_term=C%E8%AF%AD%E8%A8%80%E4%B8%B2%E5%8F%A3%E5%BA%94%E7%94%A8

https://blog.csdn.net/qq_37858386/article/details/79940256?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase

阻塞方式讀取

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

int set_opt(int,int,int,char,int);
void main()
{
	int fd,nByte,flag=1;
	char *uart3 = "/dev/ttyS0";
	char buffer[512];
	char *uart_out = "Please input,waiting....\r\n";
	char *uart_demo = "Linux uart demo\r\n";
	char huan[] = "\r\n";
	memset(buffer, 0, sizeof(buffer));
	if((fd = open(uart3, O_RDWR|O_NOCTTY))<0)//默認爲阻塞讀方式
		//if((fd = open(uart3, O_RDWR|O_NONBLOCK))<0)//非阻塞讀方式
		printf("open %s is failed",uart3);
	else{
		set_opt(fd, 115200, 8, 'N', 1);
		write(fd,uart_demo, strlen(uart_demo));
		write(fd,uart_out, strlen(uart_out));
		while(1){
			bzero(buffer, sizeof(buffer));
			nByte = read(fd, buffer, 512);
			if(nByte>0){
				buffer[nByte] = '\0';	
				printf("%s", buffer);	
				fflush(stdout);
				if(buffer[nByte-1] == '\r' || buffer[nByte-1] == '\n') {
					printf("\n");
					write(fd,huan,strlen(huan));	
				}
				write(fd,buffer,strlen(buffer));
				memset(buffer, 0, strlen(buffer));
				nByte = 0;
			} else {
				printf("zero\n");	
			}
			usleep(200*1000);
		}
	}
}


int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
	struct termios newtio,oldtio;

	//硬件流控如果有的話
	newtio.c_cflag |= CRTSCTS;
	//關閉硬件流控
	//newtio.c_cflag &= ~CRTSCTS;
	if  ( tcgetattr( fd,&oldtio)  !=  0) { 
		perror("SetupSerial 1");
		return -1;
	}
	bzero( &newtio, sizeof( newtio ) );
	newtio.c_cflag  |=  CLOCAL | CREAD;
	newtio.c_cflag &= ~CSIZE;

	switch( nBits )
	{
		case 5:
			newtio.c_cflag |= CS5;
			break;
		case 6:
			newtio.c_cflag |= CS6;
		case 7:
			newtio.c_cflag |= CS7;
			break;
		case 8:
			newtio.c_cflag |= CS8;			
			break;
		default:
			newtio.c_cflag |= CS8;			
			break;
	}

	switch( nEvent )
	{
		case 'O':
			newtio.c_cflag |= PARENB;
			newtio.c_cflag |= PARODD;
			newtio.c_iflag |= (INPCK | ISTRIP);
			break;
		case 'E': 
			newtio.c_iflag |= (INPCK | ISTRIP);
			newtio.c_cflag |= PARENB;
			newtio.c_cflag &= ~PARODD;
			break;
		case 'N':  
			newtio.c_cflag &= ~PARENB;
			break;
	}

	switch( nSpeed )
	{
		case 2400:
			cfsetispeed(&newtio, B2400);
			cfsetospeed(&newtio, B2400);
			break;
		case 4800:
			cfsetispeed(&newtio, B4800);
			cfsetospeed(&newtio, B4800);
			break;
		case 9600:
			cfsetispeed(&newtio, B9600);
			cfsetospeed(&newtio, B9600);
			break;
		case 57600:
			cfsetispeed(&newtio, B57600);
			cfsetospeed(&newtio, B57600);
			break;			
		case 115200:
			cfsetispeed(&newtio, B115200);
			cfsetospeed(&newtio, B115200);
			break;
		case 460800:
			cfsetispeed(&newtio, B460800);
			cfsetospeed(&newtio, B460800);
			break;
		default:
			cfsetispeed(&newtio, B9600);
			cfsetospeed(&newtio, B9600);
			break;
	}
	if( nStop == 1 ) {
		newtio.c_cflag &=  ~CSTOPB;
	} else if ( nStop == 2 ) {
		newtio.c_cflag |=  CSTOPB;
	} else {
		newtio.c_cflag &=  ~CSTOPB;
	}

	newtio.c_cc[VTIME]  = 0;///* 100 設置超時10 seconds*/
	newtio.c_cc[VMIN] = 1;

	tcflush(fd,TCIFLUSH);
	if((tcsetattr(fd,TCSANOW,&newtio))!=0)
	{
		perror("com set error");
		return -1;
	}

	//	printf("set done!\n\r");
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章