linux串口编程用read函数读取数据被截断怎样一次读完
作者:wepiehr | 来源:互联网 | 2023-05-17 20:33
linux串口读取数据被截断,怎样一次全部接收?打开串口后,用read读取串口数据,串口发来的数据为20,而用read读取到的数据却是分多次得到的?有时只读了8个数据便被截断了,这是为什么??怎样一
linux 串口读取数据被截断,怎样一次全部接收? 打开串口后,用read读取串口数据,串口发来的 数据为20,而用read读取到的数据却是分多次得到的? 有时只读了8个数据便被截断了,这是为什么?? 怎样一次全部接收?? 谢谢 附代码:#include #include /*Unix标准函数定义*/ #include /**/ #include /**/ #include /*文件控制定义*/ #include /*PPSIX终端控制定义*/ #include /*错误号定义*/ #include #include int main() { int fd,readnum; char *dev="/dev/ttyS0",recv[100]; struct termios opt,oldopt; fd = open( dev, O_RDWR ); tcgetattr( fd,&oldopt); tcgetattr( fd,&opt); cfsetispeed(&opt, B9600);//9600 cfsetospeed(&opt, B9600); opt.c_cflag &= ~PARENB; //N opt.c_cflag &= ~INPCK; opt.c_cflag &= ~CSTOPB;//1 opt.c_cflag &= ~CSIZE; opt.c_cflag |= CS8; //8 opt.c_iflag &= ~(IXON | IXOFF | IXANY); opt.c_cc[VTIME] = 0; opt.c_cc[VMIN] = 0; opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/ opt.c_oflag &= ~OPOST; /*Output*/ tcflush(fd, TCIOFLUSH); tcsetattr(fd, TCSANOW, &opt); while(1) { bzero(recv,100); while((readnum = read(fd,recv,100))>0) { printf("%s\n",recv); } } tcflush(fd, TCIOFLUSH); tcsetattr(fd, TCSANOW, &oldopt); close(fd); } 一般地串口的读写模式有直接模式和缓存模式,在直接模式下,串口的读写都是单字节的,也就是说一次的read或write只能操作一个字节;另外大部份串口芯片都支持缓存模式,缓存模式一般同时支持中断聚合和超时机制,也就是说在有数据时,当缓存满或者超时时间到时,都会触发读或写中断。写的时候可以将要操作的数据先搬到缓存里,然后启动写操作,芯片会自动将一连串的数据写出,在读的时候类似,一次读到的是串口芯片缓存里的数据。串口设备的缓存一般有限,一次能read到的最大字节数就是缓存的容量。 所以你串口芯片的缓存容量决定了你一次能收到的字节数。 楼主,你可以一个字节一读,使用一个全局计数器来保证收到8个字节的数据。 可以使用select/poll来避免超时接收。 从通讯的角度来说,接受方必须自己解决如何识别一个祯的问题。 操作串口相当于操作物理层,OSI/ISO模型中的第一层,解决祯同步问题是第二层的任务,所以你需要自己搭一个第二层。 简单的说,你需要通过定义通讯协议,规定数据的内容自己分析什么时候收完了一次需要的数据。因为通讯过程中无法保证一次发送的数据肯定是一次接收的。
推荐阅读
本文详细介绍了如何在Vue.js中通过$children和$refs属性实现父组件对子组件的访问,并提供了具体的代码示例及最佳实践。 ...
[详细]
蜡笔小新 2024-12-28 13:15:10
本文深入探讨了图形显卡的进化历程,重点介绍了非公版RTX 3080显卡的技术特点和创新设计。 ...
[详细]
蜡笔小新 2024-12-28 13:07:40
距离11月的软考还有不到五个月的时间,考试将于11月5日至6日举行。许多朋友对软考的具体情况还不太了解:它是什么?有何用途?本文将为你详细解答。 ...
[详细]
蜡笔小新 2024-12-28 12:34:12
本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ...
[详细]
蜡笔小新 2024-12-28 12:22:34
本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ...
[详细]
蜡笔小新 2024-12-28 11:54:54
本文介绍了 Python 3.4 版本引入的标准库 asyncio,该库为异步 IO 提供了强大的支持。我们将探讨为什么需要 asyncio,以及它如何简化并发编程的复杂性,并详细介绍其核心概念和使用方法。 ...
[详细]
蜡笔小新 2024-12-28 11:52:00
本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ...
[详细]
蜡笔小新 2024-12-28 11:05:31
本文详细介绍了磁盘的基本结构、接口类型、分区管理以及文件系统格式化等内容,并提供了实际操作步骤,帮助读者更好地理解和掌握 CentOS 7 中的磁盘与文件系统管理。 ...
[详细]
蜡笔小新 2024-12-28 10:58:44
本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ...
[详细]
蜡笔小新 2024-12-28 10:36:30
Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ...
[详细]
蜡笔小新 2024-12-28 10:17:59
本文详细介绍如何在PyCharm中配置和使用Pylint,帮助开发者进行静态代码检查,确保代码符合PEP8规范,提高代码质量。 ...
[详细]
蜡笔小新 2024-12-28 10:16:06
本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ...
[详细]
蜡笔小新 2024-12-28 09:46:23
本文探讨如何利用ASM框架进行字节码操作,以优化现有类的转换过程,简化复杂的转换逻辑,并移除不必要的加0操作。通过这些技术手段,可以显著提升代码性能和可维护性。 ...
[详细]
蜡笔小新 2024-12-28 09:35:00
本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ...
[详细]
蜡笔小新 2024-12-28 09:10:26
来源:机器之心。本文详细介绍了TensorFlow官方提供的中文版教程和指南,帮助开发者更好地理解和应用这一强大的开源机器学习平台。 ...
[详细]
蜡笔小新 2024-12-28 09:00:51