今天对应用层串口编程进行了验证。程序来源于以下参考链接,自己进行了一些注释和更改,记录于此。

                               Tony Liu, 2016-6-17, Shenzhen

参考链接

https://www.ibm.com/developerworks/cn/linux/l-serials/

http://digilander.libero.it/robang/rubrica/serial.htm

http://blog.csdn.net/querdaizhi/article/details/7436722

程序

#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> /*错误号定义*/
#include <string.h> #define FALSE -1
#define TRUE 0 void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt; tcgetattr(fd, &Opt); //读取当前串口的配置, 后面会定其中的一些配置更改再写回去。
tcflush(fd, TCIOFLUSH); //清空输入输出队列
cfsetispeed(&Opt, speed); //设置输入速度
cfsetospeed(&Opt, speed); //设置输出速度
status = tcsetattr(fd, TCSANOW, &Opt); //写给底层寄存器
if (status != 0) {
perror("tcsetattr fd");
return;
}
tcflush(fd,TCIOFLUSH);
} /**
* 设置串口数据位,停止位和效验位
* fd 类型 int 打开的串口文件句柄
* databits 类型 int 数据位 取值 为 7 或者8
* stopbits 类型 int 停止位 取值为 1 或者2
* parity 类型 int 效验类型 取值为N,E,O,,S
*/
int set_Parity(int fd,int databits,int stopbits,int parity)
{
struct termios options;
if (tcgetattr( fd,&options) != 0) {
perror("SetupSerial 1");
return(FALSE);
} options.c_cflag |= CLOCAL | CREAD;
options.c_cflag &= ~CSIZE;
options.c_cflag &= ~CRTSCTS; //无硬件流控 options.c_oflag = 0; //输出模式
options.c_lflag = 0; //不激活终端模式 switch (databits) /*设置数据位数*/
{
case 7:
options.c_cflag |= CS7;
break;
case 8:
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size\n"); return (FALSE);
}
switch (parity)
{
case 'n':
case 'N':
options.c_cflag &= ~PARENB; /* Clear parity enable */
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; /* Enable parity */
options.c_cflag &= ~PARODD; /* 转换为偶效验*/
options.c_iflag |= INPCK; /* Disnable parity checking */
break;
case 'S':
case 's': /*as no parity*/ //空闲(space)校验和不校验的设置一样
options.c_cflag &= ~PARENB;
options.c_iflag &= ~INPCK; /* Enable parity checking */
break;
default:
fprintf(stderr,"Unsupported parity\n");
return (FALSE);
}
/* 设置停止位, 这里为什么没有设置1.5的停止位 */
switch (stopbits)
{
case 1:
options.c_cflag &= ~CSTOPB;
break;
case 2:
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return (FALSE);
}
//总感觉这里的判断不是很合理,只是判断‘n’,“N”难道就不判断了?
/* Set input parity option */
// if (parity != 'n')
// options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
if (tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial 3");
return (FALSE);
}
return (TRUE);
} int OpenDev(char *Dev)
{
int fd = open(Dev, O_RDWR | O_NOCTTY); //阻塞
// int fd = open(Dev, O_RDWR | O_NOCTTY | O_NDELAY); // 非阻塞
if (-1 == fd)
{
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
} int main(int argc, char **argv){
int fd;
int nread;
char buff[512]; char *dev = "/dev/ttymxc2"; //串口,根据自己板子的节点名称进行更改 fd = OpenDev(dev);
set_speed(fd, B9600); //根据系统定义的波特率的宏进行设置 if (set_Parity(fd,8,1,'N') == FALSE) {
printf("Set Parity Error\n");
exit (0);
} //循环读取数据
while (1) {
// nread = write(fd, "hello", 6);
// printf("write count: %d\n", nread);
//每次就只能读到一字节, 所以输出的Len为1,buff也只是单个字节
while ((nread = read(fd, buff, 512))>0)
{
printf("Len %d\n",nread);
buff[nread+1] = '\0';
printf( "%s\n", buff);
}
}
//close(fd);
// exit (0);
}

