在linux中,所有的设备文件一般都位于“/dev”下,串口1和串口2对应的设备名依次为“/dev/ttyS0”, “/dev/ttyS1”,而且USB转串口的设备名通常为“/dev/ttyUSB0”,在linux下对设备的操作方法与对文件的操作方法一样。

串口开发步骤:

串口的设置主要是设置struct termios结构体的各成员值

#include<termios>

struct termios

{

Unsigned short c_iflag;            /*输入模式标志*/

Unsigned short c_oflag;           /*输出模式标志*/

Unsigned short c_cflag;           /*控制模式标志*/

Unsigned short c_lflag;            /*本地模式标志*/

Unsigned char c_line ;             /*线路规则*/

Unsigned char c_cc[NCC];              /*控制特性*/

Speed_t        c_ispeed;             /*输入速度*/

Speed_t        c_ospeed;            /*输出速度*/

};

串口设置包括波特率设置,检验位和停止位设置,主要设置的是c_cflag结构体成员,注意,不能直接对c_cflag成员初始化,而要将其通过与或操作。

int set_com_config(int fd,int baud_rate, int data_bits,char parity,int stop_bits)

{

struct termios new_cfg,old_cfg;

int speed;

/*保存并测试现有串口参数设置,在这里如果串口号等出错,会有相关出错信息*/

if(tcgetattr(fd,&old_cfg) != 0)        /*该函数得到fd指向的终端配置参数,并将它们保存到old_cfg变量中,成功返回0,否则-1*/

{

perror("tcgetttr");

return -1;

}

/*设置字符大小*/

new_cfg=old_cfg;

cfmakeraw(&new_cfg);    /*配置为原始模式*/

new_cfg.c_cflag &= ~CSIZE;/*用位掩码清空数据位的设置*/

/*设置波特率*/

switch(baud_rate)

{

case 2400:

speed=B2400;

break;

case 4800:

speed=B4800;

break;

case 9600:

speed=B9600;

break;

case 19200:

speed=B19200;

break;

case 38400:

speed=B38400;

break;

default:

case 115200:

speed=B115200;

break;

}

cfsetispeed(&new_cfg,speed);

cfsetospeed(&new_cfg,speed);

/*设置停止位*/

switch(data_bits)

{

case 7:

new_cfg.c_cflag |= CS7;

break;

default:

case 8:

new_cfg.c_cflag |= CS8;

break;

}

/*设置奇偶校验位*/

switch(parity)

{

default:

case 'n':

case 'N':

{

new_cfg.c_cflag &= ~PARENB;

new_cfg.c_iflag &= ~INPCK;

}

break;

case 'o':

case 'O':

{

new_cfg.c_cflag |= (PARODD | PARENB);

new_cfg.c_iflag |= INPCK;

}

break;

case 'e':

case 'E':

{

new_cfg.c_cflag |=  PARENB;

new_cfg.c_cflag &= ~PARODD;

new_cfg.c_iflag |= INPCK;

}

break;

}

/*设置停止位*/

switch(stopbits)

{

default:

case 1:

new_cfg.c_cflag &= ~CSTOPB;

break;

case 2:

new_cfg.c_cflag |= CSTOPB;

break;

}

/*设置等待时间和最小接收字符*/

new_cfg.c_cc[VTIME]=0;

new_cfg.c_cc[VMIN]=1;

/*处理未接收字符*/

tcflush(fd,TCIFLUSH);

/*激活新配置*/

if((tcsetattr(fd,TCSANOW,&new_cfg))!=0)

{

perror("tcsetattr");

return -1;

}

return 0;

}

最新文章

  1. 在Ubuntu 14.04安装和使用Docker
  2. 【前端】js代码模拟用户键盘鼠标输入
  3. ThinkPHP BASE
  4. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例
  5. Android 自动朗读(TTS)
  6. SQL Server数据库自增字段正确的插入值的描述
  7. ADO.NET 快速入门(二):执行命令
  8. WIN32一些文件及窗口操作
  9. Injection Attacks-Log 注入
  10. Mvc 页面缓存 OutputCache VaryByCustom
  11. 使用NSTimer实现倒计时-备
  12. 与众不同 windows phone (11) - Background Task(后台任务)之警报(Alarm)和提醒(Reminder)
  13. HTML5 Canvas中实现绘制一个像素宽的细线
  14. [转]C# 之DLL调用(托管与非托管)
  15. vue学习笔记2
  16. &lt;算法图解&gt;读书笔记:第3章 递归
  17. D. Frets On Fire 前缀和+二分
  18. docker+kibana+filebeat的安装
  19. tensorflow学习之(一)预测一条直线y = 0.1x + 0.3
  20. mongodb可视化工具 studio3t robo3T 下载安装使用介绍

热门文章

  1. monkey基础知识(二)
  2. Vue的学习--开始之前的思考
  3. pytest_多用例执行(1)
  4. UML类图与类图中的关系
  5. Vijos——T 1629 八
  6. 洛谷 P1601 A+B Problem(高精)
  7. Numpy库进阶教程(一)求解线性方程组
  8. Android SlideAndDragListView,一个可排序可滑动item的ListView
  9. Day2:字典
  10. HTML 5 中FileReader的使用