转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 数据库 >> MySql >> 正文
Linux 串口编程HOWTO 中英文简体对照 beta 版 (续)         ★★★★

Linux 串口编程HOWTO 中英文简体对照 beta 版 (续)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1696 更新时间:2009/4/22 20:45:36

3.    Program Examples 示例程序

All examples have been derived from miniterm.c. The type ahead buffer is limited to 255 characters, just like the maximum string length for canonical input processing (<linux/limits.h> or <posix1_lim.h>).

See the comments in the code for explanation of the use of the different input modes. I hope that the code is understandable. The example for canonical input is commented best, the other examples are commented only where they differ from the example for canonical input to emphasize the differences.

The descriptions are not complete, but you are encouraged to experiment with the examples to derive the best solution for your application.

Don''''t forget to give the appropriate serial ports the right permissions (e. g.: chmod a+rw /dev/ttyS1)!

所有的示例来自于 miniterm.c. The type ahead 缓存器限制在 255 字节的大小, 这与标准输入(canonical input)进程的字符串最大长度相同 (<linux/limits.h><posix1_lim.h>).

代码中的注释解释了不同输入模式的使用以希望这些代码能够易于理解。标准输入程序的示例做了最详细的注解, 其它的示例则只是在不同于标准输入示例的地方做了强调。

叙述不是很完整, 但可以激励你对这范例做实验, 以延生出合于你所需应用程序的最佳解.

不要忘记赋予串口正确的权限 (也就是: chmod a+rw /dev/ttyS1)!

3.1. Canonical Input Processing 标准输入模式

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <stdio.h>

/* baudrate settings are defined in <asm/termbits.h>, which is included by <termios.h> */
// 波特率的设置定义在 <asm/termbits.h>. 包含在 <termios.h> 里
#define BAUDRATE B38400      

/* change this definition for the correct port */
// 定义您所需要的串口号
#define MODEMDEVICE "/dev/ttyS1"

#define _POSIX_SOURCE 1 /*POSIX compliant source POSIX系统兼容*/

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;

main() {
 int fd,c, res;
 struct termios oldtio,newtio;
 char buf[255];
 /* Open modem device for reading and writing and not as controlling
 tty because we don''''t want to get killed if linenoise sends CTRL-C.
 开启设备用于读写,但是不要以控制 tty 的模式,因为我们并不希望在发送 Ctrl-C
 后结束此进程
 */
 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
 if (fd <0) {perror(MODEMDEVICE); exit(-1); }
 tcgetattr(fd,&oldtio); /* save current serial port settings */
           // 储存当前的串口设置
 bzero(&newtio, sizeof(newtio)); /* clear struct for new port settings */
                                      // 清空新的串口设置结构体
 /*
      BAUDRATE: Set bps rate. You could also use cfsetispeed and cfsetospeed.
      CRTSCTS : output hardware flow control (only used if the cable has all
             ecessary lines. See sect. 7 of Serial-HOWTO)
   CS8     : 8n1 (8bit,no parity,1 stopbit)
   CLOCAL  : local connection, no modem contol
   CREAD   : enable receiving characters
   BAUDRATE: 设置串口的传输速率bps, 也可以使用 cfsetispeed 和 cfsetospeed 来设置
   CRTSCTS : 输出硬件流控(只能在具完整线路的缆线下工作,参考 Serial-HOWTO 第七节)
   CS8     : 8n1 (每一帧8比特数据,无奇偶校验位,1 比特停止位)
   CLOCAL  : 本地连接,无调制解调器控制
   CREAD   : 允许接收数据
 */
 newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;

    /*
 IGNPAR  : ignore bytes with parity errors
 ICRNL   : map CR to NL (otherwise a CR input on the other computer will not
        terminate input) otherwise make device raw (no other input processing)
 IGNPAR  : 忽略奇偶校验出错的字节
 ICRNL   : 把 CR 映像成 NL (否则从其它机器传来的 CR 无法终止输入)或者就把设备设
     为 raw 状态(没有额外的输入处理)
 */
 newtio.c_iflag = IGNPAR | ICRNL;
 
 /*
 Raw output.  Raw 模式输出
 */
 newtio.c_oflag = 0;
 
 /*
 ICANON  : enable canonical input
 disable all echo functionality, and don''''t send signals to calling program
 ICANON : 启动 标准输出, 关闭所有回显echo 功能,不向程序发送信号
 */
 newtio.c_lflag = ICANON;
 
 /*
 initialize all control characters
 default values can be found in /usr/include/termios.h, and
 are given in the comments, but we don''''t need them here
 初始化所有的控制字符, 默认值可以在 /usr/include/termios.h 找到,
 并且做了注解,不过这里我们并不需要考虑这些
 */
 newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */
 newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
 newtio.c_cc[VERASE]   = 0;     /* del */
 newtio.c_cc[VKILL]    = 0;     /* @ */
 newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
 newtio.c_cc[VTIME]    = 0;     /* inter-character timer unused */
                                /* 不使用字符间的计时器 */
 newtio.c_cc[VMIN]     = 1;     /* blocking read until 1 character arrives */
                                   /* 阻塞,直到读取到一个字符 */
 newtio.c_cc[VSWTC]    = 0;     /* ''''\0'''' */
 newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */
 newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
 newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
 newtio.c_cc[VEOL]     = 0;     /* ''''\0'''' */
 newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
 newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
 newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
 newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
 newtio.c_cc[VEOL2]    = 0;     /* ''''\0'''' */
 
 /*
 now clean the modem line and activate the settings for the port
 清空数据线,启动新的串口设置
 */
 tcflush(fd, TCIFLUSH);
 tcsetattr(fd,TCSANOW,&newtio);
 
 /*
 terminal settings done, now handle input
 In this example, inputting a ''''z'''' at the beginning of a line will
 exit the program.
 终端设置完成,现在就可以处理数据了
 在本程序中,在一行的开始输入一个 ''''z'''' 会终止该程序
 */
 while (STOP==FALSE) {     /* loop until we have a terminating condition */
         // 循环直到满足终止条件
 /* read blocks program execution until a line terminating character is
 input, even if more than 255 chars are input. If the number
 of characters read is smaller than the number of chars available,
 subsequent reads will return the remaining chars. res will be set
 to the actual number of characters actually read
 即使输入超过 255 个字节,读取的程序段还是会一直等到行结束符出现才会停止。
    如果读到的字符少于应刚获得的字符数,则剩下的字符串会在下一次读取时读到。
 res 用来获得每次真正读到的字节数
 */
 res = read(fd,buf,255);
 buf[res]=0;             /* set end of string, so we can printf */
                           // 设置字符串结束符,从而可以顺利使用 printf
 printf(":%s:%d\n", buf, res);
 if (buf[0]==''''z'''') STOP=TRUE;
 }
 /* restore the old port settings 恢复旧的串口设置 */
 tcsetattr(fd,TCSANOW,&oldtio);
}

3.2. Non-Canonical Input Processing 非标准输入模式

In non-canonical input processing mode, input is not assembled into lines and input processing (erase, kill, delete, etc.) does not occur. Two parameters control the behavior of this mode: c_cc[VTIME] sets the character timer, and c_cc[VMIN] sets the minimum number of characters to receive before satisfying the read.

If MIN > 0 and TIME = 0, MIN sets the number of characters to receive before the read is satisfied. As TIME is zero, the timer is not used.

If MIN = 0 and TIME >

[1] [2] [3]  下一页


[C语言系列]C# 和 Linux 时间戳转换  [Web开发]PHP flock文件锁介绍
[Web开发]flock() Linux下的文件锁  [电脑应用]Linux下的六个免费的虚拟主机管理系统介绍
[互联动态]Windows Server 2008 Beta 3官方ISO下载  [电脑应用]Linux数据库大比拚
[操作系统]在Windows中玩转Linux操作系统  [办公软件]在RedHat Linux 9里安装gaim0.80
[办公软件]掌握 Linux 调试技术  [办公软件]理解 Linux 配置文件
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Sql Server  · MySql
    · Access  · ORACLE
    · SyBase  · 其他
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台