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%

linux练习 串口跟进程6,linux下串口测试程序相关推荐

  1. Linux内核态之间进程通信,Linux 系统内核空间与用户空间通信的实现与分析[转载]...

    [https://www.ibm.com/developerworks/cn/linux/l-netlink/index.html] 多数的 Linux 内核态程序都需要和用户空间的进程交换数据,但 ...

  2. linux如何判断同名进程个数,Linux下判断是否存在多个同名进程

    Linux 下如何判断同名进程的个数,这个可以通过shell命令ps -e | grep -c "所查进程名字",就可以得到进程的个数.这里给出代码实现. bool process ...

  3. linux 让暂停的进程恢复,Linux 下进程的挂起和恢复命令

    本文给大家介绍进程的挂起及恢复命令,具体内容如下所示: #ctrl+z:挂起,程序放到后台,程序没有结束. #jobs:查看被挂起的程序工作号 恢复进程执行时,有两种选择:fg命令将挂起的作业放回到前 ...

  4. linux从串口接收数据丢失_Linux系统下串口接收数据,部分特殊字符丢失的解决方法...

    最近在linux系统中写了个串口接收程序,发送端依次从0x00~0xFF发送字符,但接收端某些字符老接收不到,分析及其解决方法如下: 一.只接收到数据: 05 06 07 08 09 0a 解决此问题 ...

  5. linux查看某端口进程占用,Linux下查看某端口占用进程

    文章分类:操作系统 在Linux操作系统中 查看占用某一端口的进程是什么:#lsof -i:端口号 或者 netstat -apn | grep redis [root@192_168_56_28 ~ ...

  6. linux db2sysc 内存,db2sysc进程占用linux内存持续增长,请各位指点。

    该服务器近期做过的变更情况: 变更前,使用 sar -r 1 3 看内存使用率服务器内存使用率一直是70% 该服务器原为独立物理服务器,经过虚拟化迁移到EXS上成为虚拟服务器.迁移后发现swap无法启 ...

  7. linux lockf文件锁存在,进程停止,Linux文件锁学习-flock, lockf, fcntl

    这三个函数的作用都是给文件加锁,那它们有什么区别呢? 首先flock和fcntl是系统调用,而lockf是库函数.lockf实际上是fcntl的封装,所以lockf和fcntl的底层实现是一样的,对文 ...

  8. linux kill强制结束进程参数,Linux结束进程之kill、killall、pkill命令

    1. 前言 我们经常在Linux里使用kill命令来结束某后台进程.但kill命令实际上是向进程发送信号,并且有多种信号.终止运行一个程序只是其中一个信号而已.kill是根据进程号发送信号的,而另一个 ...

  9. linux查看目录被进程占用空间,linux lsof命令详解 (查看目录被哪些进程占用)

    简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件.所以如传输控 ...

最新文章

  1. 283. 移动零golang
  2. Android 实现指纹识别demo
  3. Python接口自动化之pymysql数据库操作
  4. 应用架构、业务架构、技术架构和业务流程图详解
  5. QT项目六:简易客户信息管理系统
  6. 理解稀疏编码sparse coding
  7. Cesium 获取屏幕窗口经纬度范围(2D和3D)
  8. 围棋软件测试自学,围棋软件等级棋力水平测试(正版)
  9. 父亲有过目不忘的本事
  10. 企业即时通讯系统十大排名
  11. 那些年你追过的女神:开发人员应该懂多少运维
  12. 前端javascript 实现导出excel 支持分页
  13. 重装java后hadoop配置文件的修改
  14. Excel如何实现两个工作表数据的对比,比较两个Excel表,两个表格对比 的绿色工具
  15. 玩转Tomcat高级篇
  16. redis 五大数据类型
  17. 深入了解,学习线索二叉树
  18. [力扣刷题总结](双指针篇)
  19. Linux中的文件IO以及JDK中的NIO模型简介
  20. PowerVM 高级功能——N_PIV

热门文章

  1. es multi match_PHP 的ES搜索操作
  2. 火狐怎么放大页面?火狐浏览器页面放大技巧
  3. 设置搜狗浏览器为默认浏览器时被360拦截怎么办?
  4. 腾讯视频免费下载安装_怎样下载腾讯视频里的视频
  5. 利用RTMP或RTSP实现跨平台一对一互动功能
  6. Uncaught (in promise) DOMException 报错
  7. java中的重量级与轻量级概念
  8. mysql 数据库 文件夹_mysql 数据库 文件夹
  9. java restful文件传输_java中使用restful web service来传输文件
  10. 2020有效的邮箱号大全_2020年公众号免费裂变涨粉的3个有效方法,让我一天涨粉6000...