Linux串口编程

Linux下串口传输数据,而不需要串口来处理,使用原始模式(Raw Mode)方式来通讯。

编程方法

串口操作需要的头文件:

1
2
3
4
5
6
7
8
#include     <stdio.h>      /*标准输入输出定义*/
#include     <stdlib.h>     /*标准函数库定义*/
#include     <unistd.h>     /*Unix 标准函数定义*/
#include     <sys/types.h> 
#include     <sys/stat.h>  
#include     <fcntl.h>      /*文件控制定义*/
#include     <termios.h>    /*PPSIX 终端控制定义*/
#include     <errno.h>      /*错误号定义*/
 

首先需要打开串口

在 Linux 下串口文件是位于 /dev 下的

串口一 为 /dev/ttyS0

串口二 为 /dev/ttyS1

打开串口是通过使用标准的文件打开函数操作:

1
2
3
4
5
6
7
int fd;
/*以读写方式打开串口*/
fd = open("/dev/ttyS0", O_RDWR);
if (-1 == fd){
/* 不能打开串口一*/
perror(" 打开错误!");
}

 

然后对串口设置

串口设置设计的结构体如下:

1
2
3
4
5
6
7
8
struct termio
{   unsignedshort  c_iflag;   /* 输入模式标志 */   
    unsignedshort  c_oflag;   /* 输出模式标志 */   
    unsignedshort  c_cflag;   /* 控制模式标志*/
    unsignedshort  c_lflag;   /* local mode flags */ 
    unsignedchar   c_line;    /* line discipline */  
    unsignedchar   c_cc[NCC];     /* control characters */
};

这里仅对常用的设置进行介绍:

1.波特率设置:

1
2
3
4
5
struct  termios Opt;
tcgetattr(fd, &Opt);
tcflush(fd,TCIFLUSH);
cfsetispeed(&Opt,B19200);    /*设置为19200Bps*/
cfsetospeed(&Opt,B19200);

2.校验位和停止位设置

常用的一般是8N0

1
2
3
4
5
6
Opt.c_cflag |= CS8;                         //设置数据位
Opt.c_cflag &= ~PARENB;  
Opt.c_oflag &= ~(OPOST);
Opt.c_cflag &= ~CSTOPB;
Opt.c_lflag &= ~(ICANON|ISIG|ECHO|IEXTEN);
Opt.c_iflag &= ~(INPCK|BRKINT|ICRNL|ISTRIP|IXON); 
1
2
Opt.c_cc[VMIN] = 0;
Opt.c_cc[VTIME] = 0;

 

3.写入配置

1
2
3
4
5
6
if (tcsetattr(fd,TCSANOW,&Opt) != 0)      //装载初始化参数
{
   perror("SetupSerial!\n");
   close(fd);
   return -1;
}

 

测试串口

1
2
3
4
5
6
7
8
9
10
11
12
char buf[20];
 
for(;;)
{
len = write(fd, buf, 1);       //写串口
if(len > 0)
{
read(fd, buf,sizeof(buf));     //读串口数据
printf("buf %s\n", buf);   //输出读到的数据
}
usleep(100000);
}

参考资料:

http://www.ibm.com/developerworks/cn/linux/l-serials/index.html
http://opengroup.org/onlinepubs/007908775/xsh/termios.h.html
http://hi.baidu.com/zy6666/blog/item/998da20e2c4634eb37d1220d.html

你可能感兴趣的:(linux,串口)