Linux_C_C++串口读写串口读写

上传人:woxinch****an2018 文档编号:39301839 上传时间:2018-05-14 格式:DOC 页数:18 大小:106.50KB
返回 下载 相关 举报
Linux_C_C++串口读写串口读写_第1页
第1页 / 共18页
Linux_C_C++串口读写串口读写_第2页
第2页 / 共18页
Linux_C_C++串口读写串口读写_第3页
第3页 / 共18页
Linux_C_C++串口读写串口读写_第4页
第4页 / 共18页
Linux_C_C++串口读写串口读写_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《Linux_C_C++串口读写串口读写》由会员分享,可在线阅读,更多相关《Linux_C_C++串口读写串口读写(18页珍藏版)》请在金锄头文库上搜索。

1、Linux C/C+串口读写串口简介串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的 使用。常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端 生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE) 和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准“该标准规定采 用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号内容加以规定, 还对各种信号的电平加以规定。传输距离在码元畸变小于 4% 的情况下,传 输电缆长度应为 50 英尺。

2、Linux 操作系统从一开始就对串行口提供了很好的支持 计算机串口的引脚说明计算机串口的引脚说明 序号信号名称符号流向功能2发送数据TXDDTEDCEDTE 发送串行数据3接收数据RXDDTEDCEDTE 接收串行数据4请求发送RTSDTEDCEDTE 请求 DCE 将线路切换到 发送方式5允许发送CTSDTEDCEDCE 告诉 DTE 线路已接通可 以发送数据6数据设备准备好DSRDTEDCEDCE 准备好7信号地信号公共地8载波检测DCDDTEDCE表示 DCE 接收到远程载波20数据终端准备好DTRDTEDCEDTE 准备好22振铃指示RIDTEDCE表示 DCE 与线路接通,出现 振铃

3、串口操作串口操作需要的头文件 #include /*标准输入输出定义*/ #include /*标准函数库定义*/ #include /*Unix 标准函数定义*/ #include /*数据类型,比如一些 XXX_t 的那种*/ #include /*定义了一些返回值的结构,没看明白 */ #include /*文件控制定义*/ #include /*PPSIX 终端控制定义*/ #include /*错误号定义*/打开串口 在 Linux 下串口文件是位于 /dev 下的 串口一 为 /dev/ttyS0 串口二 为 /dev/ttyS1 打开串口是通过使用标准的文件打开函数操作: int

4、 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 sh

5、ort c_lflag; /* local mode flags */ unsigned char c_line; /* line discipline */ unsigned char c_ccNCC; /* control characters */ ;设置这个结构体很复杂,我这里就只说说常见的一些设置: 波特率设置 下面是修改波特率的代码:struct termios Opt; tcgetattr(fd, /*获得当前设备模式,与终端相关的参数。fd=0 标准输入*/ cfsetispeed( /*设置结构 termios 输入波特率为 19200Bps*/ cfsetospeed( /

6、*fd 应该是文件描述的意思*/ tcsetattr(fd,TCANOW,/*设置终端参数,TCANOW 修改立即发生 */设置波特率的例子函数:/* *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, 1

7、9200, 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, for ( i= 0; i 0)printfprintf(“nLen %dn“, nread);buffnread+1 = 0;printfprintf(“n%s“, buff);/close(fd); / exit (0);1、虚拟机下使用串口的方法 使用 vmwav

8、e,默认串口设备是没有添加的,通过 vmwave 将设备加入即可正 常使用串口。虚拟机串口打开后,可能会占用 windows 下的串口。另外,虚拟 机的串口收发比正常的速度的确要慢许多。2、消除 Linux 串口收发的一些规则Linux 串口收发有许多模式,如:(1) 接收返回模式: 如果串口没有接收到数据,read()函数不返回。(2) 数据接收n 才返回接收的数据,否则 read()函数返回 0(3) 特殊字符解析问题,部分特殊字符接收/发送时,会被屏蔽或者转义。如 发送 0x0A 接收变为 0x0A 0x0A ,0x0D 被屏蔽等。(4) 接收反馈:如串口接收到数据,立即将该数据发送出去

9、。(上面是我遇到的一些问题,可能表述不很清楚,呵呵。如果用于收发 txt 文件, 一般不大注意。)3、解决问题的方法是,消除这些默认规则,关键是 struct termios 的参数影响。struct termios tcflag_t c_iflag; /*/* 输入模式旗标 */tcflag_t c_oflag; /*/* 输出模式旗标 */tcflag_t c_cflag; /*/* 控制模式旗标 */tcflag_t c_lflag; /*/* 区域模式旗标 */cc_t c_line; /*/* 行控制 (line discipline) */cc_t c_ccNCCS; /*/* 控

10、制特性 */;由于研究不深,如果要消除所有上面的规则,我是如下处理的struct termios options;串口打开方式:open (“dev/ttyS0“ , O_RDWR|O_NOCTTY| O_NDELAY );消除收发模式规则:options.c_lflag = 0;options.c_oflag = 0;options.c_iflag = 0;消除字符屏蔽规则:options.c_ccVINTR = 0; /*/* Ctrl-c */options.c_ccVQUIT = 0; /*/* Ctrl- */options.c_ccVERASE = 0; /*/* del */op

11、tions.c_ccVKILL = 0; /*/* */options.c_ccVEOF = 0; /*/* Ctrl-d */options.c_ccVTIME = 1; /*/* */options.c_ccVMIN = 0; /*/* */options.c_ccVSWTC = 0; /*/* */options.c_ccVSTART = 0; /*/* Ctrl-q */options.c_ccVSTOP = 0; /*/* Ctrl-s */options.c_ccVSUSP = 0; /*/* Ctrl-z */options.c_ccVEOL = 0; /*/* */option

12、s.c_ccVREPRINT = 0; /*/* Ctrl-r */options.c_ccVDISCARD = 0; /*/* Ctrl-u */options.c_ccVWERASE = 0; /*/* Ctrl-w */options.c_ccVLNEXT = 0; /*/* Ctrl-v */options.c_ccVEOL2 = 0; /*/* */以上设置,在其它参数串口设置前执行,如果你需要保留部分参数,请参阅 http:/ read 处,请问 有没有办法让这个 read 动作中止?A:使用非阻塞方式 select 函数(I/O 多工机制)或者 open 的时候加 O_NONBL

13、OCK 参数。int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout);关于这个函数的使用我会在下篇 blog 中整理。= = = = = = = = = = = 串口收发源码= = = = = = = = = = =一下代码已经经过我测试,没有问题。开发环境 Redhat9,运行环境 s3c2410= = = = = = receive.c= = = = = =#include #include #include #include #include #inc

14、lude #include #include #include #define TRUE 1/初始化串口选项: void setTermios(struct termios * pNewtio, int uBaudRate)bzero(pNewtio, sizeof(struct termios); /* clear struct for new port settings */8N1pNewtio-c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;pNewtio-c_iflag = IGNPAR;pNewtio-c_oflag = 0;pNewtio-c_lflag = 0; /non ICANON/*initialize all control charactersdefault values can be found in /usr/include/termios.h, andare given in the comments, but we dont need them here*/pNewtio-c_ccVINTR

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号