打印

【求助】T叔,请问有没有串口流控制方面的书籍啊?

[复制链接]
1437|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
whisky616|  楼主 | 2014-3-16 21:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
T叔请进,最近工作中碰到了串口流控制通讯,看起来很简单的几根线,RTS,CTS接好后,用串口调试软件要么接收不到数据,要么就收到一大串乱码。
百度也找不到有参考价值的资料:Q。。。。
请问T叔有没有串口流控制方面的书籍啊,有的话共享一下,谢谢!!

相关帖子

沙发
dirtwillfly| | 2014-3-16 21:39 | 只看该作者
这个要慢慢调试

使用特权

评论回复
板凳
tyw| | 2014-3-17 07:04 | 只看该作者
本帖最后由 tyw 于 2014-3-17 07:06 编辑

串口标准,说说流控制(RTS/CTS/DTR/DSR 你都明白了吗?) Posted on 2010-02-04 13:34 ccjvl 阅读(9350) 评论(4) 编辑 收藏
先引用一篇网文,作者不详,因几个地方都说自己是原创,我昏了,不知道是谁原创的
RS232中RTS和CTS的作用
问:
以前挺明白的,今天一下子觉得以前的理解都不对了,以下三种解释哪个对呢?

解释一:
RTS:终端我已经准备就绪,有数据就发过来吧
CTS:来了,接招

解释二:
RTS:终端我准备发数据给你,快用CTS应答,准备好没?
CTS:好了,来吧

解释三:
CTS:主机,我有数据,请求接收
RTS:我是主机,就绪,请求发送。

