Linux串口通信编程

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2) 设置属性:奇偶校验位、数据位、停止位。主要设置中的termios

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;

相关文档
最新文档