linux练习 串口跟进程6,linux下串口测试程序

linux下串口测试程序

通过简单的参数配置,执行文件+串口号+波特率

#include stdio.h

#include stdlib.h

#include unistd.h

#include sys/types.h

#include sys/stat.h

#include fcntl.h

#include errno.h

#include sys/time.h

#include time.h

#include string.h

#include sys/ioctl.h

#include termios.h

#include stdint.h

#include stdio.h

#include fcntl.h

#include sys/ioctl.h

#include linux/spi/spidev.h

#include string.h

#include assert.h

#include netinet/in.h

#include sys/types.h

#include signal.h

#include stdlib.h

#include sys/time.h

#define msleep(x) usleep(x*1000)

void my_printf(const char* head_l, unsigned char*date_in, int length_l)

{

int k;

printf("%s ", head_l);

for ( k = 0; k length_l; k++)

{

printf("%02x ", date_in[k]);

}

printf("\n");

}

int select_serial_device(int dev_id, char *name)

{

switch (dev_id)

{

case 1:

strcpy(name, "/dev/ttyS1");

break;

case 2:

strcpy(name, "/dev/ttyS2");

break;

case 3:

strcpy(name, "/dev/ttyS3");

break;

case 4:

strcpy(name, "/dev/ttyS4");

break;

case 5:

strcpy(name, "/dev/ttyS5");

break;

case 6:

strcpy(name, "/dev/ttyS6");

break;

case 7:

strcpy(name, "/dev/ttyS7");

break;

case 8:

strcpy(name, "/dev/ttyS8");

break;

case 9:

strcpy(name, "/dev/ttyS9");

break;

case 10:

strcpy(name, "/dev/ttyS10");

break;

case 11:

strcpy(name, "/dev/ttyS11");

break;

default:

return -1;

}

return 0;

}

unsigned int choose_baud_rate(int br_id)

{

unsigned int baud;

switch (br_id)

{

case 0:

baud = B0;

break;

case 50:

baud = B50;

break;

case 75:

baud = B75;

break;

case 110:

baud = B110;

break;

case 134:

baud = B134;

break;

case 150:

baud = B150;

break;

case 200:

baud = B200;

break;

case 300:

baud = B300;

break;

case 600:

baud = B600;

break;

case 1200:

baud = B1200;

break;

case 1800:

baud = B1800;

break;

case 2400:

baud = B2400;

break;

case 9600:

baud = B9600;

break;

case 19200:

baud = B19200;

break;

case 38400:

baud = B38400;

break;

case 57600:

baud = B57600;

break;

case 115200:

baud = B115200;

break;

case 460800:

baud = B460800;

break;

case 921600:

baud = B921600;

break;

case 1000000:

baud = B1000000;

break;

default:

printf("input error: baud rate not correct");

return -1;

}

return baud;

}

int init_serial_device(char *name, int baud)

{

int fd;

int ret;

struct termios options;

fd = open(name, O_RDWR | O_NDELAY | O_NOCTTY);

if (fd == -1){

printf("%s: open error\n", name);

return -1;

}

ret = tcgetattr(fd, options);

if (-1 == ret)

return -1;

options.c_cflag = ~CSIZE; //屏蔽其他标志

options.c_cflag |= CS8; //将数据位修改为8bit

options.c_cflag = ~PARENB; //无校验

options.c_cflag = ~CSTOPB; // 设置一位停止位;

options.c_lflag = ~(ICANON | ECHO | ECHOE | ISIG);

cfsetispeed(options, baud);

cfsetospeed(options, baud);

options.c_iflag = ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);

ret = tcsetattr(fd, TCSANOW, options);

if (-1 == ret)

return -1;

return fd;

}

void process_serial_data(int fd)

{

char sendbuf[64] = "123456789123456789123456789123456789";

char recvbuf[64] = "";

int ret;

while (1){

ret = write(fd, sendbuf,36); //发送数组

my_printf("send:",sendbuf,ret);

msleep(100);

while(1){

memset(recvbuf, 0, sizeof(recvbuf));

ret = read(fd, recvbuf, 255);

if (ret == 0)

continue;

if(ret0){

my_printf("recv:",recvbuf,ret);

break;

}

}

msleep(200);

}

}

int main(int argc, char **argv)

{

int fd;

int bn;

int ret;

char name[12];

char sn;

speed_t baud;

if (argc 2){

printf("input error:*argv=1-11\n");

exit(-1);

}

if (argc 3){

printf("input error: less than 4 parameters\n");

exit(-1);

}

ret = sscanf(argv[1], "%d", sn);

ret = select_serial_device(sn,name);

if (-1 == ret)

return -1;

ret = sscanf(argv[2], "%d", bn);

baud = choose_baud_rate(bn);

if (-1 == ret)

return -1;

fd = init_serial_device(name,baud);

if (-1 == fd)

return -1;

process_serial_data(fd);

return 0;

}

直接交叉编译即可

linux下串口测试程序 相关文章

Linux下创建进程

节选自《AdvancedLinuxProgramming》 通常有两种方式,第一种是使用system函数,位于stlib.h头文件下,system 建立了一个运行着标准Bourne shell( /bin/sh)的子进程,然后将命令交由它执行 。 因为 system 函数使用 shell 调用命令,它受到系统 shell 自身

Linux USB3.0驱动分析(十一)——Gadget设备枚举分析

一.URT介绍 前面介绍了Linux USB Gadget的软件结构与各软件层的整合过程。经过各种注册函数,Gadget功能驱动层,USB设备层与UDC底层结合在了一起形成了一个完整的USB设备。而这个设备已经准备好了接受主机的枚举。在介绍USB设备枚举之前。先熟悉一下各层通信

Linux USB3.0驱动分析(九)——Gadget function驱动分析

function目录汇集了很多功能层的功能接口(interface)的具体实现, 我们这里分析UAC2. 一. UAC2 function驱动分析 代码位置 drivers\usb\gadget\function\f_uac2.c 里面实现usb设置中的接口和端点相关功能。 这里的DECLARE_USB_FUNCTION_INIT就是入口函数。 DE

Linux USB3.0驱动分析(八)——Gadget UDC驱动分析

一.概述 Gadget USB设备控制器(UDC)驱动指的是作为其他USB主机控制器外设的USB硬件设备上底层硬件控制器的驱动,该硬件和驱动负责将一个USB设备依附于一个USB主机控制器上。例如,当某运行Linux系统的手机作为PC的U盘时,手机中的底层USB控制器行使USB设备

Linux USB3.0驱动分析(九)——Gadget UAC2驱动分析

本文分析的是linux-5.4.3 一.Gadget Audio设备驱动分析 drivers/usb/gadget/legacy/audio.c因为项目的问题,了解usb音频设备的工作原理,为啥它能让PC识别成“speak”或者“mic”,以及你能够播放录音。主要涉及下面两个层次:Gadget功能驱动层: 最主要的结构

linux下的/etc/passwd详解

在Linux /etc/passwd文件中每个用户都有一个对应的记录行,它记录了这个用户的一些基本属性。系统管理员经常会接触到这个文件的修改以完成对用户的管理工作。 类似于下面的例子: 从上面的例子我们可以看到,/etc/passwd中一行记录对应着一个用户,每行记录

Linux环境下jdk1.8的下载与安装

1、下载 Oracle官网下载相应的版本,官网地址:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html。 由于我的Linux是CentOS6.5(32位)的,因此我下载jdk-8u271-linux-i586.tar.gz文件。 2、解压文件 新建/usr/java文件夹 mkdir

linux查看当前路径命令

由于 Linux 文件系统中有许多目录,当用户执行一条 Linux 命令又没有指定该命令或参数所在的目录时,Linux 系统就会首先在当前目录(目前的工作目录)搜寻这个命令或它的参数。因此,用户在执行命令之前,常常需要确定目前所在的工作目录,即当前目录。 当用

linux如何查看系统信息

查看linux系统版本信息(Oracle Linux、Centos Linux、Redhat Linux、Debian、Ubuntu) 一、查看Linux系统版本的命令(3种方法) 1、cat /etc/issue,此命令也适用于所有的Linux发行版。 [root@S-CentOS home]# cat /etc/issue CentOS release 6.5 (Final) K

linux查看分区命令

