精华内容
下载资源
问答
  • 一开始我以为都叫同步、异步是一个意思,有时候还...而线程的同步和异步,举个简单的例子同步是你要等着面包烤熟了再去切菜,线程异步是你可以把面包放着烤箱里考着,然后就去切菜,烤好了再拿出来,两不耽误。 ...

    一开始我以为都叫同步、异步是一个意思,有时候还蒙蒙的,直到今天看了linux高性能服务器这本书才恍然大悟他们的区别
    I/O同步/异步和线程并发的同步/异步是有区别的,I/O同步相当于内核告诉应用程序已经到了就绪状态(数据从内核读到用户的缓冲区或者用户的缓冲区读到内核中去),I/O异步相当于内核告诉应用程序已经到了完成状态(用户和内核交换全由内核来接手).而线程的同步和异步,举个简单的例子,同步是你要等着面包烤熟了再去切菜,线程异步是你可以把面包放着烤箱里考着,然后就去切菜,烤好了再拿出来,两不耽误。

    展开全文
  • 现在,给大家分享一篇关于同步请求和异步请求小知识。 举个例子:普通B/S模式(同步)AJAX技术(异步) 同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 请求...

    Http中的同步请求和异步请求

        最近在上springmvc的JSON数据交换的时候,老师下课提了一个课后问题:什么是异步请求?什么是同步请求?我想大部分同学听到这个问题的时候应该和我一样不知所云。现在,给大家分享一篇关于同步请求和异步请求的小知识。

      

    举个例子:普通B/S模式(同步)AJAX技术(异步)


    同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事

    异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕


    同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。

    异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。

    所以,要我请你吃饭就用同步的方法,要请我吃饭就用异步的方法,这样你可以省钱。

    请求方式,分为GET与POST:

    GET

    最为常见的HTTP请求,普通上网浏览页面就是GET。GET方式的参数请求直接跟在URL后,以问号开始。(JS中用 window.location.search获得)。参数可以用encodeURIComponent进行编码,使用方式:


    var EnParam = encodeURIComponent(param);

    URL只支持大约2K的长度,即2048字符数;使用GET进行AJAX请求时候会缓存导致出现的页面不是正确的,一般方法加random参数值;ajax.send(null)。

    POST

    向服务器提交数据用到。

    需要将form表单中的值先取出转换成字符串,用&符号连接,(同GET传参数一样);提交数据量2GB;使用ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded'),处理提交的字符串;ajax.send(strings),这个strings表示form中需要提交的内容,例如a=1&b=2类似这样的字符串。



    同步与异步:

    举个例子:普通B/S模式(同步)AJAX技术(异步)
    同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事
    异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕

    ajax.open方法中,第3个参数是设同步或者异步。prototype等js类库一般都默认为异步,即设为true。先说下同步的情况下,js会等待请求返回,获取status。不需要onreadystatechange事件处理函数。而异步则需要onreadystatechange事件处理,且值为4再正确处理下面的内容。

    //同步传输模式

    function RequestByGet(nProducttemp,nCountrytemp)
    {
        var xmlhttp

        if (window.XMLHttpRequest)
        {
             //isIE   =   false;
             xmlhttp   =   new   XMLHttpRequest();
        }
        else if (window.ActiveXObject)
        {
             //isIE   =   true;
             xmlhttp   =   new   ActiveXObject("Microsoft.XMLHTTP");
        }
                   
        //Web page location.
        var URL="http://www.baidu.com/;
        xmlhttp.open("GET",URL, false);
        //xmlhttp.SetRequestHeader("Content-Type","text/html; charset=Shift_JIS")
        xmlhttp.send(null);
        var result = xmlhttp.status;
     
        //OK
        if(result==200)
        {
            document.getElementById("div_RightBarBody").innerHTML=xmlhttp.responseText;
        }
        xmlhttp = null;
    }


    //异步传输模式
    var xmlhttp

    function RequestByGet(nProducttemp,nCountrytemp)
    {
        if (window.XMLHttpRequest)
        {
             //isIE   =   false;
             xmlhttp   =   new   XMLHttpRequest();
        }
        else if (window.ActiveXObject)
        {
             //isIE   =   true;
             xmlhttp   =   new   ActiveXObject("Microsoft.XMLHTTP");
        }
                   
        //Web page location.
        var URL="http://www.baidu.com/";
        xmlhttp.open("GET",URL, true);
        xmlhttp.onreadystatechange = handleResponse;
        //xmlhttp.SetRequestHeader("Content-Type","text/html; charset=UTF-8")
        xmlhttp.send(null);
    }

    function handleResponse()
    {
        if(xmlhttp.readyState == 4 && xmlhttp.status==200)
        {
            document.getElementById("div_RightBarBody").innerHTML=xmlhttp.responseText;
            xmlhttp = null;
        }
    }
    同步执行模式:
    所谓同步执行模式,是指语句在同步执行模式下,将始终保持对程序流的控制,直至 程序结束。如查询操作,客户机上的应用程序在向服务器发出查询操作的指令后,将 一直等待服务器将查询结果返回客户机端,然后才继续进行下一步操作。
    众所周知,应用程序要从一个大表中删除所有的记录将是非常耗时的,如果应用程序采用的是单线程(thread)同步执行方式,某次删除工作很可能耽误其他重要工作的完成。如果应用程序等待的是远程任务,那么远程服务器失败或网络故障或一些无法预 知的情况都可能使应用程序无限期地等下去,这是同步执行最大的缺陷。
    但是同步执行模式可以简化程序编制的复杂性。程序员可以不用过多地了解比较复杂 的ODBC 2.0 API 的使用,而只需使用 ODBC 的同步执行模式或使用数据控制项和数据库对象变量来编写应用程序,可以提高开发效率,但程序运行速度比不上异步执行 模式的速度。

    异步执行模式:
    所谓异步执行模式,是指语句在异步执行模式下,各语句执行结 束的顺序与语句执行开始的顺序并不一定相同。例如查询操作,客户机上的应用程序在向服务器发出了查 询操作的指令后,将立刻执行查询语句指令的下一条语句,而不需要等到服务器将查询结果返回客户机端。 异步执行方式使应用程序能摆 脱单个任务的牵制,提高了灵活性和应用程序的执行效率。但异步执行模式也存在一些问题,如它增加了 编程的复杂性,特别是编写互用性(interoperable)要求较高 的程序。
    在负荷很重的客户/服务器系 统中,适宜采用异步执行模式。在这种环境下,时间 延迟频繁且漫长,相比之下异步执行的开销微不足道。但是,如果应用运行的环境比较复杂,则必须建 立一套完整的机制,周期性地检查函数执行的状态,以决定下一步执行方案。进行周期的检查可以有多种方法,如在 应用中设置计时器并处理WM_TIMER信息等。
    虽然使用异步执行模式在编程 序时十分复杂,但可以实现多任务并行执行,使执行的效率大大提高。
    选择并设置执行模式 在应用程序开发中选择同步模式还是异步模式,是一个比较复杂的层次。当查询或对数据库的修改相对简单时,同步执行模式是一种 很好的选择,它能够在几秒 或更少的时间内返回结果数据。另外,在应用程序获得结果集前不能继续执行时,根本不必要使用异步执 行模式。在复杂查询情况下,特别是复杂的多行数据 库的UPDATE 或DELETE操作,可能需要很长的时间才能完成, 需采用异步执行模式,让用户可以同时对程序的其他 部分进行操作。
    对于一般程序员来说,如果他对同步执行模式与异步执行模式不了解, 他往往会在对服务器发出一个操作语句(查询或读取一条记录等操作)后,立该引用服务器返回的执行结果,或者对该 结果进行下一步操作,这是很危险的。因为,在异步执行模式下,客户机上的后续语句是在该操作语句发 出后接着执行的,但由于各种原因,服务器不一定能 执行完该操作语句,并在后续语句执行前将结果返回客户机。因此,后续语句在引用前一操作语句的执行 结果时,往往会因为该执行结果并不存在而引用了错 误的值,造成系统错误或死锁,所以在实际应用中应根据具体情况慎重选择执行模式。    

     

    转自:https://blog.csdn.net/morethinkmoretry/article/details/5791258

    展开全文
  • 文章目录AJAX什么是AJAX如何使用AJAX结合例子说明创建AJAX对象初始化 设置请求方法和url设置请求头(可无)发送请求为创建AJAX绑定事件(处理响应)处理响应(获取响应信息)AJAX中的同步和异步同步异步 AJAX AJAX概述...

    AJAX

    AJAX的概述
    AJAX = Asynchronous JavaScript and XML (异步的JavaScript和XML)。
    A]AX不是新的编程语言,而是一种使用现有标准的新方法。
    AJAX是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下。

    什么是AJAX

    AJAX =异步JavaScript和XML。
    AJAX是一种用于创建快速动态网页的技术。
    通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页
    的某部分进行更新。
    传统的网页(不使用AJAX)如果需要更新内容,必需重载整个网页面。

    如何使用AJAX

    有四个最基本的步骤

    1. 创建AJAX对象
    2. 初始化 设置请求方法和url
    3. 发送请求
    4. 为创建的AJAX绑定事件(处理响应)

    结合例子说明

    1. 创建一个html文件,为其写一个按钮在这里插入图片描述
    2. 为按钮绑定事件
      在这里插入图片描述

    创建AJAX对象

    XMLHttpRequest()
    在这里插入图片描述

    初始化 设置请求方法和url

    在这里插入图片描述
    这里用到AJAX对象的open()方法,他有三个参数
    在这里插入图片描述
    第一个参数设置请求的类型,第二个参数设置向哪里发送请求,第三个参数设置AJAX是否是异步(详见AJAX中的同步和异步目录),一般我们都设置为true

    如果是GET请求,则可以直接在路径后面传递参数,用?隔开url和参数,用&隔开参数列表
    如果是POST请求,则这里不能传递参数,在发送请求中传递(后面详细讲)


    设置请求头(可无)

    在这里插入图片描述
    在初始化和发送请求中间可以设置请求头,在AJAX中设置请求头也只能在这中间设置
    可以用AJAX对象的setRequestHeader("","")方法,他有两个参数,第一个传入请求头的名字,第二个传入请求头的值


    发送请求

    在这里插入图片描述
    直接用AJAX对象的send()方法就行

    对于POST请求,可以在其中传递一个字符串,此字符串会发送到服务器
    在这里插入图片描述
    他的作用就像是GET请求中open()中url地址后面跟的参数

    可在双引号中传入任意类型,任意内容的参数,只要服务器有对应的处理方法就没问题
    在这里插入图片描述

    为创建的AJAX绑定事件(处理响应)

    为什么处理响应叫为创建的AJAX绑定事件?
    因为我们处理响应的前提必须是服务器有响应,且响应正常
    这里用到AJAX对象的三个属性

    1. onreadystatechange
      在这里插入图片描述
      on 同when当…时候
      readystate是AJAX对象的一个属性,表示状态,他有五个值0、1、2、3、4
      0:表示初始状态 1:表示open方法调用完毕 2:表示send方法调用完毕 3:表示服务端返回了部分的结果 4:表示服务端返回了所有的结果
      change改变
      所以onreadystatechange表示AJAX对象状态发生改变时触发
    2. readyState
      在这里插入图片描述
      是AJAX对象的一个属性,表示状态,他有五个值0、1、2、3、4
      0:表示初始状态 1:表示open方法调用完毕 2:表示send方法调用完毕 3:表示服务端返回了部分的结果 4:表示服务端返回了所有的结果
      一般用于判断当前AJAX的对象是否处于服务端返回了所有结果的状态
    3. status
      在这里插入图片描述
      表示AJAX的响应码,响应码大于等于200小于300就算正常

    我们应该经过这三者之后,在进行处理响应


    处理响应(获取响应信息)

    可以有多重处理方式,这里示例一种
    在这里插入图片描述
    红线中的是处理响应部分



    获取响应信息需要用到AJAX属性的两个方法其中之一

    1. responseText
      获得字符串形式的响应数据。
    2. responseXML
      获得 XML 形式的响应数据。

    我们一般都是用第一个,这个和JSON契合
    直接AJAX对象.responseText就可获得服务器的响应数据



    这里"服务器"的get部分代码在这里插入图片描述
    就只创建一个对象,然后转换为JSON,然后通过responsewriter对象的getWriter()方法把JSON字符串发送给"客户端"

    "客户端"部分
    在这里插入图片描述


    效果:
    在这里插入图片描述
    点击一次,会多一行的数据


    响应的数据
    在这里插入图片描述

    AJAX中的同步和异步

    在这里插入图片描述
    在这里,第三个参数这里设置AJAX是否是异步的,true则表示AJAX是异步的,false则表示AJAX是同步的

    同步

    即,在我们用JavaScript通过AJAX向服务器发送请求的时候,JavaScript 会等到服务器响应就绪才继续执行。如果服务器繁忙或缓慢,没有及时的响应消息,则JavaScript会一直等待,不会执行AJAX的onreadystatechange部分后面的代码,应用程序会挂起或停止。
    可用于某些操作没有完成,则用户不能进行下一步操作的地方(使用不当会及其影响用户体验)

    异步

    和同步不同的就是,在JavaScript通过AJAX向服务器发送请求的时候,JavaScript会同时执行AJAX的onreadystatechange部分后面的代码

    通过 AJAX,JavaScript 无需等待服务器的响应,而是:
    在等待服务器响应时执行其他脚本
    当响应就绪后对响应进行处理

    参考文档—W3school

    展开全文
  • STM32与串口(Usart)通俗介绍与使用(例子:串口控制小灯) 一、说明 写本文目的是从 对串口...其中串口又分为:USART(同步异步收发器)——全双工数据交换 UART(异步收发器)——只有异步传输功能,本文只介绍

    STM32与串口(Usart)的通俗介绍与使用(例子:串口控制小灯)

    一、说明

    写本文目的是从 对串口知识了解不清或刚接触的朋友 的角度出发,帮助此类朋友了解掌握串口的配置与使用。
    前面介绍三组串口的具体配置,文章最后举一个例子:串口控制小灯。

    二、串口的简单介绍

    什么是串口?
    简单来说就是实现printf(""),getchar()等函数,即实现字符或字符串的接收发送,从而实现通讯。
    其中串口又分为:USART(同步异步收发器)——全双工数据交换 和 UART(异步收发器)——只有异步传输功能,本文只介绍三个USART的配置与使用。

    三、串口中断功能的流程图(从右到左看)

    此图用于帮助理解中断执行流程

    四、有关管脚的电路原理图介绍

    有关管脚的电路原理图
    如上图所示:该板子具有三组串口接口(TX为发送引脚,RX为接收引脚),分别对应:
    RX1/TX1 ——> PA10/PA9 ——> USART1
    RX2/TX2 ——> PA3/PA2 ——> USART2
    RX3/TX3 ——> PB11/PB10 ——> USART3

    引脚 USART1 USART2 USART3
    TX PA9 PA2 PB10
    RX PA10 PA3 PB11
    时钟线 APB2 APB1 APB1
    中断函数名 USART1_IRQHandler(void) USART2_IRQHandler(void) USART3_IRQHandler(void)

    五、代码配置

    1.USART1
    (1)发送、接收管脚配置和串口配置

    void USART1_Config(void)  
    {  
      	GPIO_InitTypeDef x;
    	USART_InitTypeDef y;
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);		//开启管脚PA9,PA10对应的时钟
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);		//开启串口USART1的时钟,注意:**APB2**
    	
    	x.GPIO_Pin=GPIO_Pin_9;
    	x.GPIO_Mode=GPIO_Mode_AF_PP;
    	x.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&x);				//配置发送引脚——选择管脚9,模式为复用推挽输出(因为是发送引脚),频率为50MHz,初始化到GPIOA
    	
    	x.GPIO_Pin=GPIO_Pin_10;
    	x.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    	GPIO_Init(GPIOA,&x);				//配置接收引脚——选择管脚10,模式为浮空输入(因为是接收引脚),输入模式不用配置频率,初始化到GPIOA
    	
    	y.USART_BaudRate=9600;											//配置波特率9600/115200等,具体看你的硬件配置要求
    	y.USART_WordLength=USART_WordLength_8b;							//配置数据位8位
    	y.USART_StopBits=USART_StopBits_1;								//配置停止位为1
    	y.USART_Parity=USART_Parity_No;									//奇偶校验位为无校验
    	y.USART_HardwareFlowControl=USART_HardwareFlowControl_None;		//配置硬件控制流选择为无
    	y.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;						//配置串口模式为接收和发送
    	USART_Init(USART1,&y);				//初始化到USART1
    	
    	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);		//开启窗口接收中断(即当发生接收数据或发送数据时将触发对应的中断处理函数)
    	USART_Cmd(USART1,ENABLE);			//使能USART1,也就是打开USART1功能
    	
    	NVIC_Configuration();    			//中断优先级配置
    } 
    

    (2)配置中断优先级

    优先级分组 主优先级 子优先级
    NVIC_ PriorityGroup0(0位用于抢占优先级 4位用于子优先级) 0 0~15
    NVIC_ PriorityGroup1(1位用于抢占优先级 3位用于子优先级) 0~1 0~7
    NVIC_ PriorityGroup2(2位用于抢占优先级 2位用于子优先级) 0~3 0~3
    NVIC_ PriorityGroup3(3位用于抢占优先级 1位用于子优先级) 0~7 0~1
    NVIC_ PriorityGroup4(4位用于抢占优先级 0位用于子优先级) 0~15 0
    void NVIC_Configuration()
    {
    	NVIC_InitTypeDef NVIC_InitStruct;	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);				//配置分组为组2
    	NVIC_InitStruct.NVIC_IRQChannel = USART1_IRQn;				//配置中断源为USART1
    	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;		//配置主优先级
    	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;				//配置子优先级
    	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;				//中断使能
    	NVIC_Init(&NVIC_InitStruct);		//初始化NVIC
    }
    

    (3)中断处理函数

    void USART1_IRQHandler(void)  
    {  
      	u8 res;  
    	if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  		//若当前USART1的状态为接收
    	{ 
    		res= USART_ReceiveData(USART1);   		//读取此时接收的数据
    		USART_SendData(USART1,res);				//将数据重新发回去,用于告诉它接收成功
    	}
    }
    

    (4)重定向收发函数(在 keil 的 C 标准函数中类似 printf 等函数并没有实现其底层,程序开发者需要重定向其中的 fgets 与 fputs 函数后可使用 printf、scanf、gets、puts 等标准函数,记得加#include "stdio.h"哦)

    #include "stdio.h"
    int fputc(int ch,FILE *f)
    {
    	USART_SendData(USART1,(uint8_t)ch);		//发送一个字符
    	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);	//直到发送完毕
    	return (ch);	
    }
    int fgetc(FILE *f)
    {
    	while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);	//直到接收完毕
    	return (int)USART_ReceiveData(USART1);
    }
    

    (5)最后主函数

    int main(void)  
    {  
    	USART1_Config();
      	while(1);
    } 
    

    这样一个完整的串口配置使用就实现了哦!!!
    接下来同样的步骤,来用其他两组串口也实现该功能吧

    2.USART2
    (1)发送、接收管脚配置和串口配置

    void USART2_Config(void)  
    {  
      	GPIO_InitTypeDef x;
    	USART_InitTypeDef y;
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);		//注意**APB1**,**USART2**
    	
    	x.GPIO_Pin=GPIO_Pin_2;
    	x.GPIO_Mode=GPIO_Mode_AF_PP;
    	x.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(GPIOA,&x);
    	
    	x.GPIO_Pin=GPIO_Pin_3;
    	x.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    	GPIO_Init(GPIOA,&x);
    	
    	y.USART_BaudRate=9600;
    	y.USART_WordLength=USART_WordLength_8b;
    	y.USART_StopBits=USART_StopBits_1;
    	y.USART_Parity=USART_Parity_No;
    	y.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    	y.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    	USART_Init(USART2,&y);
    	
    	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
    	USART_Cmd(USART2,ENABLE);
    	
    	NVIC_Configuration();    
    } 
    

    (2)配置中断优先级

    void NVIC_Configuration()
    {
    	NVIC_InitTypeDef NVIC_InitStruct;	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
    	NVIC_InitStruct.NVIC_IRQChannel = USART2_IRQn;		//注意:**USART2_IRQn**
    	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
    	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    	NVIC_Init(&NVIC_InitStruct);
    }
    

    (3)中断处理函数

    void USART2_IRQHandler(void)  		//注意:**USART2_IRQHandler**
    {  
      	u8 res;  
    	if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)  
    	{ 
    		res= USART_ReceiveData(USART2);   
    		USART_SendData(USART2,res);	
      }  
    }
    

    (4)重定向收发函数(记得加#include "stdio.h"哦)

    #include "stdio.h"
    int fputc(int ch,FILE *f)
    {
    	USART_SendData(USART2,(uint8_t)ch);
    	while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
    	return (ch);
    }
    int fgetc(FILE *f)
    {
    	while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==RESET);
    	return (int)USART_ReceiveData(USART2);
    }
    

    (5)最后主函数

    int main(void)  
    {  
    	USART2_Config();
      	while(1);
    } 
    

    2.USART3
    (1)发送、接收管脚配置和串口配置

    void USART3_Config(void)  
    {  
      GPIO_InitTypeDef x;
    	USART_InitTypeDef y;
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);		//注意:**GPIOB**
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);		//注意:**APB1**,**USART3**
    	
    	x.GPIO_Pin=GPIO_Pin_10;
    	x.GPIO_Mode=GPIO_Mode_AF_PP;
    	x.GPIO_Speed=GPIO_Speed_50MHz;
    	GPIO_Init(GPIOB,&x);			//注意:**GPIOB**
    	
    	x.GPIO_Pin=GPIO_Pin_11;
    	x.GPIO_Mode=GPIO_Mode_IN_FLOATING;
    	GPIO_Init(GPIOB,&x);			//注意:**GPIOB**
    	
    	y.USART_BaudRate=9600;
    	y.USART_WordLength=USART_WordLength_8b;
    	y.USART_StopBits=USART_StopBits_1;
    	y.USART_Parity=USART_Parity_No;
    	y.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    	y.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
    	USART_Init(USART3,&y);
    	
    	USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
    	USART_Cmd(USART3,ENABLE);
    	
    	NVIC_Configuration();    
    } 
    

    (2)配置中断优先级

    void NVIC_Configuration()
    {
    	NVIC_InitTypeDef NVIC_InitStruct;	
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	
    	NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn;		//注意:**USART3_IRQn**
    	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
    	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    }
    

    (3)中断处理函数

    void USART3_IRQHandler(void)  		//注意:**USART3_IRQHandler**
    {  
     	u8 res;  
    	if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)  
    	{ 
    		res= USART_ReceiveData(USART3);   
    		USART_SendData(USART3,res);	
      }  
    }
    

    (4)重定向收发函数(记得加#include "stdio.h"哦)

    #include "stdio.h"
    int fputc(int ch,FILE *f)
    {
    	USART_SendData(USART3,(uint8_t)ch);
    	while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
    	return (ch);
    }
    int fgetc(FILE *f)
    {
    	while(USART_GetFlagStatus(USART3,USART_FLAG_RXNE)==RESET);
    	return (int)USART_ReceiveData(USART3);
    }
    

    (5)最后主函数

    int main(void)  
    {  
    	USART3_Config();
      	while(1);
    } 
    

    六、最后来个串口控制小灯例子

    (1)配置串口(上面三组随便选一组,这里以组1-PA9,PA10为例)
    (2)初始化小灯(我的STM32控制LED灯的管脚为PC13)
    LED

    void LED_GPIO_Config(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);    
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC, &GPIO_InitStruct);
    }
    

    (3)小灯控制函数

    void LED_G(uint8_t n)                    //LED_G(0): 灯亮            LED_G(1):灯灭
    {
        if(n)
                    GPIO_SetBits(GPIOC, GPIO_Pin_13);
        else
                    GPIO_ResetBits(GPIOC, GPIO_Pin_13);
    }
    

    (4)修改主函数

    #include "stm32f10x.h"
    
    int main(void)  
    {  
        USART_Config();
        LED_GPIO_Config(); 
        while(1);
    } 
    

    (5)修改串口中断函数

    void USART1_IRQHandler(void)    //如果串口发送‘0’则灯亮,(若其他数据)否则灯灭
    {  
        u8 res;  
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  
        { 
            res= USART_ReceiveData(USART1);   
            USART_SendData(USART1,res);
            if(res=='0')
            {
                LED_G(0);
            }
            else
            {
                LED_G(1);
            }        
      }  
    }
    

    七、完整工程资源共享

    链接:https://pan.baidu.com/s/1UvxMlFSzKVpQfpDA3zxnBA
    提取码:o8c7

    展开全文
  • 一本正经介绍 AJAX:Asynchronous JavaScript and XML (异步 JavaScript XML) Ajax 不是某种编程语言,是一种在无需重新加载整个网页...运用XMLHttpRequestweb服务器进行数据的异步交换; 运用JavaS...
  •  本章详细地介绍了IRP的同步处理方法和异步处理方法。另外,本章还介绍了StartIO例程、中断服务例程、DPC服务例程。  9.1 应用程序对设备的同步异步操作  9.1.1 同步操作与异步操作原理  9.1.2 同步操作设备 ...
  • 包括网络领域最新发展,如交换和桥接技术、VLAN、快速以太网、DHCP、ATM以及IPv6等。作者以专家洞察力分析了网络运作过程和工作机理,并深入到技术背后概念和原理,帮助读者获得对可用解决方案更深理解...
  • 问题2-6:同步(synchronous)和异步(asynchronous)区别是什么? 问题2-7:同步通信和异步通信区别是什么? 问题2-8:比特同步和帧同步的区别是什么? 问题2-9:教材表2-4OC和STS有什么区别?例如OC-3和STS-3...
  • 2.简述同步控制方式和异步控制方式定义、特点、优缺点和应用场合,并说明两者最核心区别是什么? 3.什么是主设备,什么是从设备? 4.什么是总线周期? 5.控制器分类 6.主机和外设连接方式 7.直接程序...
  • IO模型-NIO多路复用

    2019-10-15 08:28:40
    信息交互,数据收发就是IO操作 , IO操作就是inputoutput ,例子: 系统read/write操作。 而操作系统有这么多数据交换 , 也就需要进行IO交互 , 用户进程与内核进行交互,然后内核再与硬件设备进行交互。 牵扯到...
  •  本章详细地介绍了IRP的同步处理方法和异步处理方法。另外,本章还介绍了StartIO例程、中断服务 例程、DPC服务例程。  9.1 应用程序对设备的同步异步操作  9.1.1 同步操作与异步操作原理  9.1.2 同步操作设备...
  • 同时,还针对流行的PCI驱动程序、USB驱动程序、虚拟串口驱动程序、摄像头驱动程序、SDIO驱动程序进行了详细的介绍,本书*的特色在于每一节的例子都是经过精挑细选的,具有很强的针对性。力求让读者通过亲自动手实验...
  • 14.4 回调的同步设置和异步调用 第15章 WCF事务支持 15.1 事务概要 15.2 WCF中事务 15.3 创建支持事务服务 第16章 WCF安全解决方案 16.1 认证和授权 16.1.1 认证 16.1.2 授权 16.2 安全传输 16.2.1 传输...
  • 问题2-6:同步(synchronous)和异步(asynchronous)区别是什么? 问题2-7:同步通信和异步通信区别是什么? 问题2-8:位同步(比特同步)和帧同步的区别是什么? 第3章 数据链路层 问题3-1:旧版《计算机网络》...
  • 24.2.1 一些有用的例子 24.2.2 全局展开 24.2.3 停止全局展开 24.3 EXCEPTION_CONTINUE_EXECUTION 24.4 EXCEPTION_CONTINUE_SEARCH0 24.5 GetExceptionCode2 24.6 GetExceptionInformation6 24.7 软件异常 第25章 未...
  • 14.4 回调的同步设置和异步调用 334 第15章 WCF事务支持 341 15.1 事务概要 341 15.2 WCF中事务 343 15.3 创建支持事务服务 345 第16章 WCF安全解决方案 353 16.1 认证和授权 353 16.1.1 认证 354 16.1.2 ...
  • 14.4 回调的同步设置和异步调用 334 第15章 WCF事务支持 341 15.1 事务概要 341 15.2 WCF中事务 343 15.3 创建支持事务服务 345 第16章 WCF安全解决方案 353 16.1 认证和授权 353 16.1.1 认证 354 16.1.2 ...
  • 书中选择MPI(Message Passing Interface)、POSIX线程OpenMP这三个应用最广泛编写可移植并行程序标准作为编程模型,并在不同例子中反映了并行计算不断变化应用组合。本书结构合理,可读性强,加之每章精心...
  • 3.8 并发和异步I/O 25 3.9 小结 25 深入研究 26 习题 26 第4章 协议程序接口 27 4.1 引言 27 4.2 不精确指明协议软件接口 27 4.2.1 优点与缺点 27 4.3 接口功能 28 4.4 概念性接口规约 28 4.5 系统...
  • 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC表单标签库 2.5.2. Spring MVC合理默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言支持 2.6.2. JMX 2.6 .3. 任务规划 2.6.4. 对Java 5...
  • 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC表单标签库 2.5.2. Spring MVC合理默认值 2.5.3. Portlet 框架 2.6. 其他特性 2.6.1. 动态语言支持 2.6.2. JMX 2.6.3. 任务规划 2.6.4. 对...
  • Spring中文帮助文档

    热门讨论 2013-08-05 14:40:17
    2.4.4. 异步的JMS 2.4.5. JDBC 2.5. Web层 2.5.1. Spring MVC合理默认值 2.5.2. Portlet 框架 2.5.3. 基于Annotation控制器 2.5.4. Spring MVC表单标签库 2.5.5. 对Tiles 2 支持 2.5.6. 对JSF 1.2支持...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

同步交换和异步交换的例子