串口问题总结:

1容易烧串口芯片:一段是单片机串口另一端是USB-RS232,后来发现单片机的串口芯片(MAX232)发热厉害,无法通讯.后发现虽然收发两端接错了,但想应该不至于因为有的为了测试串口线的收发是否正常专门短接RX-TX.后来看到文章才明白:如果两端串口都是带电源时,地线直接相连,如果此时地线电平差别很大,且经常热插拔就会烧芯片。解决的办法是插拔时至少保证一方的电源时关闭的。

2串口的信号线:虽然现在都用简化的3线串口,但所有的信号线内部并非都是悬空的。若内部非悬空外部悬空可能会差生干扰;若不用的信号线接反也有可能烧坏芯片。所以应对重要的信号线用光耦进行隔离。

3串口的组网:采用双绞线或网线中的两根,带电源线的最好也将VCC GND做成双绞结构。RX485/422布线时总线应远离动力线避免与其平行。采用终端匹配电阻的组网方式而非星型和网状。终端应该离总线较近以避免发射信号对总线的影响。

4串口软件相关的:接收超时、掉线检测、环形缓冲区

4.1接收超时:如果接收收据是ASCII可通过"\0"作为判断结束的标志;如果是固定帧则通过数据长度来确定结束的完成;如果用查询方式也可根据自定义帧结构前端的数据长度来确定结束标志;modbus总线的每个字符间隔和帧间隔时间也可作为结束标志;如果都不是,通过中断接收如果确定结束标志?答案是用超时法:只要中断有数据接收,就将一个超时计数器清零。在中断外部定期拿超时计数器与预定超时进行比较:如果大于设定值说明超时,数据接收完成了就可以解析缓冲区数据了;否则就累加超时计数器。因为一但数据接收完成就不会进入接收中断,计数器也就不会被置0,再周期性检查时它会累加直到大于预设值。设定值也就是在中断接收停止前提下第几次进入超时判断函数。(每次的时间就是判断函数的周期执行时间(如UCOS的周期性任务或定时器中断服务函数的周期调用间隔。)

4.2掉线检测:PC一般采用:每收到一帧数据就将掉线计数器清0,并调用掉线检测函数:拿掉线计数器与预设值比较:大于预设值说明长时间串口不活动,掉线了,就设置掉线标志位,重启串口(调用串口初始化函数),掉线计数器清0;否则掉线计数器累加。在PC有进程线程的系统里面很有用可以根据这个在不用串口是先将其从进程中关掉;或者PC机要发送数据时重启串口然后再发送;

  而对于单片机我们认为串口一直处于活动状态,除非程序自己通过关闭串口的时钟或其它设置方法来把串口关闭了,它没有PC那样复杂的进程概念,一掉线(周期性)就初始化串口反而造成串口的不正常。

4.3环形缓冲区:对于通讯各帧的长度都不一样如果都为其定义一个静态数组,会很浪费系统资源(静态分配一旦分配就不能撤销,而动态分配比较耗时增加系统负担),此时环形数据或叫环形缓冲区就非常适合这种情况:缓冲区的长度按照最长帧的长度来设置。通过帧结束和帧长度2个信息对应不同帧的通讯。

  接收情况:中断一直做是否大于总缓冲区长度的判断:是则清零否则累加 ,并将接收的数据存到接收缓冲区。根据结束标记(超时法),如果接收缓冲区长度大于0有数据就开始二级缓存(只缓存接收计数器计数的实际长度的数据),并清零接收计数器,让其下标为0重新从开头存储。

  发送情况:发送者将各包数据发缓冲器,有个发缓冲计数器的长度;串口发送中断集中将缓冲器的数据通过串口线发出。

时间: 2024-10-17 21:15:11

串口问题总结:的相关文章

Linux 控制台下串口的基本操作

显示串口波特率等信息: stty -F /dev/ttyTHS2 -a  #dev/ttyTHS2为选择的端口号 参数设置: stty -F /dev/ ttyTHS2 ispeed 115200 ospeed 115200 cs8 配置波特率115200数据8bit,一般情况下设置这两个参数就可以了,如果显示数据乱码,可能还需要设置其它参数,使用man查看stty其它设置选项. 发送串口数据: echo 123> /dev/ttyTHS2 读取串口数据: cat /dev/ttyTHS2 读取

Linux下串口编制【转】

串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是RS-232-C接口(又称EIA RS-232-C)它是在1970年由美国电子工业协会(EIA)联合贝尔系统.调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准.串口通讯指的是计算机依次以位(bit)为单位来传送数据,串行通讯使用的范围很广,在嵌入式系统开发过程中串口通讯也经常用到通讯方式之一. Linux对所有设备的访问是通过设备文件来进行的,串口也是这样,为了访问串口,只需打开其设备文件即可操作串口

ubuntu下可用的串口调试工具--cutecom

今天在ubuntu下要用到串口发送16进制数据,百度了很多工具,觉得minicom和cutecom都不错,比较直观是cutecom,所以就介绍下cutecom. 安装: 输入 $ sudo apt-get install cutecom    便可安装 $ cutecom                                    便可执行 这是软件截图: Device:这里是串口名称,但有时识别的串口不能在这里选择,比如ttyUSB0,需要手动修改为 /dev/ttyUSB0 Bau

51单片机之串口通信(三)

51单片机之串口通信(三) 已有 47 次阅读2015-12-29 00:21 |个人分类:51单片机| 单片机, 通信 用串口实现发送和接收同时可操作: 电脑显示结果如图: 源程序: /*项目名称:串口发送接收实验项目内容:串口发送接收同时进行,计算机发送数据给单片机控制P0口,从而控制LED灯的亮灭,单片机发送数据到计算机,计算机显示出来时间:2015年12月23日项目负责人:YUAN*/#include <reg52.h>typedef unsigned char uChar8;type

【工业串口和网络软件通讯平台(SuperIO)教程】六.二次开发导出数据驱动

SuperIO相关资料下载:http://pan.baidu.com/s/1pJ7lZWf 1.1    导出数据接口的作用 在数据集成系统项目中,要么是自已集成其他厂家的设备,要么是其他厂家集成自己家的设备,在没有统一的标准前提下,就会有各种集成数据的格式.为了满足此类的场景,为设备输出数据专门设计了接口,开发者可以继承该接口,设备在处理完数据后,会把数据自动传输到该接口,可以按规定的数据格式进行输出了. 1.2    接口功能说明 开发设备输出接口,主要考虑到在集成项目中,集成过程中或被集成

VELT-0.1.5开发: gdb串口调试内核时信息丢失的问题

快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 本文仅适用于vs2013 + velt-0.1.5 VELT的全称是Visual EmbedLinuxTools,它是一个与visual gdb类似的visual studio插件,用以辅助完成Linux开发.利用这个插件,将可以在visual studio的IDE中进行Linux应用程序的开发(包括编译和调试),也可

linux串口驱动分析——发送数据

一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数,找到使用的file_operations,即应用程序与tty架构的统一接口.步骤不再赘述. static const struct file_operations tty_fops = { .llseek = no_llseek, .read = tty_read, .write = tty_wr

通过串口接收带有标识符的数据方法

在做串口通信过程中,下位机向上位机发送的串口数据有时候需要带有指定的标识符,便于上位机根据标识符判断后续几位数据是做什么用的.也就是下位机和上位机约定数据帧的传输格式,便于在上位机将数据分离,当然这种数据帧格式可以自定义. 今天用arduino作为下位机,模拟数据通过自定义格式发送数据帧,利用串口将数据帧发送到android上位机,上位机用java代码实现数据提取,并在界面实时显示接收数据,虽然是模拟数据通过串口发送,但在实际项目开发中,原理相通. 以下是arduino代码,通过设定定时器,当接

Linux串口IO模式的一些心得

众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样. 通常I/O操作都是有阻塞与非阻塞的两种方式. 其中"超时"这个概念其实是阻塞中的一种处理手段,本质还是属于阻塞的I/O模式. 在Linux中串口的IO操作 本文将它分为三种状态: 阻塞状态 超时状态 非阻塞状态 这三种状态的转换组合有这么几种: 阻塞 --> 超时 阻塞 --> 非阻塞 超时 --> 阻塞 超时 --> 非阻塞 非阻塞 --> 阻塞 我们一个一个来分析 首先在一个串口的

温度传感器+I2C+串口+PC上位机(pyserial)例子

例子写的有点乱,主要是学习: 温度传感器DS18b20,E2PROM,I2C, 串口读写,PC上位机(pyserial)数据显示 SerialPort.py     PC串口上位机程序,可以设定上限报警温度 需要安装Python3以上,pyserial库,例子在Python3.4下写的. 上位机传给单片机上限报警温度后,单片机存入E2PROM, 单片机断电重启后,从E2PROM读取报警值. i2c.h             I2C总线读写和设定 lcd1602.h         lcd160