[整理]Linux下串口编程以及参考书籍

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [整理]Linux下串口编程以及参考书籍

整理参考:http://blog.chinaunix.net/uid-20788636-id-1841319.html

摘选上述博客内容:

Linux下的串口编程,在嵌入式开发中占据着重要的地位,因为很多的嵌入式设备都是通过串口交换数据的。在没有操作系统的我们可以使用UART的中断来出来数据的接受和发送,而在Linux操作系统下,我们也可以使用软中断的方式来处理数据的接受和发送,这里主要使用的是信号SIGIO,也就是异步I/O。这里也可以使用select实现异步形式的通知。  这里可以参考《UNIX 环境高级编程》中的第14章 高级I/O和第18章的I/O终端,这两章描述了串口的编程和异步I/O方面的内容。还有一本书《linux serial programming how-to》,《Serial Programming Guide for POSIX Operating Systems》。这都是串口编程的必读和经典书籍。

上述介绍的两本参考资料《linux serial programming how-to》,《Serial Programming Guide for POSIX Operating Systems》:

下载地址在:http://1drv.ms/OnpSnW

在开发中,我常用的一段完整的串口代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
//#include <sys/poll.h>
#include <linux/poll.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/msg.h>
#include <termios.h>
#include <time.h>
#include <signal.h>
#include <sys/time.h>
#include <sys/resource.h>

#define DEBUG
#ifdef DEBUG
#define DPRINTF( x... )	printf("serial: " x)
#else
#define DPRINTF( x... )
#endif

#define COMM_PORT "/dev/ttySAC0"
#define IN_BUF_SIZE		64
#define OUT_BUF_SIZE	64
#define STOPCMD			0x03
unsigned char in_buf[IN_BUF_SIZE];
unsigned char out_buf[OUT_BUF_SIZE];

int main(int  argc, char *argv[]) {
	int fdd, len;
	struct termios opt;
	if ((fdd = open(COMM_PORT, O_RDWR | O_NOCTTY | O_NDELAY))== -1) {
		printf("ERROR: Cannot open the desired port \n");
		return -1;
	}

	//tcgetattr函数用于获取与终端相关的参数	
	tcgetattr(fdd,&opt);	// get this port termios struct
	//cfgetispeed函数用于获得结构体termios_p中的输入波特率信息,而cfgetospeed函数用于获得结构体termios_p中的输出波特率信息
	cfsetispeed(&opt, B9600); //input baudrate
	cfsetospeed(&opt, B9600); //output baudrate
	opt.c_cflag &= ~CSIZE;
	opt.c_cflag |= CS8;			// 8 bits length
	opt.c_cflag &= ~(CSTOPB | PARENB | CRTSCTS);	// 1 bit stop, no parity no flow ctrl
	opt.c_cflag |= CLOCAL | CREAD; 
	opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);	// raw input
	/* 输入字符保持原样	*/
	opt.c_iflag &= ~(IGNBRK | BRKINT |INPCK | ISTRIP | INLCR | IGNCR | ICRNL | IUCLC);
	opt.c_iflag &= ~(IXON | IXOFF | IXANY);	// no software flow control
	opt.c_oflag &= ~OPOST;	// raw output
	opt.c_cc[VMIN]=0;
	opt.c_cc[VTIME]=10;
	//tcsetattr函数用于设置终端参数
	tcsetattr(fdd,TCSANOW,&opt);

	out_buf[0] = 0xCC;
	out_buf[1] = 0x33;

	write(fdd, out_buf, 2);

	//监听串口处发来的信息,即注射头发来的消息
	while (1) {
		while((len = read(fdd, in_buf, 2)) > 0) {

			DPRINTF("Rx: %x %x\n", in_buf[0], in_buf[1]);

			if (in_buf[0] == STOPCMD) {

			}
		}
	}
}

Makefile文件如下:

# comm_if mkey

EXEC = serialtestc			#usb_scan		#scan_test	#	#raw2tif	#tif2raw #laserif_test	#pcom_test 
OBJS = serialtestc.o		#scan_test.o	#imageprn_test.o	#raw2tif.o	#tif2raw.o #laserif_test.o	#pcom_test.o 
SRC  = serialtestc.c		#scan_test.c	#imageprn_test.c	#raw2tif.c	#tif2raw.c	#laserif_test.c	#pcom_test.c 

#EXEC = mkey			#usb_scan		#scan_test	#	#raw2tif	#tif2raw #laserif_test	#pcom_test 
#OBJS = mkey.o			#scan_test.o	#imageprn_test.o	#raw2tif.o	#tif2raw.o #laserif_test.o	#pcom_test.o 
#SRC  = mkey.c			#scan_test.c	#imageprn_test.c	#raw2tif.c	#tif2raw.c	#laserif_test.c	#pcom_test.c 

#EXEC = cp_if
#OBJS = cp_if.o
#SRC = cp_if.c

#EXEC = comm_verify			#usb_scan		#scan_test	#	#raw2tif	#tif2raw #laserif_test	#pcom_test 
#OBJS = Comm_verify.o			#scan_test.o	#imageprn_test.o	#raw2tif.o	#tif2raw.o #laserif_test.o	#pcom_test.o 
#SRC  = Comm_verify.c			#scan_test.c	#imageprn_test.c	#raw2tif.c	#tif2raw.c	#laserif_test.c	#pcom_test.c 
#

#INC  = prn_task.h laser_ioctl.h bmp_cod.h list.h spi_host.h scan_if.h ipc_key.h ope_if.h tx_task.h fifo_g3enc.h
#INCLUDE = /usr/src/linux-2.6.23/include
#CC = /usr/src/buildroot-2009.08-o/build_arm/staging_dir/usr/bin/arm-linux-gcc
#LD = /usr/src/buildroot/build_arm/staging_dir/bin/arm-linux-ld

CC = /usr/arm-2009q3/bin/arm-linux-gcc
LD = /usr/arm-2009q3/bin/arm-linux-ld

MODCFLAGS = -Wall -Wundef -Os -marm -fno-omit-frame-pointer -mapcs -mno-thumb-interwork -D__LINUX_ARM_ARCH__=4 -march=armv4t -mtune=arm9tdmi -mlittle-endian
LDFLAGS = -r

all: $(EXEC)

$(EXEC): $(OBJS) #tx_task.o
	#$(CC) $(MODCFLAGS) -ltiff -lpthread -o $@ $(OBJS) #tx_task.o
	$(CC) $(MODCFLAGS) -lpthread -o $@ $(OBJS) #tx_task.o

$(OBJS):$(SRC) $(INC)	#ope_if.h tx_task.h
	$(CC) $(MODCFLAGS) -mapcs -c $< -o $@

#tx_task.o:tx_task.c ope_if.h tx_task.h list.h
#	$(CC) $(MODCFLAGS) -mapcs -c $< -o $@

clean:
	-rm -f $(EXEC) *.o *~ core

 

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [整理]Linux下串口编程以及参考书籍

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: