Chinaunix首页 | 论坛 | 博客
  • 博客访问: 310434
  • 博文数量: 101
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 150
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-07 07:42
文章分类

全部博文(101)

文章存档

2016年(12)

2015年(48)

2014年(41)

我的朋友

分类:

2014-04-10 11:25:58

原文地址:串口编程----访问串口 作者:wpneu

  和所有的设备一样,UNIX提供了通过设备文件对串口进行访问的能力。要访问串口,你只需要简单的打开相应的设备文件。串口文件:UNIX系统下每一个串口有一个或几个设备文件(/dev目录下)和它关联:

Table 2 - Serial Port Device Files

System

Port 1

Port 2

IRIX®

/dev/ttyf1

/dev/ttyf2

HP-UX

/dev/tty1p0

/dev/tty2p0

Solaris®/SunOS®

/dev/ttya

/dev/ttyb

Linux®

/dev/ttyS0

/dev/ttyS1

Digital UNIX®

/dev/tty01

/dev/tty02

 

打开一个串口

  既然一个串口是一个文件,open(2)函数就可以用来访问它。UNIX下一个问题是设备文件通常不能被普通用户访问。以超级用户的身份执行程序,或者让你的程序设置userid,这样它可以以设备文件所有者的身份运行。

    我们假设串口文件可以被所有的用户访问,下面的代码示范了一个运行IRIX操作系统的SGI工作站怎样打开一个串口:

 程序清单1—打开一个串口

 #include /*标准输入输出定义*/

#inculde /*字符串函数定义*/

#include /*UNIX 标准函数定义*/

#include /*文件控制定义*/

#include /* 错误号定义*/

#include /*POISX 终端控制定义*/

 /*

* ‘open_port()’—Open serial port 1.

*

* Returns the file descriptor on success or -1 on error.

*/

int

open_port(void)

{

       int fd; /*文件描述符*/

        

       fd=open(“dev/ttyf1”, O_RDWR | O_NOCTTY | O_NDELAY);

       if (fd == -1)

       {

              Perroe(“open_port: Unable to open /dev/ttyf1 –“);

       }

       else

              fcntl(fd, F_SETFL, 0);

       return (fd);

}

    其它系统需要修改到相应的设备文件名,但是无论怎样代码是一样的。

 打开文件的参数

    你可能注意到当我们打开设备文件的时候,连同读写方式标志还使用了两个标志:

       fd = open(“/dev/ttyf1”, O_RDWR | O_NOCTTY | O_NDELAY);

 O_NOCTTY标志告诉UNIX系统,这个程序不想做这个串口的“控制终端”。假如你不这样指定,那么所有的输入(比如键盘异常终止信号等等)将影响你的进程。某些程序,比如getty使用这个特性在注册进程上,但是通常情况下一个用户程序不需要这样的特性。

       O_NDELAY 标志告诉UNIX系统这个程序不关心DCD信号线上是什么状态,是否另一端在运行。假如你不指定这个标志,你的进程将被休眠知道DCD信号线成为低电平。

 往串口写数据

     往串口写数据很容易---只要使用write系统调用发送数据给它:

              n = write (fd, “ATZ\R”, 4);

              if (n<0)

                     fputs(“Write() of 4 bytes failed!\n”, stderr);

       write 函数返回发送的字节数,如果出错则返回-1。通常你会遇到的唯一一个错误是EIO,它是在MODEM或数据连接将DCD信号线拉到低位导致的。这种状态将一直保持到你关闭串口。

 从串口读数据

  从串口读数据有一点小窍门,当你在原始数据模式下操作串口,假如串口缓冲中已经有数据可以读,那么每一次的read系统调用将立即返回。假如没有字符可以读到,这个调用将阻塞,一直到有字符进来,或者经过一段时间间隔,或者一个错误发生。Read函数可以被设置为马上返回,只要这样做:

 

       fcntl (fd, F_SETFL, FNDELAY);

使用FNDELAY参数将使read函数在串口没有字符可读的情况下返回0。如果要恢复正常状态(阻塞状态),调用不带FNDELAY参数的fcntl():

       fcntl(fd, F_SETFL, 0);

 如果使用O_NDELAY参数打开串口,也要使用这样的语句来恢复正常行为。

 关闭串口      

关闭串口,只需要使用close系统调用:

       close(fd);

关闭一个串口一般也会将DTR信号设置到低位,这将导致大部分MODEM挂起。
阅读(481) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~