Linux下串口编制【转】 (11)

这个范例程序在等待输入信号出现前, 不能确定它会停顿下来. 如果你需要在输入时加入逾时功能, 只需把 select 呼叫换成:

int res;
struct timeval Timeout;

/* 设定输入回圈的逾时值 */
Timeout.tv_usec = 0; /* 毫秒 */
Timeout.tv_sec = 1; /* 秒 */
res = select(maxfd, &readfs, NULL, NULL, &Timeout);
if (res==0)
/* 文档叙述结构数在 input = 0 时, 会发生输入逾时. */

这个程序会在 1 秒钟后逾时. 如果超过时间, select 会传回 0, 但是应该留意 Timeout 的时间递减是由 select 所等待输入信号的时间为基准. 如果逾时的值是 0, select 会马上结束返回.

Linux 环境下使用RS-232接口

RS是英文 "推荐标准"的缩写
232为标识号
RS-485 

串口通信表示计算机一次传送一个位的数据,
当使用串行通信时,每个字的数据是一个位一个位的传输或接收的,
每个位不是高电平,就是低电平.

串行通信的速率通常是使用"位/每秒"的方式来表示的,即波特率。


全双工--计算机可以同时收发数据,
它有两个独立的数据通道,一个输入,一个输出,

半双工意味着计算机不能同时收发信息,
只能有一人通道进行通信.


流控:

    通常,当数据在两个串行接口之间进行传输时需要对其进行控制.
    这通常依赖于串行通信连接的各种规定,
    
    对异步数据传输的控制有两种方法.
    
    一种叫:“软件”流控 。
    一种叫: “硬件"流控 。

串口设备:

 打开一个串行口

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>  // 文件控制定义
#include <errno.h>
#include <termios.h>  //POSIX终端控制定义

/*
 * open_port() --打开串行口
 * 
 * 成功的话,返回文件描述符,错误则返回 -1.
*/

int  open_port(void)
{
    int fd;
    fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
    if (fd == -1)
    {
    /*无法打开串口*/
    perror("open_port : Unable to open /dev/ttyS0");
    }
    else
        fcntl(fd,F_SETFL,0);
    return (fd);
}

//O_NOCTTY 标志 ,该程序不想成为此端口的“控制终端"。
                  如果没有强调这一点,
//O_NDELAY标志 , 标志告诉Linux ,该程序并不关注DCD信叼线所处的状态,
即不管另外一端的设备是在运行还是被挂起。如果没有指定该标志,那么程序就会被设置睡
眠状态,

(2)向端口写数据
    向端口写数据是很容易的,只要使用write()系统调用就可以了。
    例如:
         n=write(fd,"ATZ/r",4);
    if (n<0)
        fputs("write() of 4 bytes failed!/n",stderr);
    
    write函数返回发送数据的个数,如果出现错误,则返回 -1。

(3) 读端口数据

    从端口读数据则需要些技巧。如果在原始数据的模式下对端口进行操作,
    read()系统调用将返回串行口输入缓冲区中所有的字符数据,不管有多少,
    
    如果没有数据,那么该调用将被阻塞.处于等待状态,直到有字符输入,
    或者到了规定的时限和出现错误为止,
    通过以下方法,能使read函数立即返回。

    fcntl(fd,F_SETFL,FNDELAY);

    FNDELAY 函数使read函数在端口没月字符存在的情况下,立刻返回0,
    如果要恢复正常(阻塞)状态,可以调用fcntl()函数,不要FNDELAY参数,
    如下所示:
        fcntl(Fd,F_SETFL,0);
    在使用O_NDELAY参数打开串行口后,同样与使用了该函数调用。
    
    fcntl(fd,F_SETFL,0);

POSIX终端接口
    串口,波特率,字符大小等, <termios.h>

    POSIX函数是 tcgetattr()和tcsetattr() 
    
    获取和设置终端的属性,
        可以提供 structrure termios的指针,

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzzyjz.html