Linux C 串口编程

arch/arm/include/asm/termbits.h
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 */
};
串口的设置主要是设置struct termios结构体的各成员
/**
*s3c6410 serial_test
*测试的时候应用程序在后台运行./serial_test &
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //文件控制定义
#include <termios.h>//终端控制定义
#include <errno.h>

#define DEVICE "/dev/s3c2410_serial0"

int serial_fd = 0;

//打开串口并初始化设置
init_serial(void)
{
	serial_fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
	if (serial_fd < 0) {
		perror("open");
		return -1;
	}
	
	//串口主要设置结构体termios <termios.h>
	struct termios options;
	
	/**1. tcgetattr函数用于获取与终端相关的参数。
	*参数fd为终端的文件描述符,返回的结果保存在termios结构体中
	*/
	tcgetattr(serial_fd, &options);
	/**2. 修改所获得的参数*/
	options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能
	options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位
	options.c_cflag &= ~CRTSCTS;//无硬件流控
	options.c_cflag |= CS8;//8位数据长度
	options.c_cflag &= ~CSTOPB;//1位停止位
	options.c_iflag |= IGNPAR;//无奇偶检验位
	options.c_oflag = 0; //输出模式
	options.c_lflag = 0; //不激活终端模式
	cfsetospeed(&options, B115200);//设置波特率
	
	/**3. 设置新属性,TCSANOW:所有改变立即生效*/
	tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读
	tcsetattr(serial_fd, TCSANOW, &options);
	
	return 0;
}

/**
*串口发送数据
*@fd:串口描述符
*@data:待发送数据
*@datalen:数据长度
*/
int uart_send(int fd, char *data, int datalen)
{
	int len = 0;
	len = write(fd, data, datalen);//实际写入的长度
	if(len == datalen) {
		return len;
	} else {
		tcflush(fd, TCOFLUSH);//TCOFLUSH刷新写入的数据但不传送
		return -1;
	}
	
	return 0;
}

/**
*串口接收数据
*要求启动后,在pc端发送ascii文件
*/
int uart_recv(int fd, char *data, int datalen)
{
	int len=0, ret = 0;
	fd_set fs_read;
	struct timeval tv_timeout;
	
	FD_ZERO(&fs_read);
	FD_SET(fd, &fs_read);
	tv_timeout.tv_sec  = (10*20/115200+2);
	tv_timeout.tv_usec = 0;
	
	ret = select(fd+1, &fs_read, NULL, NULL, &tv_timeout);
	printf("ret = %d\n", ret);
	//如果返回0,代表在描述符状态改变前已超过timeout时间,错误返回-1
	

		
	if (FD_ISSET(fd, &fs_read)) {
		len = read(fd, data, datalen);
		printf("len = %d\n", len);
		return len;
	} else {
		perror("select");
		return -1;
	}
	
	return 0;
}

int main(int argc, char **argv)
{
	init_serial();

	char buf[]="hello world";
	char buf1[10];
	uart_send(serial_fd, buf, 10);
	printf("\n");

	uart_recv(serial_fd, buf1, 10);
	
	
	printf("uart receive %s\n", buf1);
	close(serial_fd);
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值