分享一份mipsel下uart编程的c/c++源码

c语言:

// compile: mipsel-openwrt-linux-gcc uart_write_read.c -o uart_write_read

#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>
#include <poll.h>
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
	struct termios newtio,oldtio;
	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 7:
			newtio.c_cflag |= CS7;
			break;
		case 8:
			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 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;
		newtio.c_cc[VTIME]  = 0;
		newtio.c_cc[VMIN] = 0;
		tcflush(fd,TCIFLUSH);
	if((tcsetattr(fd,TCSANOW,&newtio))!=0)
	{
		perror("com set error");
		return -1;
	}
	
	//	printf("set done!\n\r");
	return 0;
}
main()
{
	int fd,wr_static,ret,nread,count=0;
	char *uart3 = "/dev/ttyS1";
	char *buffer = "hello world!\n";
	char buff[8];
	struct pollfd fds[2];
	
	printf("\r\ni.MX6 uart_write_read_test start\r\n");
	 
	if((fd = open(uart3, O_RDWR|O_NOCTTY|O_NDELAY))<0){
		printf("open %s is failed",uart3);
	}	
	else {
		printf("open %s is success\n",uart3);
		set_opt(fd, 115200, 8, 'N', 1); 
	}
	pid_t pid;
		
	pid = fork();
	//调用出错
	if(pid == -1){
		printf("fork failed\n");
		return 1;
	}
	//返回给父进程子进程号,返回值大于0
	else if(!pid){
	
	   	fds[0].fd = STDOUT_FILENO;
	   	fds[0].events = POLLOUT;
	   	ret = poll(fds, 1, 5000);
		while(1){		
			if (ret == 0)  
	   		 printf("write time out\n");
			else{
				write(fd,buffer, strlen(buffer));
				sleep(1);
			}
	    }
    }
	
		//返回子进程0,返回值等于0返回给子进程
	else{
	   	fds[1].fd = STDIN_FILENO;
	   	fds[1].events = POLLIN;
	   	ret = poll(fds, 1, 5000);
		while(1){		
			if (ret == 0)  
	   		 printf("red time out\n");
			else{
				 while((nread = read(fd,buff,8))>0){
						count+=nread;    
				printf("count = %d\n",count);
				}
		    }
	    }
    }
	
	close(fd);
	return 0;
}
	

c++:

// compile: mipsel-openwrt-linux-g++ uart_write_read.cpp -o uart_write_read

#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>
#include <poll.h>
#include <string>


using namespace std;

int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
	struct termios newtio,oldtio;
	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 7:
			newtio.c_cflag |= CS7;
			break;
		case 8:
			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 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;
	
	newtio.c_cc[VTIME]  = 0;			//超时时间100ms
	newtio.c_cc[VMIN] = 0;
	tcflush(fd,TCIFLUSH);
	if((tcsetattr(fd,TCSANOW,&newtio))!=0)
	{
		perror("com set error");
		return -1;
	}
	
	//	printf("set done!\n\r");
	return 0;
}
main()
{
	int fd,wr_static,ret,nread,count=0;
	char uart3[20];
	 
	//char *uart3 = "/dev/ttyS1";
	//char *buffer = "hello world!\n";
	char send_buff[50];
	struct pollfd fds[2];
	
	char read_buff[100];
	
	printf("\r\ni.MX6 uart_write_read_test start\r\n");
	 
	 
	string s_uart3="/dev/ttyS1";
	strcpy(uart3, s_uart3.c_str());
	 
	string s_sbuff="hello world!\n";
	strcpy(send_buff, s_sbuff.c_str());

	

	if((fd = open(uart3, O_RDWR|O_NOCTTY|O_NDELAY))<0){
		printf("open %s is failed",uart3);
	}	
	else {
		printf("open %s is success\n",uart3);
		set_opt(fd, 115200, 8, 'N', 1); 
	}
	pid_t pid;
		
	pid = fork();
	//调用出错
	if(pid == -1){
		printf("fork failed\n");
		return 1;
	}
	//返回给父进程子进程号,返回值大于0
	else if(!pid){
	
	   	fds[0].fd = STDOUT_FILENO;
	   	fds[0].events = POLLOUT;
	   	ret = poll(fds, 1, 5000);
		while(1){		
			if (ret == 0)  
	   		 printf("write time out\n");
			else{
				write(fd,send_buff, strlen(send_buff));
				sleep(1);
			}
	    }
    }
	
		//返回子进程0,返回值等于0返回给子进程
	else{
	   	fds[1].fd = STDIN_FILENO;
	   	fds[1].events = POLLIN;
	   	ret = poll(fds, 1, 5000);
		while(1){		
			if (ret == 0)  
	   		 printf("red time out\n");
			else{
				 while((nread = read(fd, read_buff, 8))>0){
						count+=nread;    
				printf("count = %d\n",count);
				}
		    }
	    }
    }
	
	close(fd);
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值