整理参考: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
文章的脚注信息由WordPress的wp-posturl插件自动生成