串口的流控制

我们在串行通讯处理中,常常看到rts/cts和xon/xoff这两个选项,这就是两个流控制的选项,目前流控制主要应用于调制解调器的数据通讯中,但对普通rs232编程,了解一点这方面的知识是有好处的。那么,流控制在串行通讯中有何作用,在编制串行通讯程序怎样应用呢?这里我们就来谈谈这个问题。

流控制在串行通讯中的作用

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


硬件流控制

硬件流控制常用的有rts/cts流控制和dtr/dsr(数据终端就绪/数据设置就绪)流控制。硬件流控制必须将相应的电缆线连上,用rts/cts(请求发送/清除发送)流控制时,应将通讯两端的rts、cts线对应相连,数据终端设备(如计算机)使用rts来起始调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用cts来起动和暂停来自计算机的数据流。这种硬件握手方式的过程为:

我们在编程时根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我们在接收端将cts线置低电平(送逻辑0),当发送端的程序检测到cts为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将cts置高电平。rts则用来标明接收设备有没有准备好接收数据。

常用的流控制还有还有dtr/dsr(数据终端就绪/数据设置就绪),我们在此不再详述。由于流控制的多样性,我个人认为,当软件里用了流控制时,应做详细的说明,如何接线,如何应用。


软件流控制

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


原文链接:http://blog.csdn.net/skyflying2012/article/details/7945022

PIC单片机模拟IIC从机通讯

IIC简介

IIC是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线:SerialClock(简称SCL)和SerialData(简称SDA)。

IIC是总线结构,1个Master,1个或多个Slave,各Slave设备以7位地址区分,地址后面再跟1位读写位,表示读(=1)或者写(=0),所以我们有时也可看到8位形式的设备地址,此时每个设备有读、写两个地址,高7位地址其实是相同的。

IIC数据格式如下:

  • 无数据:SCL=1,SDA=1;
  • 开始位(Start):当SCL=1时,SDA由1向0跳变;
  • 停止位(Stop):当SCL=1时,SDA由0向1跳变;
  • 数据位:当SCL由0向1跳变时,由发送方控制SDA,此时SDA为有效数据,不可随意改变SDA;当SCL保持为0时,SDA上的数据可随意改变;
  • 地址位:定义同数据位,但只由Master发给Slave;
  • 应答位(ACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=0;
  • 否应答位(NACK):当发送方传送完8位时,发送方释放SDA,由接收方控制SDA,且SDA=1。

当数据为单字节传送时,格式为:

  • 开始位,8位地址位(含1位读写位),应答,8位数据,应答,停止位。

当数据为一串字节传送时,格式为:

  • 开始位,8位地址位(含1位读写位),应答,8位数据,应答,8位数据,应答,……,8位数据,应答,停止位。

模拟IIC从机代码(查询方式)

本次调试IIC设置为1对1单点透传模式,所以省略了对地址的处理,直接发送数据包。
先贴代码:

/*
 * IIC接收处理函数(扫描)
 */
uint8_t IICSdaOld, IICSclOld;
void i2cSlaveHandler(void)
{
    uint8_t temp_scl = IIC_SCL;
    uint8_t temp_sda = IIC_SDA;
    if (temp_scl == 1)
    {
        if (IICSclOld == 0)
        { //SCL上升沿
            if (IICStat < 0x08)
            {
                IICTemp <<= 1;
                IICTemp |= temp_sda;
                //SCL由0变位为1
                IICStat++;
            }
            else if (IICStat == 0x08)
            {
                spSendDataChar(IICTemp);    //通过串口打印字符串
                IICStat = 0x00;
            }
        }
        if (temp_sda != IICSdaOld) //SDA变位检测
        {
            if (temp_sda == 0) //如果SDA跳变为下降沿为起始位
            {
                IICStat = 0x00;
            }
            else //如果SDA跳变为上升沿则为停止位
            {
                IICStat = 0xFF;
            }
        }
    }
    IICSdaOld = temp_sda;
    IICSclOld = temp_scl;
}

Debian安装Apache2

sudo apt-get install apache2 apache2-utils

配置apache端口为8080

vim /etc/apache2/ports

修改内容如下

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 8080

<IfModule ssl_module>
        Listen 8088
</IfModule>

<IfModule mod_gnutls.c>
        Listen 8088
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet///////

打开apache2的文件访问功能

vim /etc/apache2/apache2.conf

修改内容如下

<Directory />
        Options FollowSymLinks
        AllowOverride None
#       Require all denied
        Order deny,allow
        allow from all
</Directory>

配置apache2自启动

chkconfig apache2 2
/etc/init.d/apache2 start

最新文章

最近回复

  • muumlover: 你好
  • 测试人: 你好呀
  • ww: 看了这么多就这个有用,牛逼
  • 未知狐: 啊确实,话说,博主博客好像没有评论回复邮件提醒,可以试试Comm...
  • Skogen: 系统的差异,不同的Linux发行版集成的包也不一样,安装难度也就...
  • Skogen: 系统是 Debian9,理论上Debian系的系统应该通用的。
  • 2247: 请问用的是什么系统?
  • 未知狐: 受教了,我比博主运气好点,是因为不理解命令参数等设定而频繁失败,...
  • Skogen: 23
  • Skogen: asd

分类

标签

归档

其它