1、前言

串口驱动是最简单的一种驱动了,在Linux下一切设备都认为是文件,打开设备就像打开文件一样简单,直接上代码

2、RS485.c

//--------------------------------------------------------------------------------------------------
// Include head files
//--------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/socket.h>#include "RS485.h"//-------------------------------------------------------------------------------------------------
// Private Definitions
//-------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------
// Private Members
//-------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------
// Private Functions
//-------------------------------------------------------------------------------------------------
static int SetAttributes(int fd, RS485PARA Rs485Para)
{struct termios newtio;bzero(&newtio, sizeof(newtio));newtio.c_cflag |= CLOCAL | CREAD;newtio.c_cflag &= ~CSIZE;switch (Rs485Para.m_Bits){case SEVEN:newtio.c_cflag |= CS7;break;case EIGHT:newtio.c_cflag |= CS8;break;default:newtio.c_cflag |= CS8;}switch (Rs485Para.m_Parity){case O:newtio.c_cflag |= PARENB;newtio.c_cflag |= PARODD;newtio.c_iflag |= (INPCK);break;case E:newtio.c_iflag |= (INPCK);newtio.c_cflag |= PARENB;newtio.c_cflag &= ~PARODD;break;case N:newtio.c_cflag &= ~PARENB;break;default:newtio.c_cflag &= ~PARENB;}switch (Rs485Para.m_BaudRate){case B_9600:cfsetispeed(&newtio, B9600);break;case B_19200:cfsetispeed(&newtio, B19200);break;case B_38400:cfsetispeed(&newtio, B38400);break;case B_57600:cfsetispeed(&newtio, B57600);break;case B_115200:cfsetispeed(&newtio, B115200);break;default:cfsetispeed(&newtio, B19200);}if (Rs485Para.m_Stop == ONE){newtio.c_cflag &= ~CSTOPB;}else if (Rs485Para.m_Stop == TWO){newtio.c_cflag |= CSTOPB;}else{newtio.c_cflag &= ~CSTOPB;}newtio.c_cc[VTIME] = 5;newtio.c_cc[VMIN] = 0;tcflush(fd, TCOFLUSH);if ((tcsetattr(fd, TCSADRAIN, &newtio)) != 0){printf("com set error:%s\n", strerror(errno));return -1;}return 0;
}//-------------------------------------------------------------------------------------------------
// Public Functions
//-------------------------------------------------------------------------------------------------
int RS485Open(const char* pDevname, RS485PARA Rs485Para)
{int ret = 0;int fd = 0;int nZero = 0;if (NULL == pDevname){printf("RS485 device name is null\n");return -1;}fd = open(pDevname, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);if (fd > 0){ret = SetAttributes(fd, Rs485Para);if (ret != 0){printf("Set RS485 port failed, error=%s\n", strerror(errno));return -1;}}else{printf("Can't open the port %s,error=%s\n", pDevname, strerror(errno));return -1;}return fd;
}int RS485Read(int fd, void* buf, int size)
{int nleft;int nread;char* ptr = NULL;ptr = buf;nleft = size;while (nleft > 0){nread = read(fd, ptr, nleft);if (nread <= 0){break;}nleft -= nread;ptr += nread;}return (size - nleft);}int RS485Write(int fd, const void* buf, int size)
{int nleft = 0;int nwritten = 0;const char* ptr = NULL;struct termios option;ptr = buf;nleft = size;while (nleft > 0){nwritten = write(fd, ptr, nleft);if (nwritten <= 0){break;}nleft -= nwritten;ptr   += nwritten;}return size;
}int RS485Close(int fd)
{if (fd > 0){close(fd);}else{return -1;}return 0;
}

3、RS485.h

#ifndef RS485_H
#define RS485_H//-------------------------------------------------------------------------------------------------
// Public Includes
//-------------------------------------------------------------------------------------------------//-------------------------------------------------------------------------------------------------
// Public Definitions
//-------------------------------------------------------------------------------------------------
enum BaudRate
{B_9600   = 0,B_19200  = 1,B_38400  = 2,B_57600  = 3,B_115200 = 4,B_40000  = 5,B_25000  = 6,
};enum Bits
{SEVEN = 7,EIGHT = 8,
};enum Parity
{O = 0,E = 1,N = 3,
};enum Stop
{ONE = 1,TWO = 2,
};//-------------------------------------------------------------------------------------------------
// Public Types
//-------------------------------------------------------------------------------------------------
typedef struct tag_RS485PARA
{unsigned char m_BaudRate;unsigned char m_Bits;unsigned char m_Parity;unsigned char m_Stop;
}RS485PARA;//-------------------------------------------------------------------------------------------------
// Public Functions
//-------------------------------------------------------------------------------------------------/*** Description: open a uart , rturn the fd** @param pDevname          [in]  uart name with path* @param Rs485Para         [in]  uart parater which run correctly * @return                  [out] fd value*/
extern int RS485Open(const char *pDevname, RS485PARA Rs485Para);/*** Description: read data to buf from fd** @param fd                [in]  uart fd* @param buf               [in]  store data from uart * @param size              [in]  data len from uart  * @return                  [out] data len to be read*/
extern int RS485Read(int fd, void* buf, int size);/*** Description: read data to buf from fd** @param fd                [in]  uart fd* @param buf               [in]  store data from uart * @param size              [in]  data len of buf  * @return                  [out] data len to be writen*/
extern int RS485Write(int fd, const void *buf, const int size);/*** Description: read data to buf from fd** @param fd                [in]  uart fd* @return                  [out] RET_STATUS_OK if OK*/
extern int RS485Close(int fd);#endif

