• [技术干货] Linux:vi编辑器启动和退出以及保存文件
    vi是一个特殊的命令,也不光是命令还是Linux下的编辑器,由于篇幅关系就不在这边多做举例说明,讲在以后配置网络服务时介绍一些vi的实际应用。vi命令是Linux下全屏幕文本编辑,vi编辑提供了丰富的编辑功能。这个编辑器十分简陋,对初学者很不友好。但是因为Linux的vi编辑器作用非常大,尤其是在配置各种服务器时修改配置文件十分有用。vi编辑器有3种模式:命令模式、输入模式、末行模式。掌握这三种模式十分重要:命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在任何模式下只要按一下[Esc]键都可以返回命令模式。在命令模式中输入字幕“i”就可以进入vi的输入模式编辑文件。输入模式:在这个模式中我们可以编辑、修改、输入等编辑工作,在编辑器最后一行显示一个“--INSERT--”标志着vi进入了输入模式。当我们完成修改输入等操作的时候我们需要保存文件,这时我们需要先返回命令模式,在进入末行模式保存。末行模式:在命令模式输入“:”即可进入该模式,在末行模式中有好多好用的命令。vi的启动和退出直接输入命令vi不指定文件名,由于这是一个没有命名的空文件,显示了vi的版本信息。vim是vi编辑器的改进版本,在vi编辑器的基础上扩展了很多实用的功能。大多数linux/unix版本都使用vim代替了原有的vi编辑器。或者直接使用vi打开文件,如果文件存在打开存在文件;如果不存在的话,将以我们指定的参数作为文件名。输入q!是强制退出,同时没有保存当前文件内容。如果文件没有进行修改,或者已经保存完毕也可以使用q退出。保存退出使用wq,保存强制退出wq!保存文件如果文件已经有文件名,我们在末行模式直接输入w保存,如果没有文件名,输入w 文件名进行保存。例如:w test其中test是文件名。那么在vi中也可以另存为,就是在保存完以后,我们再使用w 另存为文件名。转载:传智教育
  • [技术干货] nginx安装(linux版)
    Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。在高连接并发的情况下,Nginx是Apache服务器不错的替代品。一、安装前的准备在正式安装 Nginx 之前,我们需要先安装 安装编译工具及库文件 : gcc、PCRE、zlib、openssl 。1、下载 PCRE 安装包,下载地址:  http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz[ root@bogon src ]# cd / usr / local / src /[ root@bogon src ]# wget http : //downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz2、解压安装包:[ root@bogon src ]# tar zxvf pcre - 8.35 . tar . gz3、进入安装包目录[ root@bogon src ]# cd pcre - 8.354、编译安装 [ root@bogon pcre - 8.35 ]# ./ configure [ root@bogon pcre - 8.35 ]# make  && make install5、查看pcre版本[ root@bogon pcre - 8.35 ]# pcre - config -- version二、 安装 Nginx1、下载 Nginx,下载地址: https://nginx.org/en/download.html[ root@bogon src ]# cd / usr / local / src /[ root@bogon src ]# wget http : //nginx.org/download/nginx-1.6.2.tar.gz 2、解压安装包[ root@bogon src ]# tar zxvf nginx - 1.6 . 2.tar . gz3、进入安装包目录[ root@bogon src ]# cd nginx - 1.6 . 24、编译安装[ root@bogon nginx - 1.6 . 2 ]# ./ configure -- prefix = /usr/ local / webserver / nginx -- with - http_stub_status_module -- with - http_ssl_module -- with - pcre = /usr/ local / src / pcre - 8.35 [ root@bogon nginx - 1.6 . 2 ]# make [ root@bogon nginx - 1.6 . 2 ]# make install5、查看nginx版本[ root@bogon nginx - 1.6 . 2 ]# / usr / local / webserver / nginx / sbin / nginx - v到此,nginx安装完成。6、 启动nginx在nginx目录下执行如下命令./sbin/nginx7、 停止nginx    方式一:快速停止,此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。./sbin/nginx -s stop    方式二:完整停止(建议使用),此方式停止步骤是待nginx进程处理任务完毕进行停止。./sbin/nginx -s quit  8 、 安装测试,nginx安装成功,启动nginx,即可访问虚拟机上的nginx     
  • [其他问题] 【MDC300产品】【Linux网卡转发方案功能】不懂添加默认路由
    【功能模块】【操作步骤&问题现象】1、全部步骤已完成,不懂默认路由如何添加和获取。2、第一处eth0.10是为Linux系统对外通讯网卡,已完成。3。那么第二处eth0.10代表的是什么,应该怎么获取。【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [生态空间] linux禁用了sudo命令对数据库有什么影响
    linux禁用了sudo命令对数据库有什么影响
  • [交流吐槽] kibana-5.5.2-linux-x86_64包损坏,望尽快修复
    https://mirrors.huaweicloud.com/kibana/5.5.2/kibana-5.5.2-linux-x86_64.tar.gz
  • [技术干货] linux中执行定时任务对oracle备份(crontab命令)
    上一讲,我们讲解了linux crontab命令,这样我们再对ORACLE数据库进行备份时,就轻松了许多。步骤1.新建脚本首先进入linux下的oracle用户。新建一个shell脚本,该脚本主要写我们需要对oracle数据库进行备份的操作。2.添加脚本内容 设置oracle字符集这块需要注意一下,要和数据库保持一致,否则导出的信息会乱码。用下面的代码,可以查询出相应的字符集。select * from nls_database_parameters t where t.parameter='NLS_CHARACTERSET'; 3. 设置定时任务 在oracle用户下输入 crontab -e,设置定时任务,输出日志会直接添加到log.txt里,可以查看定时任务是否成功。0 0 12 * * * /home/oracle/dbbak/shell/dbbak.sh>>/home/oracle/dbbak/shell/log.txt 2>&14. 设置权限由于我们是在oracle用户下进行操作,一些读写权限不是很明确,所以我们要对需要操作的文件进行授权。chmod 777 新建目录/chmod 777 ./xx.sh如果缺少这一步的话,再运行完定时任务后,log.txt会有以下错误:EXP-00028: failed to open /home/oracle/dbbak/data/fdc20210720120001.dmp for writeExport file: expdat.dmp > 5. 重启服务systemctl restart crond此时,一个基于linux下定时备份oracle任务就算完成了。及时查看log.txt内容,如有报错,需要及时修正脚本!
  • [技术干货] linux crontab命令
    一、概念Linux crontab是用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond是后台进程,每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。二、工作分类linux 任务调度的工作主要分为以下两类:系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。使用vim crontab打开后,界面如下:一般默认即可。个人执行的工作:某个用户定期要做的工作,比如用户数据备份,这些工作可由每个用户自行设置。所有用户定义的crontab文件都被保存在/var/spool/cron目录下。三、语法crontab [ -u user ] { -l | -r | -e }-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。-e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数来指定使用那个文字编辑器(比如说 setenv VISUAL joe)-r : 删除目前的时程表-l : 列出目前的时程表四、案例使用使用时,须严格遵守下图的格式。 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。commond表示要执行的程序。当 f1 为 * 时表示每分钟都要执行 commond,f2 为 * 时表示每小时都要执行程序,其余类推当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其余类推当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余类推当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其余类推示例:每一分钟执行一次 /bin/ls:* * * * * /bin/ls在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup:0 6-12/3 * 12 * /usr/bin/backup五、crond服务操作命令   1、service crond start          启动服务   2、service crond stop          关闭服务     3、service crond restart       重启服务     4、service crond reload       重新载入配置   5、service crond status       服务是否运行 
  • [主机安全] Linux Netfilter本地权限提升漏洞(CVE-2021-22555)风险通告,PoC已公开
    2021年07月16日,国外安全研究员Andy Nguyen公开了CVE-2021-22555 Linux Netfilter 漏洞POC。,攻击者成功利用此漏洞可以完成特权提升及实现docker、kubernetes环境逃逸。1漏洞描述2021年07月16日,国外安全研究员Andy Nguyen公开了CVE-2021-22555 Linux Netfilter 漏洞POC,该漏洞已在Linux内核代码中存在15年,攻击者成功利用此漏洞可以完成特权提升及实现docker、kubernetes环境逃逸。 安全专家建议受影响的用户将Linux Kernel升级到最新版本。 Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。 Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统,一些组织或厂家,将Linux系统的内核与外围实用程序(Utilities)软件和文档包装起来,并提供一些系统安装界面和系统配置、设定与管理工具,就构成了一种Linux发行版本。漏洞编号:CVE-2021-22555漏洞等级:高危,CVSS评分:7.8漏洞详情:Linux 内核模块Netfilter中存在一处权限提升漏洞,攻击者可以通过漏洞实现权限提升,以及从docker、kubernetes环境中逃逸。 这个操作一般只限于root用户,但是如果内核编译选项中启用了CONFIG_USER_NS和CONFIG_NET_NS,并且赋予了普通用户高级特权,那么也能用于普通用户的进一步权限提升。 安全研究人员指出,该漏洞Crash信息最早曾在2020年8月17日由syzbot公布在网上,不排除已被在野利用的可能:安全研究人员此前曾在曾在Linux内核处理X.25套接字的代码中发现一存在24年之久的提权漏洞。 参考链接:Linux X.25套接字栈越界读写漏洞详细分析受影响的版本:Linux Kernel版本 >=2.6.19 (9fa492cdc160cd27ce1046cb36f47d3b2b1efa21)安全版本:Linux Kernel版本 5.12(b29c457a6511435960115c0f548c4360d5f4801d),5.10.31, 5.4.113, 4.19.188, 4.14.231, 4.9.267, 4.4.267漏洞修复建议:建议受影响的用户升级linux内核到安全版本。 临时修补建议:根据RedHat的建议,用户可以实施以下操作通过禁用非特权用户执行CLONE_NEWUSER、CLONE_NEWNET,以缓解该漏洞带来的影响。echo 0 > /proc/sys/user/max_user_namespaces参考链接:https://github.com/google/security-research/security/advisories/GHSA-xxx5-8mvq-3528https://nvd.nist.gov/vuln/detail/CVE-2021-22555
  • [交流吐槽] 希望增加 composer 源和 Rocky Linux 源
    希望增加 composer 源和 Rocky Linux 源
  • [openEuler] 软件包加固测试文档
    软件包加固测试文档 一、预置条件 1、已经挂载openEuler21.03的软件源 。 2、先把openEuler仓库下的integration-test fork下来后,下载到本地 3、再从openEuler仓库下载test-tools这个包 。 4、初始化了mugen测试框架的环境。 二、写脚本 1、我们首先先把我们我要要测的包下载下来,执行指令:dnf install包名 2、我们将要测的包的rpm包下载下来,执行指令:yumdownloader + 包名 3、我们找到我们要测试的包里面含有的功能,即我们要测试的内容。 通常指令位于bin目录下或者sbin目录下,所以我们可以执行命令 rpm qpl + rpm包检索当前包中有哪些命令。 4、知道了我们要写测试用例的命令以后,我们要去寻找相关指令的功能,这个需要我们自己去查找,如yelp-tools包中的三个指令,我们在yelp的官网查到了相关信息以及相关用法。 5、我们针对相关功能去编写测试用,一些框架的内置函数可以在 https://gitee.com/openeuler/test-tools/tree/master/mugen 中仔细阅读。 6、在书写测试用例后,下面是测试套的位置和已经写好的测试用例。 7、接下来,我们把测试包和测试用例对应的关系存进test-tools/mugen/suite2cases文件夹中名字为包名的文本中。 8、接下来,我们分别对包内所有的测试用例,以及包内的单个用例进行测试。 9、对已经写好且运行成功或者运行不成功的问题,我们都要检查一遍运行日志 寻找或者发现,是否出现问题。 三.提交 到这里,我们就完整的写好了我们的测试用例,将测试用例以及测试套和测试用例的对应关系复制到integration-test对应的文件夹中,然后提PR即可。 四.视频 mugen框架使用视频 https://www.bilibili.com/video/BV1UU4y1G7Zs
  • [技术干货] ARM Linux 环境 c程序设计
    正所谓:工欲善其事必先利其器   开发环境ip地址配置如下:windows工作主机地址为:192.168.1.101 linux宿主机 eth0 ip地址为192.168.1.102   tap0 ip地址 10.0.0.1 arm虚拟机ip地址为 10.0.0.101:编辑源码在windows主机上编辑以下的c语言源代码#include <stdio.h>int func(int n){int sum=0; for(i=0;i<n;i++){sum+=i;}return sum;}main(){int i;long result=0; for(i=1;i<=100;i++){result+=i;}printf("result[1-100]=%d\n",result);printf("result[1-250]=%d\n",func(250));保存文件为test.c通过Samba服务将服务文件复制到linux宿主机中  设置/opt/work目录为共享目录  编辑/etc/samba/smb.conf配置文件  在最后加入内容{root}path=/opt/workvalid users=rootwritable=yes添加root用户smbpasswd - arootNew Smb passwordRetype new SMB password修改好配置文件重启服务   在windows工作主机访问共享目录  可以设置映射网络驱动器  这样就可以像访问本地磁盘一样访问共享目录了2:交叉编译源程序 test.c已经编译完成并赋值到了linux宿主机的/opt/work中 下面进行交叉编译# arm-linux-gcc-g test.c- o test在编译之前需要检查gcc版本3:下载程序到arm虚拟机中去交叉编译完成后需要将test程序赋值到arm虚拟中去  打开arm虚拟机 使用ftp登录到arm虚拟机上#fp 10.0.0.10Connected to 10.0.0.10220 Friendly  Arm  ftp  server  verstion 6.4/OpenBsd/linux-ftpd-0.17 readyname(10.0.010:root):plg331Passwird required for plgpassword:230 User plg logged in.Remote system type is  UNixusing binary mode to transfer filesfip>登录用户名  密码为plg 使用put命令上传文件ftp>put(local-file)/opt/work/test(remote-file)testlocal:/opt/work/test remote:test200 PORT command successful150 opening binary mode data connection for  test   226transfer complete  9250 bytes sent in 0.00 secs(19057.4kb/s)上传的文件在arm虚拟机的/home/plg目录下使用gdb进行远程调试修改test程序属性{root@friendlyarm/opt}#chmod a+ x test在arm虚拟机中运行 gdbserver  设置调试端口9000# ./gdvsever 10.0.01:9000 testProcess test created;pid=792listening on port 9000在linux宿主机上运行gdb 链接在arm虚拟机中的gdbserver进行远程调试#./arm-linux-gdb/opt/work/testGNU  gdb (GDB)7.2license gplv3+:gnu gpl version 3 or later<http://gnu。org/licenses/gpl。html>this is free softwate :you are free to change and redistribute it......................warning unable to find dynameic linker breakpoint  function GDB will be  unable to debug shared library initalizersand track explicitly loaded dynameic code.(gdb)1cannot access memory at address 0x06{sum+=i;} return sum;}12main()13{14int i;15int result=0;(gdb)在arm虚拟机中将显示连接成功#./gdbserver 10.0.0.1;9000 testProcess test created pid=792listening on port 9000remote debugging from host 10.0.0.1;
  • [已解决问题归档] 【AICC产品】【IVR】能否提供vxml脚本调用linux动态库的demo
    【问题来源】【必填】      北京**局点    【问题简要】【必填】  业务开发需要利用ivr流程获取呼叫信息,再通过动态库传递给业务系统,ISV希望提供vxml脚本调用linux动态库传递数据的demo【问题类别】【必填】     CTI【AICC解决方案版本】【必填】    【UAP版本:UAP9600 V100R005C00SPC016】    【CTI版本:ICD V300R008C21】【期望解决时间】【选填】     尽快【问题现象描述】【必填】    【日志或错误截图】【可选】        无 【附件】【可选】
  • [AC专区] Agile Controller -IoT R20C10SPC100的部署前 安装RPM依赖包
    安装Agile Controller-IoT_Lite_V300R020C10SPC100、Agile Controller-IoT_SGCC_V300R020C10SPC100、Agile Controller-IoT_Standard_V300R020C10SPC100版本,若安装使用的是SUSE系统,则安装前,必须安装SUSE服务器依赖软件包,否则会导致Agile Controller-IoT安装失败。SUSE服务器依赖软件包请用户参考产品文档自行安装。也可以使用附件一键式部署。
  • [应用开发] aarch64-linux-gnu-g++ 编译华为代码报错
    【功能模块】    感知、规划、控制、通信代码都编译不过,华为自带的ara软件【操作步骤&问题现象】1、电脑安装g++ multib后,用aarch64-linux-g++编译就通不过了,然后卸掉g++ multib,重新安装了华为带的交叉编译环境还是编译不过2、华为自带的ara软件也编译不过,请华为专家帮忙解决一下这问题【截图信息】/usr/ubuntu_crossbuild_devkit/mdc_crossbuild_sysroot/usr/local/include/ara/hwcommon/log/LogStreamBuffer.h:34:22: note: candidate: ara::godel::common::log::LogStreamBuffer& ara::godel::common::log::LogStreamBuffer::operator<<(double)     LogStreamBuffer& operator<<(double num);                      ^In file included from /usr/ubuntu_crossbuild_devkit/mdc_crossbuild_sysroot/usr/local/include/ara/log/logger.h:55:0,                 from /usr/ubuntu_crossbuild_devkit/mdc_crossbuild_sysroot/usr/local/include/ara/log/logging.h:58,                 from /home/china-conch/AAAA/git_project/conchpilot/include/fsm/fsm_rxserviceprovider.h:14,                 from /home/china-conch/AAAA/git_project/conchpilot/include/driver/lidar/robosensor/robosensor_driver_application.h:23,                 from /home/china-conch/AAAA/git_project/conchpilot/src/driver/lidar/robosensor/robosensor_driver_application.cpp:10:/usr/ubuntu_crossbuild_devkit/mdc_crossbuild_sysroot/usr/local/include/ara/log/logstream.h: In function ‘ara::log::LogStream& ara::log::operator<<(ara::log::LogStream&, const void*)’:/usr/ubuntu_crossbuild_devkit/mdc_crossbuild_sysroot/usr/local/include/ara/log/logstream.h:410:65: error: cast from ‘const void*’ to ‘uintptr_t {aka unsigned int}’ loses precision [-fpermissive]     return (out << loghex(reinterpret_cast<std::uintptr_t>(value)));                                                                 ^In file included from /usr/ubuntu_crossbuild_devkit/mdc_crossbuild_sysroot/usr/local/include/ara/com/types.h:9:0,                 from /home/china-conch/AAAA/git_project/conchpilot/generated/includes/mdc/sensor/canrxserviceinterface_common.h:9,                 from /home/china-conch/AAAA/git_project/conchpilot/generated/canrxserviceinterface_common.cpp:6:/usr/aarch64-linux-gnu/include/c++/5/memory: In function ‘void* std::align(std::size_t, std::size_t, void*&, std::size_t&)’:/usr/aarch64-linux-gnu/include/c++/5/memory:117:58: error: cast from ‘void*’ to ‘uintptr_t {aka unsigned int}’ loses precision [-fpermissive]   const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);                                                          ^src/driver/can/CMakeFiles/can.dir/build.make:62: recipe for target 'src/driver/can/CMakeFiles/can.dir/can.cpp.o' failedmake[2]: *** [src/driver/can/CMakeFiles/can.dir/can.cpp.o] Error 1make[2]: *** 正在等待未完成的任务....[ 15%] Building CXX object src/driver/lidar/robosensor/CMakeFiles/driver_lidar_robosensor.dir/__/__/__/__/generated/driverlidarserviceinterface_common.cpp.osrc/driver/can/CMakeFiles/can.dir/build.make:86: recipe for target 'src/driver/can/CMakeFiles/can.dir/__/__/__/generated/canrxserviceinterface_common.cpp.o' failedmake[2]: *** [src/driver/can/CMakeFiles/can.dir/__/__/__/generated/canrxserviceinterface_common.cpp.o] Error 1CMakeFiles/Makefile2:621: recipe for target 'src/driver/can/CMakeFiles/can.dir/all' failedmake[1]: *** [src/driver/can/CMakeFiles/can.dir/all] Error 2[ 16%] Building CXX object src/driver/lidar/robosensor/CMakeFiles/driver_lidar_robosensor.dir/__/__/__/fsm/fsm_rxserviceprovider.cpp.oIn file included from /usr/ubuntu_crossbuild_devkit/mdc_crossbuild_sysroot/usr/local/include/ara/com/types.h:9:0,                 from /home/china-conch/AAAA/git_project/conchpilot/generated/includes/conch/driver/lidar/driverlidarserviceinterface_common.h:9,                 from /home/china-conch/AAAA/git_project/conchpilot/generated/driverlidarserviceinterface_common.cpp:6:/usr/aarch64-linux-gnu/include/c++/5/memory: In function ‘void* std::align(std::size_t, std::size_t, void*&, std::size_t&)’:/usr/aarch64-linux-gnu/include/c++/5/memory:117:58: error: cast from ‘void*’ to ‘uintptr_t {aka unsigned int}’ loses precision [-fpermissive]   const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);                                                          ^In file included from /usr/ubuntu_crossbuild_devkit/mdc_crossbuild_sysroot/usr/local/include/ara/com/types.h:9:0,                 from /usr/ubuntu_crossbuild_devkit/mdc_crossbuild_sysroot/usr/local/include/ara/com/internal/skeleton/SkeletonAdapter.h:11,                 from /home/china-conch/AAAA/git_project/conchpilot/generated/includes/conch/fsmrx/fsmrxserviceinterface_skeleton.h:9,                 from /home/china-conch/AAAA/git_project/conchpilot/include/fsm/fsm_rxserviceprovider.h:11,                 from /home/china-conch/AAAA/git_project/conchpilot/src/fsm/fsm_rxserviceprovider.cpp:13:/usr/aarch64-linux-gnu/include/c++/5/memory: In function ‘void* std::align(std::size_t, std::size_t, void*&, std::size_t&)’:/usr/aarch64-linux-gnu/include/c++/5/memory:117:58: error: cast from ‘void*’ to ‘uintptr_t {aka unsigned int}’ loses precision [-fpermissive]   const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);                                                          ^
  • [技术干货] 嵌入式Linux串口基本编程
    嵌入式Linux串口编程Linux下的串口设备主要在dev目录下,比如ttySx或者ttySUx或者ttyOx。比am1808 是ttyS0-S2SU0-SU7,而am335x是ttyO0-O5。一、基本编程API介绍最基本的设置串口包括波特率设置,效验位和停止位设置。1、串口的设置主要是设置 structtermios结构体的各成员值。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]; /* 控制模式字符*/};所有对串口的操作都是通过结构体 struct  termios和几个函数实现的,其中两个最常用的函数是tcgetattr()和tcsetattr()几乎在所有情况下,程序都是通过tcgetattr()函数获取设备当前的设置,然后修改这些设置,最后用tcsetattr()使这些设置生效。许多程序会保存终端初始的设置并在终止运行前恢复这些设置。函数返回0表示成功。2、tcgetattr和tcsetattr函数int tcgetattr (int  fd ,struct termios *t)   用于获得文件描述符fd所表示设备的当前设置值,并写入指针t内int tcsetattr    (int fd, int options,struct termios *t)用来将termios结构指针t内的设置值赋给当前用文件描述符fd表示的设备终端参数options决定什么时候改变才生效     TCSANOW———修改立即生效     TCSADRAIN——所有已经发送的输出写入fd后生效     TCSAFLUSH——输出队列为空时生效例如:下面是修改波特率的代码:struct termios  Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200); /*设置为19200Bps*/cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);3、波特率设定cfsetispeed()和cfsetospeed()函数分别用来设置设备的输入输出速度。int cfsetispeed(struct termios *t,speed_t speed)    int cfsetospeed(struct termios *t ,speed_t speed)通过结构体t分别将设备的输入输出速度设为speed。它们只是设置了termios结构体的速度,若要修改设备的速度还需要调用tcsetattr()函数下面看一个设置波特率的例子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)              { tcflush(fd, TCIOFLUSH);                 cfsetispeed(&Opt,speed_arr);                                      cfsetospeed(&Opt, speed_arr);                 status = tcsetattr(fd1,TCSANOW, &Opt);                   if (status != 0)                          {perror("tcsetattr fd1");                             return; }              tcflush(fd,TCIOFLUSH); } } }4、tcflush()函数用于丢弃设备上的一些数据 ,丢弃的数据取决于第二个参数queue_selector原型为:int tcflush(int fd,int queue_selector)TCIFLUSH——丢弃接口上已经接收到但还没读入的所有数据TCOFLUSH——丢弃所有已经写入接口但还没发送的数据TCIOFLUSH——丢弃所有输入输出队列上还没有读取或发送的数据5、校验位和停止位的设置No parity (8N1):options.c_cflag &= ~PARENB;//无校验options.c_cflag &= ~CSTOPB;//1位停止位options.c_cflag &= ~CSIZE;       //无位掩码options.c_cflag |= CS8;            //8数据位Even parity (7E1):options.c_cflag |= PARENB ;//有校验options.c_cflag &= ~PARODD ;//偶校验options.c_cflag &= ~CSTOPB;//一位停止位options.c_cflag &= ~CSIZE;      //无位掩码options.c_cflag |= CS7;              //7数据位Odd parity (7O1):options.c_cflag |= PARENB ;//有校验options.c_cflag |= PARODD;//奇校验options.c_cflag &= ~CSTOPB ; //一位停止位options.c_cflag &= ~CSIZE;   //无位掩码options.c_cflag |= CS7;    //7数据位CSIZE ——bit mask for data bitsCS7——7 data bitsCS8——8 data bitsCSTOPB——2 stop bits (1 otherwise)PARENB——enable parityPARODD——use odd parity instead of even6、读写串口设置好串口之后,读写串口就很容易了,可以把串口当作文件读写发送数据:char  buffer[1024];int    Length=1024;int    nByte;nByte = write(fd, buffer,Length)使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。char  buff[1024];int    Len=1024;int  readByte = read(fd, buff, Len);二、具体编程具体的程序在code目录下,以下有几个需要特别注意的地方需要说明的。options.c_iflag&= ~ (IXON | IXOFF | IXANY);c_cc数组的VSTART和VSTOP元素被设定成DC1和DC3,代表ASCII标准的XON和XOFF字符,如果在传输这两个字符的时候就传不过去,需要把软件流控制屏蔽,options.c_lflag&= ~ (ICANON | ECHO | ECHOE | ISIG);有时候,在用write发送数据时没有键入回车,信息就发送不出去,这主要是因为我们在输入输出时是按照规范模式接收到回车或换行才发送,而更多情况下我们是不必键入回车或换行的。此时应转换到行方式输入,不经处理直接发送options.c_iflag&= ~ (INLCR | ICRNL | IGNCR);options.c_oflag&= ~(ONLCR | OCRNL);还存在这样的情况:发送字符0X0d的时候,往往接收端得到的字符是0X0a,原因是因为在串口设置中c_iflag和c_oflag中存在从NL-CR和CR-NL的映射,即串口能把回车和换行当成同一个字符,可以进行如下设置屏蔽之:
总条数:1200 到第
上滑加载中