没有合适的资源?快使用搜索试试~ 我知道了~
串口操作采用 UNIX 类似的方式,打开/关闭/发送/接收等基本操作采用类 似文件系统的方式进行,而一些属性的设置和控制则使用 termios 来进行。
资源推荐
资源详情
资源评论
Linux 串口读写
串口简介
串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的
使用。常用的串口是 接口(又称 )它是在 年
由美国电子工业协会()联合贝尔系统、 调制解调器厂家及计算机终端生
产厂家共同制定的用于串行通讯的标准。它的全名是数据终端设备()和
数据通讯设备()之间串行二进制数据交换接口技术标准该标准规定采用
一个 个脚的 连接器,对连接器的每个引脚的信号内容加以规定,还
对各种信号的电平加以规定。传输距离在码元畸变小于 的情况下,传输电
缆长度应为 英尺。
操作系统从一开始就对串行口提供了很好的支持
计算机串口的引脚说明
序号 信号名称 符号 流向 功能
发送数据
发送串行数据
接收数据
接收串行数据
请求发送
请求 将线路切换到
发送方式
允许发送
告诉 线路已接通可
以发送数据
数据设备准备好
准备好
信号地
信号公共地
载波检测
表示 接收到远程载波
数据终端准备好
准备好
振铃指示
表示 与线路接通,出现振
铃
串口操作
串口操作需要的头文件
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h> /*数据类型,比如一些 XXX_t 的那种
*/
#include <sys/stat.h> /*定义了一些返回值的结构,没看明
白*/
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
打开串口
在 下串口文件是位于 !"#$下的
串口一 为 !"#$!%%&
串口二 为 !"#$!%%&
打开串口是通过使用标准的文件打开函数操作:
int fd;
/*以读写方式打开串口*/
fd = open( "/dev/ttyS0", O_RDWR);
if (-1 == fd){
/* 不能打开串口一*/
perror(" 提示错误!");
}
设置串口
最基本的设置串口包括波特率设置,效验位和停止位设置。
串口的设置主要是设置 '%()%%#(*+'结构体的各成员值。
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); /*获得当前设备模式,与终端相关的参
数。fd=0 标准输入*/
cfsetispeed(&Opt,B19200); /*设置结构 termios 输入波特率为
19200Bps*/
cfsetospeed(&Opt,B19200); /*fd 应该是文件描述的意思*/
tcsetattr(fd,TCANOW,&Opt);/*设置终端参数,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, 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[i]) {
/**
* tcflush 函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程
序尚未读)或输出缓存(用户程序已经写,但尚未发送)。queue 参数应是下
列三个常数之一:
* TCIFLUSH 刷清输入队列。
* TCOFLUSH 刷清输出队列。
* TCIOFLUSH 刷清输入、输出队列。
*/
tcflush(fd, TCIOFLUSH);//设置前 flush
cfsetispeed(&Opt, speed_arr[i]);
cfsetospeed(&Opt, speed_arr[i]);
剩余18页未读,继续阅读
资源评论
JasonChenCoder
- 粉丝: 7
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- hfs-windows-x64-0.53.1.zip
- 教育领域贪心算法的学生讲义-C++编程实例解析与应用
- C++分治算法在学生讲义的应用解析
- C语言性能分析:深度解析与优化实践
- ,使用 Verilog 描述一个基本的 PCIe 传输接口
- Magica Cloth 2 v2.4.2
- 深入探索UE4中的植被制作:从基础到高级技术
- 人体脊柱核磁图像分割、MR分割、3D分割(数据格式为nii.gz的3d分割数据集)、二值图像分割
- Screenshot_20241020_125740_com_tencent_mm_GestureGalleryUI.jpg
- 孙英奥210283200809213316.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功