linux下串口编程

linux下串口编程

2014年4月10日21:40:04

步骤:

1、打开串口;2、配置串口;3、读写串口;4、关闭串口。

代码:

#include <stdlib.h>
#include <sys/types.h>  
#include <sys/stat.h>   

#include <stdio.h>
#include <sys/time.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <linux/serial.h>
#include <asm/ioctls.h>
#include <sys/io.h>
#include <time.h>



static int speed_sel[] ={B115200, B57600, B38400, B19200, B9600};
static int name_sel[] = {115200, 57600, 38400,  19200, 9600};

int open_port(char *SerialPort)
{
	int fd;

	fd = open(SerialPort, O_RDWR | O_NOCTTY | O_NDELAY);
	if (fd == -1)
	{
		printf("open_port:Unable to open %s \n", SerialPort);
	}
	else
		fcntl(fd, F_SETFL, 0);

	return (fd);
}

int close_port(int fd)
{
	int rtn;

	rtn = close(fd);
	return (rtn);
}

void speed_set(int fd, int speed)
{
	int i, status, tempspeed;
	struct termios opt;
	struct serial_struct p;
	speed_t lngspeed;

	if(fd <= 0)
		return ;

	tcgetattr(fd, &opt);
	tempspeed = speed;
	if(speed == 28800)
		tempspeed = 38400;
	for(i = 0; i < sizeof(speed_sel) / sizeof(int); i++)
	{
		if(tempspeed == name_sel[i])
		{
			tcflush(fd, TCIOFLUSH);
			cfsetispeed(&opt, speed_sel[i]);
			cfsetospeed(&opt, speed_sel[i]);

			status = tcsetattr(fd, TCSANOW, &opt);
			if(status != 0)
			{
				return ;
			}
			tcflush(fd, TCIOFLUSH);
		}
	}
	lngspeed = cfgetispeed(&opt);
	if(speed == 28800)
	{
		ioctl(fd, TIOCGSERIAL, &p);
		p.flags = ASYNC_SPD_CUST;
		p.custom_divisor = 4;
		ioctl(fd, TIOCSSERIAL, &p);
	}
	lngspeed = cfgetispeed(&opt);
}

int parity_set(int fd, int databits, int stopbits, int parity)
{
	struct termios opt;

	if(fd <= 0)
		return 1;

	tcgetattr(fd, &opt);

	opt.c_cflag &= ~CSIZE;
	switch(databits)
	{
	case 7:
		opt.c_cflag |= CS7;
		break;	
	case 8:
		opt.c_cflag |= CS8;
		break;
	}
	switch(parity)
	{
	case 'n':
	case 'N':
		opt.c_cflag &= ~PARENB;
		opt.c_iflag &= ~INPCK;
		break;
	case 'o':
	case 'O':
		opt.c_cflag |= (PARODD | PARENB);
		opt.c_iflag |= INPCK;
		break;
	case 'e':
	case 'E':
		opt.c_cflag |= PARENB;
		opt.c_cflag &= ~PARODD;
		opt.c_iflag |= INPCK;
		break;
	case 'S':
	case 's':
		opt.c_cflag &= ~PARENB;
		opt.c_cflag &= ~CSTOPB;
		break;	
	}
	switch(stopbits)
	{
	case 1:
		opt.c_cflag &= ~CSTOPB;
		break;
	case 2:
		opt.c_cflag |= CSTOPB;
	}
	if(parity != 'n')
		opt.c_iflag |= INPCK;
	opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
	opt.c_oflag &= ~OPOST;

	opt.c_iflag &= ~(IXON | IXOFF | IXANY | ICRNL);
	tcflush(fd, TCIFLUSH);
	opt.c_cc[VTIME] = 5;
	opt.c_cc[VMIN] = 0;
	tcsetattr(fd, TCSANOW, &opt);
	return(1);
}

unsigned char writecom(int fd, unsigned char *pdata, long lnglen)
{
	long lngwritelen;
	FILE *intFile;
	char chinfo[300];
	long i;

	if(fd <= 0)
		return 0;
	tcflush(fd, TCIOFLUSH);

	lngwritelen = write(fd, pdata, lnglen);
	if(lngwritelen == -1)
		return 0;
	if(lngwritelen != lnglen)
		return 0;
	return 0xff;
}

unsigned char readcom(int fd, unsigned char *pdata, long lnglen)
{
	long lngwritelen;

	if(fd <= 0)
		return 0;

	lngwritelen = read(fd, pdata, lnglen);
	if(lngwritelen == -1)
		return 0;
	if(lngwritelen != lnglen)
		return 0;
	return 0xff;
}



int main()
{
	char* SerialPort = "/dev/ttymxc2";

	int csc_comm = open_port(SerialPort);

	speed_set(csc_comm, 115200);
	parity_set(csc_comm, 8, 1, 'n');

	writecom(csc_comm,"seulww", 6);

	getchar();

	char str[20] = {0};
	readcom(csc_comm,str,15);
	printf("%s\n",str);

	close_port(csc_comm);

	return (csc_comm);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值