9月25日任务 4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区 df命令 df 输出磁盘文件系统使用情况: [root@centos ~]# df文件系统 1K-块 已用 可用 已用% 挂载点/dev/sda3 11208704 7214792 3993912 65% /devtmpfs 496920 0 496920 0% /devtmpfs 507752 0 507752 0%

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564178.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ pair类模板

在学习关联容器之前&#xff0c;首先要了解 STL 中的 pair 类模板&#xff0c;因为关联容器的一些成员函数的返回值是 pair 对象&#xff0c;而且 map 和 multimap 容器中的元素都是 pair 对象。pair 的定义如下&#xff1a; template <class_Tl, class_T2> struct pair…

kali linux关闭进程,技术|如何使用 Kali Linux 黑掉 Windows

Kali Linux 派生自 Debian Linux&#xff0c;主要用于渗透测试&#xff0c;拥有超过 300 个的预安装好的渗透测试工具。Metasploit 项目中 Metasploit 框架支持 Kali Linux 平台&#xff0c;Metasploit 是一个用于开发和执行安全利用代码(security exploit)的工具。让我们来使用…

C++ multiset

multiset 是关联容器的一种&#xff0c;是排序好的集合&#xff08;元素已经进行了排序&#xff09;&#xff0c;并且允许有相同的元素。 不能直接修改 multiset 容器中元素的值。因为元素被修改后&#xff0c;容器并不会自动重新调整顺序&#xff0c;于是容器的有序性就会被破…

linux命令中的cp,Linux高级技术:关于cp命令中拷贝所有的写法

Linux高级技术&#xff1a;关于cp命令中拷贝所有的写法发布时间:2007-09-30 21:39:36来源:红联作者:GiftPot今天在编写一个脚本的时候&#xff0c;发现一个比较奇怪的问题&#xff1a;就是在使用cp拷贝当前目录下所有文件到目标目录的时候&#xff0c;源和目标目录大小不同。原…

C++ set

set 是关联容器的一种&#xff0c;是排序好的集合&#xff08;元素已经进行了排序&#xff09;。set 和 multiset 类似&#xff0c;它和 multiset 的差别在于 set 中不能有重复的元素。multiset 的成员函数 set 中也都有。 不能直接修改 set 容器中元素的值。因为元素被修改后…

linux内核实现ipsec,IP XFRM配置示例:利用linux kernel自带的IPSec实现,手动配置IPSec...

1、拓扑192.168.18.101 <> 192.168.18.1022、配置192.168.18.101ip xfrm state add src 192.168.18.101 dst 192.168.18.102 proto esp spi 0x00000301 mode tunnel auth md5 0x96358c90783bbfa3d7b196ceabe0536b enc des3_ede 0xf6ddb555acfd9d77b03ea3843f2653255afe8e…

linux 内核 82540网卡,Linux网卡as4.2 编译安装及配置准备

