分类:
2014-04-10 11:25:58
原文地址:串口编程----访问串口 作者:wpneu
Table 2
- |
||
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
#include
#include
#include
/*
* ‘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/ttyf
if (fd == -1)
{
Perroe(“open_port: Unable to open
/dev/ttyf1 –“);
}
else
fcntl(fd, F_SETFL, 0);
return (fd);
}
其它系统需要修改到相应的设备文件名,但是无论怎样代码是一样的。
打开文件的参数
你可能注意到当我们打开设备文件的时候,连同读写方式标志还使用了两个标志:
fd = open(“/dev/ttyf
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);