首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 下串口编程入门 (2)

Linux 下串口编程入门 (2)

计算机串口的引脚说明      
      
序号信号名称符号流向功能
2发送数据TXDDTE→DCEDTE发送串行数据
3接收数据RXDDTE←DCEDTE 接收串行数据
4请求发送RTSDTE→DCEDTE 请求 DCE 将线路切换到发送方式
5允许发送CTSDTE←DCEDCE 告诉 DTE 线路已接通可以发送数据
6数据设备准备好DSRDTE←DCEDCE 准备好
7信号地     信号公共地
8载波检测DCDDTE←DCE表示 DCE 接收到远程载波
20数据终端准备好DTRDTE→DCEDTE 准备好
22振铃指示RIDTE←DCE表示 DCE 与线路接通,出现振铃
      回页首
串口操作
      串口操作需要的头文件
            
#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
      打开串口是通过使用标准的文件打开函数操作:
            
int fd;/*以读写方式打开串口*/fd = open( "/dev/ttyS0", O_RDWR);if (-1 == fd){ /* 不能打开串口一*/ perror(" 提示错误!");}

       回页首
设置串口
      最基本的设置串口包括波特率设置,效验位和停止位设置。
      串口的设置主要是设置 struct termios 结构体的各成员值。
            
struct termio{        unsigned short  c_iflag;        /* 输入模式标志 */                unsigned short  c_oflag;                /* 输出模式标志 */                unsigned short  c_cflag;                /* 控制模式标志*/                unsigned short  c_lflag;                /* local mode flags */                unsigned char  c_line;                    /* line discipline */                unsigned char  c_cc[NCC];    /* control characters */};

       设置这个结构体很复杂,我这里就只说说常见的一些设置:
      波特率设置
      下面是修改波特率的代码:
            
struct  termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200);     /*设置为19200Bps*/cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);

       设置波特率的例子函数:
             /***@brief  设置串口通信速率*@param  fd     类型 int  打开串口的文件句柄*@param  speed  类型 int  串口速度*@return  void*/int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,          B38400, B19200, B9600, B4800, B2400, B1200, B300, };int name_arr[] = {38400,  19200,  9600,  4800,  2400,  1200,  300, 38400,            19200,  9600, 4800, 2400, 1200,  300, };void set_speed(int fd, int speed){  int   i;   int   status;   struct termios   Opt;  tcgetattr(fd, &Opt);   for ( i= 0;  i < sizeof(speed_arr) / sizeof(int);  i++) {     if  (speed == name_arr) {           tcflush(fd, TCIOFLUSH);           cfsetispeed(&Opt, speed_arr);        cfsetospeed(&Opt, speed_arr);         status = tcsetattr(fd1, TCSANOW, &Opt);        if  (status != 0) {                perror("tcsetattr fd1");          return;           }          tcflush(fd,TCIOFLUSH);       }    }}
继承事业,薪火相传
返回列表