虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。废话少讲,今天来解剖使用串口时的编程代码细节。...上面的代码是使用串口的第一步,来解释下都是啥意思。...来瞧瞧: 第21-22行,定义了一个用来配置串口属性的结构体: struct termios serial; bzero(&serial, sizeof(serial)); 第24行,将串口设置为raw...cfsetispeed(&serial, B9600); cfsetospeed(&serial, B9600); 第28-32行,设置串口控制属性(c_cflag),其中: serial.c_cflag...: tcsetattr(fd,TCSANOW,&serial); 当然,上面的 fd 就是系统中的某一个你想要设置的成上面那样的属性参数的串口,比如就拿粤嵌GEC210开发板来说,他有四个串口,其中第一个就已经被用于终端控制了
/* * uart 打开分析 * * 问题: 当应用程序调用open系统调用函数,那么是如何open串口的?
http://blog.csdn.net/lingfengtengfei/article/details/12392449 在Linux中,我们可以使用select函数实现I/O端口的复用,传递给 select...(5)structtimeval* timeout是select的超时时间,这个参数至关重要,它可以使select处于三种状态,第一,若将NULL以形参传入,即不传入时间结构,就是将select置于阻塞状态...(2)将fd加入select监控集的同时,还要再使用一个数据结构array保存放到select监控集中的fd,一是用于再select返回后,array作为源数据和fd_set进行FD_ISSET判断。...(3)可见select模型必须在select前循环array(加fd,取maxfd),select返回后循环array(FD_ISSET判断是否有时间发生)。 基本原理 ?...select()系统调用代码走读 调用顺序如下:sys_select() à core_sys_select() à do_select() à fop->poll() ? ? ? ? ? ?
最近在了解嵌入式方面的知识,就随笔记录一下: 查看Linux本机串口: 1、查看串口是否可用 可以对串口发送数据比如对com1口,echo /dev/ttyS0 2、查看串口名称使用 ls...-l /dev/ttyS* 一般情况下串口的名称全部在dev下面,如果你没有外插串口卡的话默认是dev下的ttyS*,一般ttyS0对应com1,ttyS1对应com2,当然也不一定是必然的; 3、...查看串口驱动 cat/proc/tty/drivers/serial 4、查看串口设备 dmesg | grep ttyS* 5、查一下板子上的串口有没有设备 grep tty/proc.../dev下应该有一个USB串口:/dev/ttyUSB0. 当一个串行卡或数据卡被侦测到时,它会被指定成为第一个可用的串行设备。...PC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC; 串口使用: 如果需要查看这个串口设备输出: cat ttyUSB0 如果需要对这个设备输入: echo yaoxu > ttyUSB0
/*串口read函数分析 * 当应用程序调用read系统调用时,会调用tty_fops中的tty_read * 接下来分析tty_read函数 * * 其中最重要的就是ld->ops->read(tty...* 那么当我们的串口有数据的话,当然就调用我们以前注册的rx中断函数了。...unsigned int ufcon, ch, flag, ufstat, uerstat; int max_count = 64; while (max_count-- > 0) { /*读取UFCON串口配置寄存器...*/ ufcon = rd_regl(port, S3C2410_UFCON); /*读取 UFSTAT串口状态寄存器。...UERSTAT_OVERRUN, ch, flag); } /*这是才将整个数据送tty->read_buf中去*/ tty_flip_buffer_push(tty); } /* 将串口产生的数据送进
/*和read的分析过程一样, 我们首先分析tty_write*/ /*最重要的就是do_tty_write函数。 前面都是一些合法性判断*/ static ...
查看Linux本机串口: 1、查看串口是否可用 如果需要查看这个串口设备输出: cat ttyUSB0 如果需要对这个设备输入: echo yaoxu > ttyUSB0 常用的调试工具有: minicom...cutecom Linux系统可视化串口应用软件,使用上与Windows系统串口调试工具。 picocom 效果上类似 minicom 的精简版,设置比较简单,还可以有背景颜色。...PC上的串口一般是ttyS,板子上Linux的串口一般叫做ttySAC; 串口权限问题 临时调试解决 在使用串口进行通信时,经常需要使用指令来赋予用户读写的权限 $ sudo chmod 777 /dev...查看linux所有用户 使用 /etc/passwd 文件 使用任何一个像 cat、more、less 等文件操作命令来打印 Linux 系统上创建的用户列表。.../etc/passwd 是一个文本文件,其中包含了登录 Linux 系统所必需的每个用户的信息。
Select函数使用简单,其工作原理大家通常也知道,但是在实际的使用过程中可能并没有严格遵守,而且确实也比较难以完全遵守,除非不使用它。...Select采用一个bit表,每个fd对应表中的一个bit位,宏FD_SETSIZE为表的大小,添加到fd_set中的fd值必须小于FD_SETSIZE,否则就会越界,假设有如下一段代码: fd_set...较容易发生在服务端程序中,因为服务端程序同一时刻的连接数很容易超过默认的FD_SETSIZE值,而服务端的代码可能是使用epoll使用的,所以它本身并不会存在问题,但是程序中可能还有个客户端,比如使用了select...来实现超时连接,这个时候问题就来了,当连接数超过FD_SETSIZE时,超时连接处的select调用就发生了越界,进程就会在某个可能完全不相干的地方crash,要定位这个问题的成本是很高的,不具备一定经验...那就是尽量不使用select,而应当使用更安全的poll函数来替代,因为poll使用的数组是调用者自己维护的,完全可以保证不越界。
简介 嵌入式Linux下串口编程与Linux系统下的编程没有什么区别,系统API都是一样的。...嵌入式设备中串口编程是很常用的,比如会对接一些传感器模块,这些模块大多是RS232或者RS485接口,对于软件层面上来说,RS232与RS48区别不大。...RS232与RS485在使用上的区别,RS232是全双工的,只能对接一个设备串口设备。RS485是半双工的总线协议,一般可以挂多个传感器设备,半双工的意思是同时只能有一个设备向串口发数据。...用到的API函数 函数 说明 open 打开设备,用于打开串口设备 fcntl 修改设备描述符属性参数 isatty 检测打开的描述符是否指向一个终端 tcgetattr 用来获取串口终端参数 cfmakeraw...将终端设置为原始模式,该模式下所有的输入数据以字节为单位被处理 tcflush 用于清空输入、输出缓冲区 tcsetattr 设置串口终端参数 read 读取数据 write 写数据 close 关闭串口设备
pollfd)是select()与poll()的特性。...实际linux内核设计: * 每个wait_queue_t的private字段指向同一个poll_wqueues,然后 * 共用的poll_wqueues中保存了指向调用进程...()的调用进程 */ return default_wake_function(&dummy_wait, mode, sync, key); } select 调用链: sys_select()...= stack_fds) kfree(bits); out_nofds: return ret; } /** * do_select - select()核心函数 * @n...: select()的第一个参数 * @fd_set_bits: core_sys_select()处理的描述符集 * @end_time: 绝对超时时间 */ int do_select(int
Linux ioctl FIONREAD 和select 使用 使用select 与ioctl判断socket client是否断开的方式 (1)ioctl + FIONREAD int nsel...= select(maxfd+1, &(rfds), NULL, NULL, &timeout); if(-1 !
/** * uart分析 * * 其实串口分析就两个重要的文件: S3c2440.c Samsung.c * * **/ /*1...其实每一个串口都对应一个uart_port结构 * 这里只初始化了tty_port结构。...KERN_ERR "s3c24xx_init_uarts: cpu has no uart init\n"); } else (cpu->init_uarts)(cfg, no); } /*初始化系统上的串口资源...用于初始化uart_port 3. s3c24xx_serial_ops: 硬件的操作集 4. s3c24xx_uart_info: 用于初始化uart_port 其实也就是:编写S3c2440.c这个串口文件
msm_serial_hs_lite.c: 低速版本, 设备树内容配置为compatible = “qcom,msm-lsuart-v14”;
目前使用minicom作为串口软件。但使用过程中,有一点感觉不方便的地方,就是我需要使用多个串口,当使用的不是串口0时,就要手动修改minicom的配置。...于是考虑实现脚本,自动列出当前串口,选择后调用minicom打开指定串口,免去手工修改的麻烦。.../bin/bash #set -x ports=`ls /dev/ttyUSB*` select port in $ports;do if [ $port ]; then echo..."You select the choice '$port'" port=${port##*/} sed -i "s/\(pu port ....,输入com,即可列出当前的串口,选择后可打开对应串口。
select API 原型: [cpp] view plaincopy #include int select ( int nfds, fd_set* readfds...函数的超时时间 返回状态: select成功时返回就绪(可读、可写和异常)文件描述符的总数。...如果在超时时间内没有任何文件描述符就绪,select将返回0....select失败时返回-1并设置errno 如果select 等待期间,程序接收到信号,则select立即返回-1,并设置errno为EINTR。...---- 参考资料: 《Linux高性能服务器编程》
而此时走过来一个李四,李四这名少年也很喜欢钓鱼,但李四和张三不一样,李四左口袋装着《Linux高性能服务器编程》,右口袋装着一本《算法导论》,左手拿手机,右手拿了一根鱼竿,李四拿了钓鱼凳坐下之后,李四就开始钓鱼了...在这里额外补充一下,linux命令行中表示输入结束的快捷键是ctrl+d,当此热键被用户按下后,代表0号文件描述符写端关闭,此时读端会读到0,read会返回0值,此时进程除了输出提示信息"read file...虽然说epoll是作了改进的poll,但在接口的使用和底层实现上,epoll和poll天差地别,在linux内核2.5.44版本时,就引入了epoll接口,而现在主流的linux内核版本已经是3点几了。...模型其实也是一个struct file结构体,所以epoll_create创建epoll模型成功后,会返回一个文件描述符,而epoll_create的size参数早在内核版本2.6以后就已经被忽略了,在早期的linux...Linux、Unix、Windows 等 ---- poll缺点: (1)需要程序员自己维护一个第三方结构体数组来存储用户关心的fd及事件 (2)与select相同的是,用户仍然需要遍历整个数组来找出就绪的文件描述符
使用select接口写高精确延时。...select接口 intselect(intmaxfdp,fd_set*readset,fd_set*writeset,fd_set*exceptset,structtimeval*timeout);...原理 利用select的timeout参数实现定时器; 设置timeval的值,而将其他参数都置为NULL,当内部时间耗尽后select便会退出。...tv.tv_sec = usec / 1000000; tv.tv_usec = usec % 1000000; int err; do { err = select
前言 通过阅读本文,帮你理清select的来龙去脉, 你可以从中了解到: 我们常说的select的1024限制指的是什么 ?怎么会有这样的限制? 都说select效率不高,是这样吗?为什么 ?...注:本文的所有内容均指针对 Linux Kernel, 当前使用的源码版本是 5.3.0 原型 int select (int __nfds, fd_set *__restrict __readfds,...max_fds; rcu_read_unlock(); if (n > max_fds) n = max_fds; 这个n是三类不同的fd_set中所包括的fd数值的最大值 + 1, linux...linux man中的解释如下: nfds should be set to the highest-numbered file descriptor in any of the three sets...精华所在 do_select wait queue 这里用到了Linux里一个很重要的数据结构 wait queue, 我们暂不打算展开来讲,先简单来说下其用法,比如我们在进程中read时经常要等待数据准备好
提出问题 在Linux编程中,一切皆文件,往往是对一个文件进行操作,比如说串口,和传感器打交道,一般情况下就是一来一去,一收一发,但是,如果我有多个传感器,而传感器之间又有关联,我想同时监控一个或者多个以上的文件描述符...解决问题 Linux健全的API已经为我们提供了解决问题的方法,在此我们引入select()函数、poll函数。...*这个值是系统相关的*,同时检查你的系统中的select()的man手册。有一些系统对多于1024个文件描述符的支持有问题。 [Linux就是这样的系统!...[在Linux中,timeout指的是程序在非sleep状态中度过的时间,而不是实际上过去的时间,这就会引起和非Linux平台移植上的时间不等问题。...移植问题还包括在System V风格中select()在函数退出前会把timeout设为未定义的NULL状态,而在BSD中则不是这样,Linux在这点上遵从System V,因此在重复利用timeout
领取专属 10元无门槛券
手把手带您无忧上云