我今天弄了个SIM100模块,我将RTS设置无效之后,凡是要发往主机的数据都没有发过来(包括主动 数据RING),指令和指令返回结果都没有返回,都缓存在模块之中,等我将RTS设置有效后,缓存的数据全发来了,包括一大堆指令的执行结果,由此,我觉 得上面的“解释一”应该正确,而“解释二”应该是错的,但“解释三”是否正确呢?就是说CTS和RTS哪个是发起者呢?
答:
一是错的
二是RS232标准
三是MODEM的硬件流控
SIMCOM公司的解释完全正确

    很久很久以前,计算机还没有出现,那时就已经存在了(计算机)史前的串口设备(电传打字机,工控测量设备,通信调制解调器),为了连接这些串口,EIA制 定了RS232标准,采用DB25接插件,支持同步和异步串口,D型的接口可以有效防止插反。标准化给使用带来了便利。
    时光荏苒,个人计算机出现了,这些已有的串口设备毫无疑问地成为了最初的外设,自然而然地RS232标准被个人计算机采纳。但是设备制造商倾向于体积更 小,成本更低的接口,因此,将DB25中未使用的和支持同步模式的引脚去掉,形成DB9。最初的情况相当混乱,因为DB9只定义了信号,却没有指定信号和 引脚的对应关系,各个制造商只能自行定义。幸运的是,IBM的PC成了工业标准,DB9逐渐统一到IBM的定义上来。
    DB9只有9根线,遵循RS232标准。定义如下:
    DTR,DSR------DTE设备准备好/DCE设备准备好。主流控信号。
    RTS,CTS------请求发送/清除发送。用于半双工时,收发切换。属于辅助流控信号。半双工的意思是说,发的时候不收,收的时候不发。那么怎么区 分收发呢?缺省时是DCE向DTE发送数据,当DTE决定向DCE发数据时,先有效RTS,表示DTE希望向DCE发送,一般DCE不能马上转换收发状 态,DTE就通过监测CTS是否有效来判断可否发送,这样避免了DTE在DCE未准备好时发送所导致的数据丢失。
    全双工时,这两个信号一直有效即可。
   
    随着计算机的日益普及,很多非RS232的串口也要接入PC机,如果为每一种新出现的串口都增加一个新的I/O口显然不现实,因为PC后面板位置有限,因 此,将RS232串口和非RS232串口都通过RS232口接入是最佳方案。UART的U(通用)指的就是这个意思。早期ROM BIOS和DOS里的通信软件都是为RS232设计的,在没有检测到DCD有效前不会发送数据,因此,就连发送一个字符这样朴素的应用也要给出DCD、 DTR、DSR等控制信号。因此,串口接头上要将一些控制线短接,或者干脆绕过系统软件自己写通信程序。
    到此,UART的涵义就总结为:通用的 异步 (串行) I/O口。
    就在UART冠以通用二字,准备一统江湖的时候,制造商们不满于它的速度、体积和灵活性(软件可配置),推出了USB和1394串口。目前,笔记本上的 UART串口有被取消的趋势,因而有网友发出了“没有串口,吾谁与归”的慨叹,古今多少事,都付笑谈中,USB取代UART是后话,暂且不表。
    话说自从贺氏(Hayes)公司推出了聪明猫(SmartModem),他们制定的MODEM接口就成了业界标准,自此以后,所有公司制造的兼容猫都符合贺氏标准(连AT指令也兼容,大家一起抄他呗)。
    细观贺氏制定的MODEM串口,与RS232标准大不相同。DTR在整个通信过程中一直保持有效,DSR在MODEM上电后/可以拨号前有效(取决于软件 对DSR的理解),在通信过程的任意时刻,只要DTR/DSR无效,通信过程立即终止。在某种意义上,这也可以算是流控,但肯定不是RS232所指的那种 主流控。如果拘泥于RS232,你是不会理解DTR和DSR的用途的。
    贺氏不但改了DTR和DSR,竟然连RTS和CTS的涵义也重新定义了。因此,RTS和CTS已经不具有最开始的意义了。从字面理解RTS和CTS,是用 于半双工通信的,当DTE想从收模式改为发模式时,就有效RTS请求发送,DCE收到RTS请求后不能立即完成转换,需要一段时间,然后有效CTS通知 DTE:DCE已经转到发模式,DTE可以开始发送了。在全双工时,RTS和CTS都缺省置为有效即可。然而,在贺氏的MODEM串口定义中,RTS和 CTS用于硬件流控,和什么劳什子的全双工/半双工一点关系也没有。
    注意,硬件流控是靠软件实现的,之所以强调“硬件”二字,仅仅是因为硬件流控提供了用于流量情况指示的硬件连线,并不是说,你只要把线连上,硬件就能自己流控。如果软件不支持,光连上RTS和CTS是没有用的。
    RTS和CTS硬件流控的软件算法如下:(RTS有效表示PC机可以收,CTS有效表示MODEM可以收,这两个信号互相独立,分别指示一个方向的流量情况。

========== 我是分隔线 ==========
以下是我的几句胡言乱语
最近在捣鼓一个GSM模块,正好也要用到这东西,就baidu了一把,可以帮助我理解Datasheet的内容。看了上面的内容,我不知道各位明白了几分,如果觉得都明白了,就不用看我废话了。
还是先引用一些文字,来自Telit公司GM862 QUAD/PY的数据手册
Pin Signal    I/O Function
20 C103/TXD I Serial data input (TXD) from DTE
29 C106/CTS O Output for Clear to send signal (CTS) to DTE
33 C107/DSR O Output for Data set ready signal (DSR) to DTE
37 C104/RXD O Serial data output to DTE
43 C108/DTR I Input for Data terminal ready signal (DTR) from DTE
45 C105/RTS I Input for Request to send signal (RTS) from DTE

注意上面各个功能的I/O的方向,看到这些缩写的全称,结合信号流向,是不是更容易理解呢
DTE是数据发送的主动方,DCE是数据的接受方。
CTS是让DTE明白的,也就是说DCE需要把自己的CTS给DTE看,让他知道DEC已经准备好接受数据了。
RTS是DTE给DCE看的,告诉DCE,DTE有数据要发。

好啦,这个话题就到这里~~ 还没看懂的同学继续.....

虽然**有些时日了,但是看到你认真的写了这么多。估计也有类似的人来看到这**吧。
所以,因为在这方面,多少有些经验。纯粹从技术讨论讨论的角度,提出一些个人看法。事不辨不明吧,呵呵

不从全文角度逐点去点评了,摘几个重要的:
1、“注意,硬件流控是靠软件实现的,之所以强调“硬件”二字,仅仅是因为硬件流控提供了用于流量情况指示的硬件连线,并不是说,你只要把线连上,硬件就能自己流控。如果软件不支持,光连上RTS和CTS是没有用的。”
——这个说法不是太准确。硬件流控提供了用于流量情况指示的硬件信号!注意是信号而不是连线!硬件流控和软件流控当然都是靠软件实现的。他们的区别是:对于硬件流控,软件靠判断相应信号线的电平来判断是否可以收发;而软件流控,需要自己写控制字符(比如:你想发送N行内容,你可以把0x0a或/和0x0d作为软件流控控制符),去判断可否收发。

2、另外一点,MODEM(包括贺氏)根本没有改变RS232的标准定义。至少在RTS/CTS方面是如此,如果你觉得改变了,那就是还没有理解对。

已经写的比较长了,有时间再讨论。


浅析PC机串口通讯流控制
龚建伟 2001.8.23
    我们在串行通讯处理中,常常看到RTS/CTS和XON/XOFF这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通RS232编程,了解一点这方面的知识是有好处的。那么,流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题。

       1.流控制在串行通讯中的作用
     这里讲到的“流”,当然指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。现在我们在网络上通过MODEM进行数据传输,这个问题就尤为突出。流控制能解决这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。  PC机中常用的两种流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和软件流控制XON/XOFF(继续/停止),下面分别说明。


      2.硬件流控制
    硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。
    硬件流控制必须将相应的电缆线连上,用RTS/CTS(请求发送/清除发送)流控制时,应将通讯两端的RTS、CTS线对应相连,数据终端设备(如计算机)使用RTS来起始调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用CTS来起动和暂停来自计算机的数据流。这种硬件握手方式的过程为:我们在编程时根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我们在接收端将CTS线置低电平(送逻辑0),当发送端的程序检测到CTS为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将CTS置高电平。RTS则用来标明接收设备有没有准备好接收数据。
    常用的流控制还有还有DTR/DSR(数据终端就绪/数据设置就绪)。我们在此不再详述。由于流控制的多样性,我个人认为,当软件里用了流控制时,应做详细的说明,如何接线,如何应用。


      3.软件流控制
    由于电缆线的限制,我们在普通的控制通讯中一般不用硬件流控制,而用软件流控制。一般通过XON/XOFF来实现软件流控制。常用方法是:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据发送端发出XOFF字符(十进制的19或Control-S,设备编程说明书应该有详细阐述),发送端收到XOFF字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出XON字符(十进制的17或Control-Q),发送端收到XON字符后就立即开始发送数据。一般可以从设备配套源程序中找到发送的是什么字符。
    应该注意,若传输的是二进制数据,标志字符也有可能在数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。

    顺便说明一下,有不少朋友问到,为什么不在我编写的软件串口调试助手中将流控制加进去,我最初将这个调试工具定位在各种自动控制的串口程序调试上,经过计算和实验验证,在设置的特定采样周期内可以完成通讯任务,就干脆不用流控制。而且在工控中您即使不懂流控制,也能编写出简单的串口通讯程序来,就如我写的串口调试助手。


使用特权

评论回复
地板
whisky616|  楼主 | 2014-3-17 12:57 | 只看该作者
谢了。

使用特权

评论回复
5
zhangmangui| | 2014-3-17 13:33 | 只看该作者
T叔很强大

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

78

帖子

0

粉丝