Linux串口通信编程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2) 设置属性:奇偶校验位、数据位、停止位。主要设置
3) 打开、关闭和读写串口。串口作为设备文件,可以直接用文件描述符来进行
网上的一个例子:
/*串口设备无论是在工控领域,还是在嵌入式设备领域,应用都非常广泛。而串口编程也就显得必不可少。
偶然的一次机会,需要使用串口,而且操作系统还要求是Linux,因此,趁着这次机会,综合别人的代码,
进行了一次整理和封装。具体的封装格式为C代码,这样做是为了很好的移植性,使它可以在C和C++环境下,
都可以编译和使用。代码的头文件如下: */
/////////////////////////////////////////////////////////////////// ////////////
//filename:stty.h
#ifndef__STTY_H__
#define__STTY_H__
//包含头文件
#include
#include
#include
#include
#include
#include
#include
#include
#include
//
// 串口设备信息结构
typedef struct tty_info_t
{
int fd;// 串口设备ID
pthread_mutex_t mt;// 线程同步互斥对象
char name[24];// 串口设备名称,例:"/dev/ttyS0"
struct termios ntm;// 新的串口设备选项
struct termios otm;// 旧的串口设备选项
}TTY_INFO;
//
// 串口操作函数
TTY_INFO *readyTTY(int id);
int setTTYSpeed(TTY_INFO *ptty,int speed);
int setTTYParity(TTY_INFO *ptty,int databits,int parity,int st opbits);
int cleanTTY(TTY_INFO *ptty);
int sendnTTY(TTY_INFO *ptty,char*pbuf,int size);
int recvnTTY(TTY_INFO *ptty,char*pbuf,int size);
int lockTTY(TTY_INFO *ptty);
int unlockTTY(TTY_INFO *ptty);
#endif
/*从头文件中的函数定义不难看出,函数的功能,使用过程如下:
(1)打开串口设备,调用函数setTTYSpeed();
(2)设置串口读写的波特率,调用函数setTTYSpeed();
(3)设置串口的属性,包括停止位、校验位、数据位等,调用函数setTTYParity ();
(4)向串口写入数据,调用函数sendnTTY();
(5)从串口读出数据,调用函数recvnTTY();
(6)操作完成后,需要调用函数cleanTTY()来释放申请的串口信息接口;其中,lockTTY()和unlockTTY()是为了能够在多线程中使用。在读写操作的前后,需要锁定和释放串口资源。
具体的使用方法,在代码实现的原文件中,main()函数中进行了演示。下面就是源代码文件: */
/////////////////////////////////////////////////////////////////// /////////////
//stty.c
#include
#include
#include"stty.h"
/////////////////////////////////////////////////////////////////// ////////////
// 初始化串口设备并进行原有设置的保存
TTY_INFO *readyTTY(int id)
{
TTY_INFO *ptty;
ptty =(TTY_INFO *)malloc(sizeof(TTY_INFO));
if(ptty ==NULL)
return NULL;
memset(ptty,0,sizeof(TTY_INFO));
pthread_mutex_init(&ptty->mt,NULL);
sprintf(ptty->name,"/dev/ttyS%d",id);
//
// 打开并且设置串口
ptty->fd =open(ptty->name,O_RDWR |O_NOCTTY |O_NDEL AY);
if(ptty->fd <0)
{
free(ptty);
return NULL;
}
//
// 取得并且保存原来的设置
tcgetattr(ptty->fd,&ptty->otm);
return ptty;
}
/////////////////////////////////////////////////////////////////// ////////////
// 清理串口设备资源
int cleanTTY(TTY_INFO *ptty)
{
//
// 关闭打开的串口设备
if(ptty->fd>0)
{
tcsetattr(ptty->fd,TCSANOW,&ptty->otm);
close(ptty->fd);
ptty->fd =-1;
free(ptty);
ptty =NULL;