Linux 串口编程的更多相关文章

  1. storysnail的Linux串口编程笔记

    storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...

  2. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

  3. linux串口编程总结

    串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...

  4. linux串口编程参数配置详解(转)

    1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义#include <stdlib.h>        //标准函数 ...

  5. linux串口编程参数配置详解

    1.linux串口编程需要的头文件 #include <stdio.h>         //标准输入输出定义 #include <stdlib.h>        //标准函 ...

  6. linux串口编程

    按照对linux系统的理解,串口编程的顺序无非就是open,read,write,close,而串口有波特率.数据位等重要参数需要设置,因此还应该用到设置函数,那么接下来就带着这几个问题去学习linu ...

  7. Linux串口编程进阶

    在<Linux串口编程>编程一文中介绍了串口应用中常用的基本操作,如:串口打开关闭.串口设置.数据收发等.本篇文章主要基于常规串口操作进行了扩充,主要介绍如下操作: Linux系统使用非标 ...

  8. Linux串口编程(转载)

    在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件 的操作类似,只需打开相应的设备文件即可操作.串口编程特殊在于串 口通信时相关参数与属性的设置.嵌入式Linux的串口编程时 ...

  9. linux串口编程设置(转载)

    (转载)在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件 的操作类似,只需打开相应的设备文件即可操作.串口编程特殊在于串 口通信时相关参数与属性的设置.嵌入式Linux的串 ...

随机推荐

  1. android的开发 华为手机上不显示menu键

    android的开发,华为手机上不显示menu键解决办法: 在AndroidManifest.xml中讲targetSdkVersion改为9. <uses-sdk android:minSdk ...

  2. ASP.NET MVC4 Jquer 日期控件 测试范例

    <!doctype html>   <html lang="en"> <head> <meta charset="utf-8&q ...

  3. Github.com sshkey 生成与添加

    大致流程是先在你电脑上生成的一个ssh key 然后把key 加到github.com上你个人帐户的设置里面 cd ~/.ssh  如果你的电脑上还没有.ssh目录 ssh-keygen -t rsa ...

  4. TP框架ajax U方法不解析怎么办?

    TP框架中ajax U方法不解析 ajax U方法不解析 ajax url不解析 问题: 造成问题原因: Js 存在单独的 js文件中和html分离了.造成不解析! 解决方法: 方法一:将js放到ht ...

  5. oracle 三表关联查询

      oracle 三表关联查询 CreationTime--2018年7月4日17点52分 Author:Marydon 左连接实现三表关联 表A--------------------------- ...

  6. 转:sock_ev——linux平台socket事件框架(socket API的封装) .

    把linux平台提供的有关socket操作的API进行封装是有必要的:基于stream操作的流程与基于dgram操作的流程略有不同,分别放在两个类中,但两者又有很多相似的操作,因此写一个基类,让其继承 ...

  7. Linux异步IO操作

    Linux® 中最常用的输入/输出(I/O)模型是同步 I/O.在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止.这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需 ...

  8. oracle修改用户密码过期时间

    Oracle默认在default概要文件中设置了“PASSWORD_LIFE_TIME=180天”,导致密码过期,程序无法使用,业务进程会提示无法连接数据库等字样. --查询默认密码过期时间 SELE ...

  9. .net core +codefirst(.net core 基础入门,适合这方面的小白阅读) 【我们一起写框架】领域驱动设计的CodeFirst框架(一)—序篇

    .net core +codefirst(.net core 基础入门,适合这方面的小白阅读)   前言 .net core mvc和 .net mvc开发很相似,比如 视图-模型-控制器结构.所以. ...

  10. [显示属性]-自定义桌面里没有IE选项

    1楼 哈哈,我来告诉你原因,微软为了应对欧盟的反垄断调查,在 SP3 的“自定义桌面”里去掉了 Internet Explorer 选项. 如果桌面 IE 图标被误删除,但是又想恢复,而不是建立快捷方 ...