Linux网卡as4.2 编译安装及配置准备[日期&#xff1a;2008-03-28]来源&#xff1a;Linux公社作者&#xff1a;Linux整理[字体&#xff1a;大 中 小]确定make gcc kernel-devel包必须安装,没安装的话需要手动安装查看是否安装方法rpm -aq|gccrpm -aq|makerpm -aq|kernel-devel解…

C++ 容器适配器

STL 中的容器适配器有 stack、queue、priority_queue 三种。它们都是在顺序容器的基础上实现的&#xff0c;屏蔽了顺序容器的一部分功能&#xff0c;突出或增加了另外一些功能。 容器适配器都有以下三个成员函数&#xff1a; push&#xff1a;添加一个元素。top&#xff1a;返…

linux管理进程和计划任务,Linux进程和计划任务管理

本章结构#查看进程#控制进程#at一次性任务设置#crontab周期性任务设置程序和进程的关系#程序保存在硬盘、光盘等介质中的可执行代码和数据静态保存的代码#进程在cpu及内存中运行的程序代码动态执行的代码父、子进程&#xff1a;每个进程可以创建一个或多个进程查看进程ps#ps命令…

C++ stack

stack 是容器适配器的一种。要使用 stack&#xff0c;必须包含头文件 。 stack就是“栈”。栈是一种后进先出的元素序列&#xff0c;访问和删除都只能对栈顶的元素&#xff08;即最后一个被加入栈的元素&#xff09;进行&#xff0c;并且元素也只能被添加到栈顶。栈内的元素不…

C++ queue和priority_queue

queue 和 priority_queue 都是容器适配器&#xff0c;要使用它们&#xff0c;必须包含头文件 。 queue queue 就是“队列”。队列是先进先出的&#xff0c;和排队类似。队头的访问和删除操作只能在队头进行&#xff0c;添加操作只能在队尾进行。不能访问队列中间的元素。 qu…

less linux命令,less 命令用法详解

less 在 Linux 中用来查看文件&#xff0c;它可以以分页的方式显示文件内容。目前和tail 是用来查看文件的常用命令命令格式less [参数] 文件1、使用示例less a.txt用来查看文件按f 或 space 向下翻一页按b向前翻一页其实很好记f即forward 向前b即backward 向后关键最强大的一点…

STL算法分类

STL 中&#xff0c;算法就是函数模板。STL 中的算法大多数是用来对容器进行操作的&#xff0c;如排序、 查找等。大部分算法都是在头文件 中定义的&#xff0c;还有些算法用于数值处理&#xff0c;定义在头文件 中。 STL 中的算法的分类方法。 1 . 不变序列算法。 2 . 变值算法…

linux系统时间代表,Linux上有两种时间,一种是硬件时间,一种是系统时间

date 系统时间clock/hwclock 硬件时钟cal 日历date打印或设置系统日期或时间&#xff0c;以给定格式显示或设置系统时间%a显示周%A 完整显示周%b显示月份%B 完整显示月%c e.g.,Thu Mar 3 23:05:25 2005%C 显示世纪%d显示几日%D …

linux下软件包清理,Linux运维知识:如何清理Linux系统中的孤立、无用的软件包

本文主要向大家介绍了Linux运维知识的如何清理Linux系统中的孤立、无用的软件包&#xff0c;通过具体的内容向大家展现&#xff0c;希望对的大家学习Linux运维知识有所帮助。在Linux下安装软件&#xff0c;通常会自动安装一些依赖包或库。在你卸载某个软件后&#xff0c;这个软…

linux 多个定时器,timer: 一个Linux下的超级精简的多重定时器:可实现成千上万个定时任务,定时精度可达纳秒级别,且同一时间点可添加不同的任务!适用于云后台服务和嵌入式等各种环境。...

MT_Timer(MT译为Multiple或Multi)一、介绍一个Linux下的超级简洁的定时器&#xff1a;利用epoll机制和timerfd新特性实现的多重、多用、多个定时任务实现。只需要使用TIMER_CREATE()接口创建一个定时器实体&#xff0c;即可向其添加成千上万个定时任务&#xff0c;定时任务可达…

C++ bitset类

bitset 模板类由若干个位&#xff08;bit&#xff09;组成&#xff0c;它提供一些成员函数&#xff0c;使程序员不必通过位运算就能很方便地访问、修改其中的任意一位。bitset 模板类在头文件 中定义如下&#xff1a; template <size_t N> class bitset {... };size_t 可…

red flag linux指定域名,Red Flag Server 4.1 系统管理手册(适用桌面linux4.1) 6

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第3章 文件系统管理 (三)--------------------------------------------------------------------------------3.6 LVM逻辑卷管理LVM 是 Logical Volume Manager 的简写&#xff0c;它为计算机提供了更高层次的磁盘存储解决方案&am…

什么是计算机文件

内存中存放的数据在计算机关机后就会消失。要长久保存数据&#xff0c;就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索&#xff0c;引入了“文件”的概念。 一篇文章、一段视频、一个可执行程序&#xff0c;都可以被保存为一个文件&#xff0c;并赋予一个文件名。…

linux下阻塞的系统调用,Linux下文件的阻塞与非阻塞对部分系统调用的影响

1.基本概念所谓的阻塞&#xff0c;即内核在对文件操作I/O系统调用时&#xff0c;如果条件不满足(可能需要产生I/O)&#xff0c;则内核会将该进程挂起。非阻塞则是发现条件不满足就会立即返回。此外需要注意的是非阻塞并不是轮询&#xff0c;不然就和阻塞没多大区别了&#xff0…