4、总结

注意设置的方式是非阻塞,500毫秒等待时间,在外部程序中使用select/epool等方式去调用read读取数据就可以了

RS485串口驱动源代码相关推荐

  1. Linux:TTY串口驱动数据接收设置

    Linux的uart串口,无论是rs232格式的还是rs485格式的 ,最终都封装为tty接口.一般串口驱动都是芯片厂商开发好的.我们基本只要正确使用就能正常工作. 我这边开发的时候,使用应用层的测试 ...

  2. 从串口驱动到Linux驱动模型,想转Linux的必会!

    关注.星标公众号,直达精彩内容 ID:技术让梦想更伟大 整理:李肖遥 本文通过对Linux下串口驱动的分析.由最上层的C库.到操作系统系统调用层的封装.再到tty子系统的核心.再到一系列线路规程.再到 ...

  3. 嵌入式驱动解析:从串口驱动到Linux驱动模型

    本文通过对Linux下串口驱动的分析.由最上层的C库.到操作系统系统调用层的封装.再到tty子系统的核心.再到一系列线路规程.再到最底层的硬件操作. 对Linux中的tty子系统进行简要的说明.从理论 ...

  4. 从串口驱动到Linux驱动模型

    大学的时候,帮朋友写的操作系统调研的作业,最近整理过去的文档时候偶然发现,遂作为博客发出来. 从串口驱动到Linux的tty子系统驱动模型简要分析 基于ARM920T核心 Samsung的S3C244 ...

  5. 串口,USB,USB转串口,串口驱动,仿真器下载程序

    串口,USB,USB转串口,串口驱动,仿真器下载程序 在初学stm32,接触到的第一步便是下载程序, 方法一:利用仿真器下载程序 方法二:利用串口下载程序 本文简单介绍两种下载方法,浅入窥探下载原理, ...

  6. WinCE中串口驱动及接口函数介绍(转载)

    作者:ARM-WinCE 在WinCE中,串口驱动实际上就是一个流设备驱动,具体架构如图: 串口驱动本身分为MDD层和PDD层.MDD层对上层的Device Manager提供了标准的流设备驱动接口( ...

  7. linux串口驱动分析【转】

    转自:http://blog.csdn.net/hanmengaidudu/article/details/11946591 硬件资源及描述 s3c2440A 通用异步接收器和发送器(UART)提供了 ...

  8. USB学习5---android usb驱动源代码目录说明

    kernel\msm-3.18\drivers\usb下目录内容 我们msm8937+android7.1平台编译out目录下usb目录下有编译到的目录如下: 我们先参考kernel\msm-3.18 ...

  9. RTEMS 的 AT91SAM9260 移植(5): 调试串口驱动

    其实到这里,只要能保证编译通过,再修改一下链接脚本,其实已经可以跑在at9260的系统上了.因为我没有仿真器,不知道程序的状态,所以必须撰写调试串口的驱动. RTEMS 的调试串口并没有采用中断输出的 ...

最新文章

  1. 深入浅出详细介绍Java异常,让你茅塞顿开般的感觉
  2. 计算机组成原理 — 总线系统
  3. Java 9 - 17 特性解读:Java 9
  4. 终于写了自己第一个有些用处的代码,留念留念,是模糊搜索并复制到指定文件夹...
  5. 阿里云插件新版发布,多特性助力提升开发者体验
  6. 腾讯Node.js基础设施TSW正式开源
  7. 扩展Editplus为Java IDE
  8. 实验报告格计算机,计算机实验报告格式大全
  9. Theano at a Glance
  10. Java——IO基础
  11. 面向对象思想,简单实例
  12. 计算机被管理员限制怎么解除,Win10系统管理员账户被禁用如何解除?
  13. 华为OD机试 - 数大雁
  14. 研发里那只看不见的手,勒的很疼
  15. JAVA 协程Quasar初探
  16. 花前挥手别伊人,月下纵马扬轻尘,红尘游历,荡剑江湖。四方辗转,看千山飞鸟逐;万里飘蓬,叹海角天涯路。夜风萧瑟雨凄楚,相思情入梦,孤影独对窗前烛,离别意难书。何时平尽心中愿,从此相守不离疏,岁岁年年情深
  17. DBCO-C6-COOH|1425485-72-8|是DBCO酸的类似物,具有扩展的6-碳原子间隔臂
  18. aria2 txt导入_aria2 让下载提速
  19. 「CSA49」Bunny on Number Line
  20. 【深度学习机器翻译】GNMT:Google 的的神经机器翻译系统

热门文章

  1. 数据分享|中低分辨率土地覆盖数据
  2. python -m的用处
  3. 02架构 11 建站示例
  4. 雷神笔记本安装ubantu、deepin后无法wifi上网
  5. 攻防世界 REVERSE 新手区/game
  6. MySQL配置数据库审计
  7. 第六章 存储器层次结构 第四节 高速缓存存储器
  8. Prometheus V2仿真开发套件全新上市,实现一键启动仿真
  9. 湖南大学_数电实验_模型机设计_CPU设计_verilog_课程实验报告
  10. 《重庆高教研究》投稿经验分享