精华内容
下载资源
问答
  • STM32F103ZET6串口通信中断显示数字,可以显示0~9,一块单片机发送代码,STM32F103ZET6接收并且根据信号显示相应的数字
  • 单片机可以把设定值和返回值通过232串口传输到上位机,上位机通过修改P I D 的参数也可以实时的传输给下位机。界面图如下:1、pid.m文件部分重要程序如下function pushbutton1_Callback(hObject, eventdata, handles...

    为了能够很好的调节PID,我现学了matlab gui界面的设计,及实时曲线的绘制,能够很方便的调节PID。单片机可以把设定值和返回值通过232串口传输到上位机,上位机通过修改P I D 的参数也可以实时的传输给下位机。界面图如下:

    dad15977a680d218ecae87f570035e7a.png

    1、pid.m文件部分重要程序如下

    function pushbutton1_Callback(hObject, eventdata, handles)

    global s;

    s=serial('COM3');

    set(s,'BaudRate',9600,'DataBit',8,'StopBits',1,'Parity','none','F lowControl','none');

    s.InputBufferSize=1020;

    s.OutputBufferSize=1024;

    s.ReadAsyncMode='continuous';

    s.BytesAvailableFcnMode='byte';

    s.Timeout=0.2;

    s.TimerPeriod=0.5;

    s.TimerFcn=@instrcallback;

    s.Terminator='CR';

    warning off;

    fopen(s);

    function pushbutton2_Callback(hObject, eventdata, handles)

    global s;

    fclose(s);

    展开全文
  • 串口通信中断应用

    2012-05-08 16:40:37
    有助于理解单片机串口中断,对于单片机初学者非常有用
  • STM32 串口 通信 中断

    千次阅读 2019-04-12 16:47:46
    int main(void) { NVIC_PriorityGroupConfig(NVIC_... //串口通信时的波特率设置(可以用串口助手来测试具体是多少) while(1) { ult_receive(); } } 1.串口配置的一般步骤: 串口时...

    一、数据发送与接收。
    (1)、STM32 的发送与接收是通过数据寄存器 USART_DR 来实现的,这是一个双寄存器,包含了 TDR 和 RDR。
    当向该寄存器写数据的时候,串口就会自动发送;
    当收到数据的时候,也是存在该寄存器内。
    1)STM32 库函数操作 USART_DR 寄存器发送数据的函数是:
    void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);通过该函数向串口寄存器 USART_DR 写入一个数据。
    2)STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是:
    uint16_t USART_ReceiveData(USART_TypeDef* USARTx);通过该函数可以读取串口接受到的数据。

    (2)、获取相应 串口状态,串口的状态可以通过状态寄存器 USART_SR 读取。
    1)在我们固件库函数里面,读取串口状态的函数是:
    FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
    这个函数的第二个入口参数非常关键,它是标示我们要查看串口的哪种状态,比如上面讲解的RXNE(读数据寄存器非空)以及 TC(发送完成)。
    例如:
    【1】我们要判断读寄存器是否非空(RXNE),操作库函数的方法是:
    USART_GetFlagStatus(USART1, USART_FLAG_RXNE);
    【2】我们要判断发送是否完成(TC),操作库函数的方法是:
    USART_GetFlagStatus(USART1, USART_FLAG_TC);
    等等,这些标识号在 MDK 里面是通过宏定义定义的。

    (3)、获取相应 中断状态 (注意区别(2)和(3))

    1)当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:
    ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
    比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断。
    【1】方法是:USART_GetITStatus(USART1, USART_IT_TC)
    返回值是 SET,说明是串口发送完成中断发生。

    2)这里要注意区分的是中断的不同种类:
    有:【1】串口中断 {void uart2_init(u32 bound)、void USART2_IRQHandler(void)};
    【2】外部中断 {void EXTIX_Init(void)、void EXT10_IRQHandler(void)}
    【3】 定时器中断

    (4)串口配置的一般步骤:

    1. 串口时钟 和 GPIO时钟 使能{RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
      到底什么时候用APB1,什么时候用APB2,到 stm32f10x.h 里找匹配 }

    2. GPIO端口模式的设置 {包括:GPIO_Pin、GPIO_Mode 、GPIO_Speed}

    3. 串口设置 {包括:1)串口复位(这一步不是必须的,省略了);
      2)串口参数初始化(主要注意:USART_BaudRate、 USART_Mode、 USART_ITConfig);
      3)串口使能}

    4. 开启中断,初始化NVIC{需要中断,才要这一步}

    5. 编写中断处理函数{即: void USART2_IRQHandler(void) };

    6. 编写串口数据收发函数{即:void ult_receive() }

    注意:对于复用功能的GPIO,要先使能GPIO时钟,同时设置GPIO模式为 复用功能对应的模式。

    二、程序编写

    int main(void)
     {	
    	 
       NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   
       uart2_init(115200);      //串口通信时的波特率设置(可以用串口助手来测试具体是多少)
    	 while(1)
    		{ 
    		      ult_receive();
    	  }
     }
    
    //对串口2进行初始化
    void uart2_init(u32 bound){	 
        GPIO_InitTypeDef GPIO_InitStructure;
    	USART_InitTypeDef USART_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    	
    	 //到底什么时候用APB1,什么时候用APB2,到 stm32f10x.h 里找匹配
    	 //GPIOx、ADCx、TIMx、USARTx 的时钟来源都不同
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);	
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	
        
    	    //USART2_TX   GPIOA.2
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	
        GPIO_Init(GPIOA, &GPIO_InitStructure);   
            //USART2_RX	  GPIOA.3
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA3
    	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
    
           //USART 参数初始化
    	USART_InitStructure.USART_BaudRate = bound;
    	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    	USART_InitStructure.USART_StopBits = USART_StopBits_1;
    	USART_InitStructure.USART_Parity = USART_Parity_No;
    	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    	USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;	
        USART_Init(USART2, &USART_InitStructure);      //初始化串口
        USART_Cmd(USART2, ENABLE);         //使能串口 
       
          //这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。  
          //USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);
          //USART_ITConfig(USART1,USART_IT_TC,ENABLE); //发送数据结束的时候(TC,发送完成)产生中断
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);  //开启接收中断,接收到数据中断
             
          //Usart2 NVIC设置
        NVIC_InitStructure.NVIC_IRQChannel =USART2_IRQn;  //正确选择 第几号串口
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;		
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		
    	NVIC_Init(&NVIC_InitStructure);  
    }
    
    //void USART2_IRQHandler(void)函数是串口 1 的中断响应函数,当串口 1 发生了相应的中断后,就会跳到该函数执行。
    //串口中断服务程序,这一段是 接收数据服务
    void USART2_IRQHandler(void){
    		if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){    //判断 接收中断				
    			Res2 =USART_ReceiveData(USART2);	
    			if(USART2_RX_STA==0){   //  USART2_RX_STA 是接收状态标记,0 代表未接收完成					
    					UART2_DATA[RxCounter++]=Res2 ;					
    					if(RxCounter > GET_REC_LEN){	
    							USART2_RX_STA  = 1;   //接收完成了
    							RxCounter = 0;
    					}
    			}
       	    }
    	
    } 
     
    
    //串口数据接收程序
    void  ult_receive()
    {	
    	 if(USART2_RX_STA==1) {   // 如果接收完成了,可以复位后,接着接收;也可以先把数据发送到其它串口, 再复位这个串口,接着接收。
    		RxCounter = 0;   		
    		USART2_RX_STA = 0;
    	 }
    	 if(UART2_DATA[16]==11 && UART2_DATA[17]==7) {			
    			i=0;
    			Counter = USART2_REC_LEN;
    			count_flag =1;
    			UART2_DATA[16] = 0;
    			UART2_DATA[17] = 0;	
    	 }
    }	
    
    

    补充:串口的发送
    这个地方那个之所以把这个写出来主要是想说发送中断和接受中断其实是共用一个中断函数的,到底是那个中断发生了呢,这就需要我们读取中断状态标志来识别了。

    //发送数据
    //使用函数USART_SendData(USART1, char data),一次只能发送一个字符。
    
    1)当然我们可以用如下函数发送字符串。
    void USART1_Puts(char * str){ 
         while(*str) { 
                USART_SendData(USART1, *str++);  //发送一个字符
                while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  //等待发送完毕
          } 
    }
    
    2)当然我们也可以循环发送字符串数组
    for(i = 0; TxBuf1 != '\0'; i++) {       // TxBuf1为定义好的字符串数组
           USART_SendData(USART2 , TxBuf1);
           while(USART_GetFlagStatus(USART2, USART_FLAG_TC)==RESET);  //等待发送完毕
    }
    
    int main(void){		
     	while(1){
    		if(USART_RX_STA&0x8000){					   
    			len=USART_RX_STA&0x3fff;
    			
                //循环发送字符串数组  要明确的是 发送字符数组的长度
                //发送的程序可以写在 main 函数里,也可以写在 中断服务函数 里 
    			for(t=0;t<len;t++){
    				USART_SendData(USART1, USART_RX_BUF[t]);
    				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
    			}
    			
    			USART_RX_STA=0;
    		}
    		else{
    			times++;
    			if(times%5000==0){
    				printf("\r\nÕ½½¢STM32¿ª·¢°å ´®¿ÚʵÑé\r\n");
    				printf("ÕýµãÔ­×Ó@ALIENTEK\r\n\r\n");
    			}
    			if(times%200==0) 
    			     printf("ÇëÊäÈëÊý¾Ý,ÒԻسµ¼ü½áÊø\n");  
    			if(times%30==0)
    			     LED0=!LED0;
    			delay_ms(10);   
    		}
    	}	 
     }
    
    
    展开全文
  • 51单片机学习板控制步进电机(串口通信中断方式发送指令控制电机往复间歇时间,衍生可用于手机触摸时长控制)
  • 单片机串口通信中断

    2017-02-25 20:29:58
     //打开串口中断  }  /*------------------------------------------------   主函数  ------------------------------------------------*/  void main (void)  {    InitUART...
    1. #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义                          
    2.   
    3. /*------------------------------------------------  
    4.                    函数声明  
    5. ------------------------------------------------*/  
    6. void SendStr(unsigned char *s);  
    7.   
    8. /*------------------------------------------------  
    9.                     串口初始化  
    10. ------------------------------------------------*/  
    11. void InitUART  (void)  
    12. {  
    13.   
    14.     SCON  = 0x50;               // SCON: 模式 1, 8-bit UART, 使能接收    
    15.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装  
    16.     TH1   = 0xF3;               // TH1:  重装值 2400 波特率 晶振 12MHz    
    17.     TR1   = 1;                  // TR1:  timer 1 打开                           
    18.     EA    = 1;                  //打开总中断  
    19.    // ES    = 1;                  //打开串口中断  
    20. }                              
    21. /*------------------------------------------------  
    22.                     主函数  
    23. ------------------------------------------------*/  
    24. void main (void)  
    25. {  
    26.   
    27. InitUART();  
    28.   
    29. SendStr("UART test,技术论坛:www.doflye.net 请在发送区输入任意信息");  
    30.   
    31. ES    = 1;                  //打开串口中断  
    32. while (1)                         
    33.     {  
    34.       
    35.     }  
    36. }  
    37.   
    38. /*------------------------------------------------  
    39.                     发送一个字节  
    40. ------------------------------------------------*/  
    41. void SendByte(unsigned char dat)  
    42. {  
    43.  SBUF = dat;  
    44.  while(!TI);  
    45.       TI = 0;  
    46. }  
    47. /*------------------------------------------------  
    48.                     发送一个字符串  
    49. ------------------------------------------------*/  
    50. void SendStr(unsigned char *s)  
    51. {  
    52.  while(*s!='\0')// \0 表示字符串结束标志,通过检测是否字符串末尾  
    53.   {  
    54.   SendByte(*s);  
    55.   s++;  
    56.   }  
    57. }  
    58. /*------------------------------------------------  
    59.                      串口中断程序  
    60. ------------------------------------------------*/  
    61. void UART_SER (void) interrupt 4 //串行中断服务程序  
    62. {  
    63.     unsigned char Temp;          //定义临时变量   
    64.      
    65.    if(RI)                        //判断是接收中断产生  
    66.      {  
    67.       RI=0;                      //标志位清零  
    68.       Temp=SBUF;                 //读入缓冲区的值  
    69.       P1=Temp;                   //把值输出到P1口,用于观察  
    70.       SBUF=Temp;                 //把接收到的值再发回电脑端  
    71.      }  
    72.    if(TI)                        //如果是发送标志位,清零  
    73.      TI=0;  
    74. }   

    展开全文
  • 三种方式:查询,中断,DMA 通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换。 USART利用分数波特率发生器提供宽范围的波特率选择。 它支持...
  • 通过中断方式接收数据,可以有效提高单片机的效率。本程序采用中断方式接收数据,并通过数码管显示出来,很简单,仅仅是对初学者知道中断的基本操作,带原理图
  • STM323 USART串口通信中断实现

    千次阅读 2017-03-07 20:59:30
    问题描述:利用stm32串口通信,当PC端发送字符8时,LED PB.0闪亮 第一步:配置系统时钟,这个不用多讲,代码就不贴出来了; 第二步:GPIO端口配置:  设置PA.9为复用推挽输出,PA.10为浮空输入,PB.0,PB.1,PB.2...
    问题描述:利用stm32串口通信,当PC端发送字符8时,LED PB.0闪亮
    第一步:配置系统时钟,这个不用多讲,代码就不贴出来了;
    第二步:GPIO端口配置:
                   设置PA.9为复用推挽输出,PA.10为浮空输入,PB.0,PB.1,PB.2输出并初始化PB.0亮
                
    void GPIO_Config()
    {
    	 GPIOA->CRH=0X04B0;
    	GPIOB->CRL=0X0333;
    	GPIOB->ODR=0X01;
    }

    第三步:USART寄存器配置:
                 
    void USART_Config()
    {
    	USART1->BRR = 0x1D4C;
    	USART1->CR1|=0X202C;
    }

    第一行,设置波特率9600      第二行,使能USART,接受中断打开,发送使能,接受使能;
    第四步:NVIC寄存器配置:
                
    void NVIC_Configuration()      
      {
    		u32 temp;
    		temp=SCB->AIRCR;
    		temp &=0x0000f8ff;
    		temp |=0x05fa0000;
    		temp |=0x0700;
    		SCB->AIRCR =temp;
    		NVIC->ISER[1] =1<<5;
    		NVIC->IP[1]=0;
    }

    前几行的代码没什么变化,通过向量表找到相应的USART1的序号,然后根据序号写上后两行就行,NVIC->ISER中断使能寄存器,NVIC->IP中断优先级控制寄存器,最后一行不要也行。
    接下来是led函数:直接上代码
                                
    void led()
    {
         GPIOB->ODR=0X01;
    	   Delay_ms(100);
    	GPIOB->ODR=0;
    	Delay_ms(100);
    }
    然后是main函数:一直让它while下去吧!
    int main()
    {
    	
       SysclkConfiguration();
    	 GPIO_Config();
    	 USART_Config();
    	NVIC_Configuration();
    	 while(1)
    	 {
             
    		 if(temp==1)
    			led();
           
    }
    }
    最后是中断服务函数:没啥要注意的,直接上代码(刚开始一直把函数名写错了,费了好大事)
     
    unsigned char data1;
    extern u8 temp;
    void USART1_IRQHandler(void)
    {
    	  data1=USART1->DR;
    	if(temp==0)
    	  temp=1;
    	else 
    		temp=0;
    }
    




    展开全文
  • public void CDL_Command_Send(string Send_Code) ...如上的代码,(我是100ms定时发送数据),一旦在串口通信过程中,突然拔掉串口线或者硬件通信中断,这时候程序就一直死在红色那行中,请问如何避免??
  • .NET串口通信中将`0X1A`当做EOF处理,.NET接收到EOF会触发一次接收中断,此时事件形参`SerialDataReceivedEventArgs`值为枚举 `Eof`,其他为`Chars`。 参考: stackoverflow、MSDN ## 测试 .NET编程,中断方式接收...
  • 51单片机 串口通信 中断

    千次阅读 2011-03-01 16:01:00
    / /T1定时器装初值(高八位) 控制串口通信的波特率(由定时器1的溢出率控制)  TL1=0xfd; //T1定时器装入初值(低八位)  TR1=1; //定时器1运行控制位 置一启动定时器1  REN=1; //允许串口接收 ...
  • 094-串口通信-中断.rar

    2020-03-08 10:00:59
    资源是51单片机串口通信的例程,串口采用中断方式接收数据,当接收到上位机发送来的数据后,根据数据对指示灯进行控制,并且通过串口返回数据。
  • 串口通信-中断法数据接收,单片机开发,好资料,介绍详细
  • 实验二 串口通信中断实验

    千次阅读 2019-10-09 19:01:39
    一.实验目的 (1)熟悉 MCU 的异步串行通信 Uart 的工作原理。...在光盘资料中 SD-KL-CD 提供读者串口通信实例 ch06-UART 文件夹中的 UART 程序主要实现开发板上的蓝灯闪烁、通过 MCU 串口发送字符串"chan...
  • 串口通信中断法与查询法,附详细代码及测试结果。
  • 中断方式串口通信

    2011-10-09 15:08:41
    采用中断方式对USART串口通信,适用EVK1100
  • 这样做,串口发送中断程序里必须判断是否发送完一串数据,如已发送完则不处理,未完继续发送。 现在置位TI,使单片机进入串口发送中断,而且未发送完,当然程序就会继续发送,其实是开始发送。 至于判断条件,主程序...
  • 4-STM32F1 串口通信-中断方式

    千次阅读 2018-01-22 15:44:42
    STM32F1 串口通信-中断方式 本实验是在上个实验《STM32F1 串口通信-查询方式》的基础上做的,所以这里只总结增加的中断的部分,串口IO和串口初始化和上个实验一样。 增加的步骤 1,在主函数中进行中断分组 2,在使...
  • 51单片机学习–定时器–中断串口通信 定时器–中断串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, 请求 CPU 迅速去处理...
  • 串口通信DMA中断

    2016-03-20 09:43:00
    设置DMA源:内存地址&串口数据寄存器地址 */ DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; /* 内存地址(要传输的变量的指针) */ DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff...
  • 51单片机默认使用定时器1作为串口通信的波特率发生器、定时器1中断通信,串口与定时器1冲突,在遇到定时器不够用的时候可以用定时器2
  • Stm32串口中断通信

    2018-05-18 15:15:35
    STm32串口中断通信实现,包括了stm32F1的库文件以及初始化代码等
  • 串口通信+外部中断

    千次阅读 2016-11-01 07:50:01
     昨天复习了串口通信和外部中断实验。对于串口通信实验,特别需要注意的是串口的数据寄存器USART_DR,这是一个双寄存器,包含TDR和RDR,当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时候,也是存在该...
  • ATMEGA128串口通信程序-中断方式
  • dsp28335 采用SCI FIFO+中断方式实dsp 与上位机实现串口通信 上位机向dsp发送一个字符或字符串,经过数据处理,上位机接收数据
  • ATmega128串口通信程序(中断方式)
  • 本文主要讲了关于51单片机串口通信需要加超时中断这个问题,下面来看一下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,835
精华内容 734
关键字:

串口通信中断