精华内容
下载资源
问答
  • 虚拟串口使用方法

    千次阅读 2020-06-14 19:53:27
    虚拟串口Virtual Serial Port Driver 使用及错误详解 文章目录虚拟串口Virtual Serial Port Driver 使用及错误详解使用目的微信公众号 在这里一定要注意一下,这个虚拟串口软件不要使用最新版本的9.0,会报错,一般...

    虚拟串口Virtual Serial Port Driver 使用及错误详解


    在这里一定要注意一下,这个虚拟串口软件不要使用最新版本的9.0,会报错,一般使用7.2或者6.9版本即可。

    9.0使用几天后,

    中文版本报错如下:

    无法配对端口。 有关详细信息,请参见日志。 要忽略错误并仍然创建捆绑包,请在选项中启用相应的设置。

    英文版本报错如下:

    Cannot pair ports. See log for details. To ignore errors and create bundles anyway, please, enable the corresponding setting in options.

    换个版本即可解决。

    使用目的

    我们使用虚拟串口到底是干什么?如果有经验就知道。如果手头有一个实际的单片机,那么使用一个类似U盘的USB转TTL的东西,便可以将单片机发送的串口内容在串口助手中显示出来,但是如果没有单片机,也没有USB转TTL,那么可以在Proteus中,仿真一个单片机,发出串口内容,同时在Proteus中为单片机连接COMPIM(虚拟串口),同时在电脑上安装Virtual Serial Port Driver这个软件,那么,在Proteus中,单片机发出的串口内容便可以在同一个电脑中的串口助手中接收。这就是我们要完成的功能。

    再概括一下就是,这个COMPIM模块能够将proteus中单片机的串口绑定到电脑上的一个串口,比如是com1,而这个虚拟串口就可以将com1和com2绑定,那么便可以利用上位机或者串口助手应用程序等从com2接收来自于com1中单片机的串口信息。

    实现步骤如下:

    (1)Proteus中单片机可以正常收发串口内容

    (2)Proteus中单片机的引脚连接COMPIM,TXD连接TXD

    (3)电脑中安装Virtual Serial Port Driver软件

    (4)电脑中拥有串口助手

    (5)Virtual Serial Port Driver软件中配对COM口,COMPIM设置相应COM口

    9.0安装步骤:

    双击安装vspdpro.exe

    打开文件安装位置,将vspdproCHS.EXE复制过去

    vspdpro-jie.exe可以不用复制过去

    以后使用,直接双击vspdCHS.EXE

    7.2安装步骤:

    点击vspd.exe安装

    打开文件所在位置,将vspdctl.dll覆盖复制到这个路径中

    每次卸载完毕后,直接delete all,不要一直占用串口。
    在这里插入图片描述

    微信公众号

    欢迎大家关注我的个人公众号,现阶段主要总结Robomaster相关的计算机视觉知识:Qt,C++,CMake,OpenCV等等
    公众号名称:三丰杂货铺

    段主要总结Robomaster相关的计算机视觉知识:Qt,C++,CMake,OpenCV等等
    公众号名称:三丰杂货铺

    在这里插入图片描述

    展开全文
  • Arduino MEGA2560软串口使用方法

    千次阅读 2019-01-13 23:55:07
    通常将Arduino上自带的串口称为硬串口,而使用SoftwareSerial类库模拟成的串口称为软串口。软串口是由程序模拟生成的,使用起来没有硬串口稳定,而且和硬串口一样,波特率越高越不稳定。  软串口通过AVR芯片的...

            通常将Arduino上自带的串口称为硬串口,而使用SoftwareSerial类库模拟成的串口称为软串口。软串口是由程序模拟生成的,使用起来没有硬串口稳定,而且和硬串口一样,波特率越高越不稳定。

            软串口通过AVR芯片的PCINT中断功能来实现,在Arduino UNO上,所有引脚都支持PCINT中断,因此所有引脚都可设置为RX接收端。但是在Arduino MEGA上能被设置为RX的引脚有10,11,12,13,50,51,52,53,62,63,64,65,66,67,68,69。在Arduino Leonardo上能被设置为RX的引脚有8,9,10,11,14(MISO),15(SCK),16(MOSI)。

            本文采用两块Arduino MEGA板子做实验,A板使用Serilal串口和电脑1通信,Serial1串口和B板通信;B板使用Serial和电脑2通信,软串口(10,11引脚分别为RX,TX)和A板通信。接线关系为:

    A板 B板

    18 TX1

    10
    19 RX1 11

    A板程序为:

    void setup()
    {
      Serial.begin(9600); 
      Serial1.begin(9600); 
    }
    String device_A_String = "";
    String device_B_String = "";
    void loop()
    {
      if (Serial.available() > 0) 
      {
        if(Serial.peek() != '\n')
        {
          device_A_String += (char)Serial.read();
        }
        else
        {
          Serial.read();
          Serial.print("you said:");
          Serial1.println(device_A_String);
          Serial.println(device_A_String);
          device_A_String = "";
        }
      }
      if (Serial1.available() > 0)
      {
        if(Serial1.peek() != '\n')
        {
          device_B_String += (char)Serial1.read();
        }
        else
        {
          Serial1.read();
          Serial.print("device B said:");
          Serial.println(device_B_String);
          device_B_String = "";
        }
      }
    }

    B板程序为:

    #include <SoftwareSerial.h>
    SoftwareSerial softSerial(10,11); //定义虚拟串口名为serial,rx为10号端口,tx为11号端口
    void setup()
    {
      softSerial.begin(9600); //初始化虚拟串口
      Serial.begin(9600); //初始化Arduino默认串口
      softSerial.listen();
      Serial.println(softSerial.isListening());
    }
    String device_A_String = "";
    String device_B_String = "";
    void loop()
    {
      if (Serial.available() > 0)
      {
        if(Serial.peek() != '\n')
        {
          device_B_String += (char)Serial.read();
        }
        else
        {
          Serial.read();
          Serial.print("you said:");
          Serial.println(device_B_String);
          softSerial.println(device_B_String);
          device_B_String = "";
        }
      }
      
      if (softSerial.available() > 0) 
      {
        if(softSerial.peek() != '\n')
        {
          device_A_String += (char)softSerial.read();
        }
        else
        {
          softSerial.read();
          Serial.print("device A said:");
          Serial.println(device_A_String);
          device_A_String = "";
        }
      }
    }

    展开全文
  • STM32F1的5个串口使用方法

    万次阅读 多人点赞 2018-03-08 11:06:11
    串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter),4,、5是通用异步串行接口UART(Universal ...
    串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter),4,、5是通用异步串行接口UART(Universal Asynchronous Receiver/Transmitter)。
    STM32学习笔记——5个串口的使用方法


    配置串口包括三部分内容
    1.  I/O口配置:TXD配置为复用推挽输出(GPIO_Mode_AF_PP),RXD配置为浮空输入(GPIO_Mode_IN_FLOATING);
    2.  串口配置:波特率等;
    3.  中断向量配置:一般用中断方式接收数据。


    注意事项
    1.  USART1是挂在APB2,使能时钟命令为:     
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );
    其他几个则挂在APB1上,如2口:
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );

    2.  配置4口和5口的时候,中断名为UART4、UART5,中断入口分别为
    UART4_IRQn、UART5_IRQn
    对应的中断服务函数为
    void UART4_IRQHandler(void)
    void UART5_IRQHandler(void)。

    下面是5个串口的配置函数收发数据函数代码
    #include "stm32f10x.h"
    #include "misc.h"
    #include "stm32f10x_gpio.h"
    #include "stm32f10x_usart.h" 

    void USART1_Configuration(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;        

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;
        
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;
    GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;

    USART_InitStructure.USART_BaudRate = 9600; //波特率;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;
    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(USART1, &USART_InitStructure);//配置串口参数;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //中断号;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART1, ENABLE); //使能串口;
    }

    void USART1_Send_Byte(u8 Data) //发送一个字节;
    {
    USART_SendData(USART1,Data);
    while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );
    }

    void USART1_Send_String(u8 *Data) //发送字符串;
    {
    while(*Data)
    USART1_Send_Byte(*Data++);
    }

    void USART1_IRQHandler(void) //中断处理函数;
    {
    u8 res;    
    if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //判断是否发生中断;
    {
    USART_ClearFlag(USART1, USART_IT_RXNE); //清除标志位;
    res=USART_ReceiveData(USART1); //接收数据;
    USART1_Send_Byte(res); //用户自定义;
    }  



    void USART2_Configuration(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;        

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2 TX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;
        
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2 RX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;
    GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;

    USART_InitStructure.USART_BaudRate = 9600; //波特率;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;
    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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);//配置串口参数;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //中断号;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART2, ENABLE); //使能串口;
    }

    void USART2_Send_Byte(u8 Data) //发送一个字节;
    {
    USART_SendData(USART2,Data);
    while( USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET );
    }

    void USART2_Send_String(u8 *Data) //发送字符串;
    {
    while(*Data)
    USART2_Send_Byte(*Data++);
    }

    void USART2_IRQHandler(void) //中断处理函数;
    {
    u8 res;    
    if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET) //判断是否发生中断;
    {
    USART_ClearFlag(USART2, USART_IT_RXNE); //清除标志位;
    res=USART_ReceiveData(USART2); //接收数据;
    USART2_Send_Byte(res); //用户自定义;
    }  



    void USART3_Configuration(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;        

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART3 TX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure); //端口B;
        
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //USART3 RX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;
    GPIO_Init(GPIOB, &GPIO_InitStructure); //端口B;

    USART_InitStructure.USART_BaudRate = 9600; //波特率;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;
    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(USART3, &USART_InitStructure);//配置串口参数;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //中断号;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    USART_Cmd(USART3, ENABLE); //使能串口;
    }

    void USART3_Send_Byte(u8 Data) //发送一个字节;
    {
    USART_SendData(USART3,Data);
    while( USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET );
    }

    void USART3_Send_String(u8 *Data) //发送字符串;
    {
    while(*Data)
    USART3_Send_Byte(*Data++);
    }

    void USART3_IRQHandler(void) //中断处理函数;
    {
    u8 res;    
    if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET) //判断是否发生中断;
    {
    USART_ClearFlag(USART3, USART_IT_RXNE); //清除标志位;
    res=USART_ReceiveData(USART3); //接收数据;
    USART3_Send_Byte(res); //用户自定义;
    }  



    void UART4_Configuration(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;        

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //UART4 TX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;
        
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //UART4 RX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;
    GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;

    USART_InitStructure.USART_BaudRate = 9600; //波特率;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;
    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(UART4, &USART_InitStructure);//配置串口参数;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; //中断号;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);
    USART_Cmd(UART4, ENABLE); //使能串口;
    }

    void UART4_Send_Byte(u8 Data) //发送一个字节;
    {
    USART_SendData(UART4,Data);
    while( USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET );
    }

    void UART4_Send_String(u8 *Data) //发送字符串;
    {
    while(*Data)
    UART4_Send_Byte(*Data++);
    }

    void UART4_IRQHandler(void) //中断处理函数;
    {
    u8 res;    
    if(USART_GetITStatus(UART4, USART_IT_RXNE) == SET) //判断是否发生中断;
    {
    USART_ClearFlag(UART4, USART_IT_RXNE); //清除标志位;
    res=USART_ReceiveData(UART4); //接收数据;
    UART4_Send_Byte(res); //用户自定义;
    }  

    void UART5_Configuration(void)
    {
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;        

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE );
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE );

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //UART5 TX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;
        
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //UART5 RX;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;
    GPIO_Init(GPIOD, &GPIO_InitStructure); //端口D;

    USART_InitStructure.USART_BaudRate = 9600; //波特率;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;
    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(UART5, &USART_InitStructure);//配置串口参数;

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

    NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn; //中断号;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);
    USART_Cmd(UART5, ENABLE); //使能串口;
    }

    void UART5_Send_Byte(u8 Data) //发送一个字节;
    {
    USART_SendData(UART5,Data);
    while( USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET );
    }

    void UART5_Send_String(u8 *Data) //发送字符串;
    {
    while(*Data)
    UART5_Send_Byte(*Data++);
    }

    void UART5_IRQHandler(void) //中断处理函数;
    {
    u8 res;    
    if(USART_GetITStatus(UART5, USART_IT_RXNE) == SET) //判断是否发生中断;
    {
    USART_ClearFlag(UART5, USART_IT_RXNE); //清除标志位;
    res=USART_ReceiveData(UART5); //接收数据;
    UART5_Send_Byte(res); //用户自定义;
    }  

    以上内容转载自:http://blog.sina.com.cn/s/blog_175ea65260102wy5b.html
    展开全文
  • STM32串口——5个串口使用方法

    万次阅读 多人点赞 2018-09-19 20:27:18
    串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter),4,、5是通用异步串行接口UART(Universal ...

    串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter),4,、5是通用异步串行接口UART(Universal Asynchronous Receiver/Transmitter)。

    STM32学习笔记——5个串口的使用方法
     

     

    配置串口包括三部分内容

    1.  I/O口配置:TXD配置为复用推挽输出(GPIO_Mode_AF_PP),RXD配置为浮空输入(GPIO_Mode_IN_FLOATING);

    2.  串口配置:波特率等;

    3.  中断向量配置:一般用中断方式接收数据。

     

     

    注意事项

    1.  USART1是挂在APB2,使能时钟命令为:     

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );

    其他几个则挂在APB1上,如2口:

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );

     

    2.  配置4口和5口的时候,中断名为UART4、UART5,中断入口分别为

    UART4_IRQn、UART5_IRQn

    对应的中断服务函数为

    void UART4_IRQHandler(void)

    void UART5_IRQHandler(void)。

     

    下面是5个串口的配置函数收发数据函数代码

    #include "stm32f10x.h"

    #include "misc.h"

    #include "stm32f10x_gpio.h"

    #include "stm32f10x_usart.h" 

     

    void USART1_Configuration(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;        

     

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE );

     

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //USART1 TX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;

        

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART1 RX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;

    GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;

     

    USART_InitStructure.USART_BaudRate = 9600; //波特率;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;

    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(USART1, &USART_InitStructure);//配置串口参数;

     

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

     

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //中断号;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

     

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

    USART_Cmd(USART1, ENABLE); //使能串口;

    }

     

    void USART1_Send_Byte(u8 Data) //发送一个字节;

    {

    USART_SendData(USART1,Data);

    while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );

    }

     

    void USART1_Send_String(u8 *Data) //发送字符串;

    {

    while(*Data)

    USART1_Send_Byte(*Data++);

    }

     

    void USART1_IRQHandler(void) //中断处理函数;

    {

    u8 res;    

    if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET) //判断是否发生中断;

    {

    USART_ClearFlag(USART1, USART_IT_RXNE); //清除标志位;

    res=USART_ReceiveData(USART1); //接收数据;

    USART1_Send_Byte(res); //用户自定义;

    }  

     

     

     

    void USART2_Configuration(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;        

     

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE );

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE );

     

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //USART2 TX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;

        

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //USART2 RX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;

    GPIO_Init(GPIOA, &GPIO_InitStructure); //端口A;

     

    USART_InitStructure.USART_BaudRate = 9600; //波特率;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;

    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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);//配置串口参数;

     

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

     

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //中断号;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

     

    USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

    USART_Cmd(USART2, ENABLE); //使能串口;

    }

     

    void USART2_Send_Byte(u8 Data) //发送一个字节;

    {

    USART_SendData(USART2,Data);

    while( USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET );

    }

     

    void USART2_Send_String(u8 *Data) //发送字符串;

    {

    while(*Data)

    USART2_Send_Byte(*Data++);

    }

     

    void USART2_IRQHandler(void) //中断处理函数;

    {

    u8 res;    

    if(USART_GetITStatus(USART2, USART_IT_RXNE) == SET) //判断是否发生中断;

    {

    USART_ClearFlag(USART2, USART_IT_RXNE); //清除标志位;

    res=USART_ReceiveData(USART2); //接收数据;

    USART2_Send_Byte(res); //用户自定义;

    }  

     

     

     

    void USART3_Configuration(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;        

     

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE );

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE );

     

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //USART3 TX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure); //端口B;

        

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //USART3 RX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;

    GPIO_Init(GPIOB, &GPIO_InitStructure); //端口B;

     

    USART_InitStructure.USART_BaudRate = 9600; //波特率;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;

    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(USART3, &USART_InitStructure);//配置串口参数;

     

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

     

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //中断号;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

     

    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);

    USART_Cmd(USART3, ENABLE); //使能串口;

    }

     

    void USART3_Send_Byte(u8 Data) //发送一个字节;

    {

    USART_SendData(USART3,Data);

    while( USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET );

    }

     

    void USART3_Send_String(u8 *Data) //发送字符串;

    {

    while(*Data)

    USART3_Send_Byte(*Data++);

    }

     

    void USART3_IRQHandler(void) //中断处理函数;

    {

    u8 res;    

    if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET) //判断是否发生中断;

    {

    USART_ClearFlag(USART3, USART_IT_RXNE); //清除标志位;

    res=USART_ReceiveData(USART3); //接收数据;

    USART3_Send_Byte(res); //用户自定义;

    }  

     

     

     

    void UART4_Configuration(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;        

     

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE );

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE );

     

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //UART4 TX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;

        

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //UART4 RX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;

    GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;

     

    USART_InitStructure.USART_BaudRate = 9600; //波特率;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;

    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(UART4, &USART_InitStructure);//配置串口参数;

     

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

     

    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; //中断号;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

     

    USART_ITConfig(UART4, USART_IT_RXNE, ENABLE);

    USART_Cmd(UART4, ENABLE); //使能串口;

    }

     

    void UART4_Send_Byte(u8 Data) //发送一个字节;

    {

    USART_SendData(UART4,Data);

    while( USART_GetFlagStatus(UART4, USART_FLAG_TC) == RESET );

    }

     

    void UART4_Send_String(u8 *Data) //发送字符串;

    {

    while(*Data)

    UART4_Send_Byte(*Data++);

    }

     

    void UART4_IRQHandler(void) //中断处理函数;

    {

    u8 res;    

    if(USART_GetITStatus(UART4, USART_IT_RXNE) == SET) //判断是否发生中断;

    {

    USART_ClearFlag(UART4, USART_IT_RXNE); //清除标志位;

    res=USART_ReceiveData(UART4); //接收数据;

    UART4_Send_Byte(res); //用户自定义;

    }  

     

     

     

    void UART5_Configuration(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;        

     

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE );

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE );

     

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //UART5 TX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOC, &GPIO_InitStructure); //端口C;

        

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //UART5 RX;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入;

    GPIO_Init(GPIOD, &GPIO_InitStructure); //端口D;

     

    USART_InitStructure.USART_BaudRate = 9600; //波特率;

    USART_InitStructure.USART_WordLength = USART_WordLength_8b; //数据位8位;

    USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位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(UART5, &USART_InitStructure);//配置串口参数;

     

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断组,4位抢占优先级,4位响应优先级;

     

    NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn; //中断号;

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

     

    USART_ITConfig(UART5, USART_IT_RXNE, ENABLE);

    USART_Cmd(UART5, ENABLE); //使能串口;

    }

     

    void UART5_Send_Byte(u8 Data) //发送一个字节;

    {

    USART_SendData(UART5,Data);

    while( USART_GetFlagStatus(UART5, USART_FLAG_TC) == RESET );

    }

     

    void UART5_Send_String(u8 *Data) //发送字符串;

    {

    while(*Data)

    UART5_Send_Byte(*Data++);

    }

     

    void UART5_IRQHandler(void) //中断处理函数;

    {

    u8 res;    

    if(USART_GetITStatus(UART5, USART_IT_RXNE) == SET) //判断是否发生中断;

    {

    USART_ClearFlag(UART5, USART_IT_RXNE); //清除标志位;

    res=USART_ReceiveData(UART5); //接收数据;

    UART5_Send_Byte(res); //用户自定义;

    }  

     

    祝大家学习愉快!

    展开全文
  • 串口SecureCRT使用方法

    2020-05-12 16:43:20
    **易出问题处:有时电脑和设备无法正常连接,此时可以使用驱动精灵更新安装下USB驱动即可! 操作步骤: 1.查看使用的是哪个端口进行的连接: 2.打开CRT,新建会话,如下图: 3.完成第二步后,成功创建会话...
  • 通过简单的串口指令即可完成播放指定的语音,以及如何播放语音等功能,无需繁琐的底层操作,使用方便,稳定可靠是此款产品的最大特点。无需任何烧录器,无需任何软件,USB 直接烧写FLASH。同时支持串口直接下载语音...
  • 串口转以太网使用方法

    千次阅读 2020-09-21 20:34:39
    串口转以太网
  • STM32F103 串口使用方法

    千次阅读 2020-05-12 16:09:36
    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式。 通讯结构 设备内部一般以TTL电平传输,设备之间是通过RS232/RS485电平标准传输。 ...
  • MyCommTool串口工具使用方法

    千次阅读 2016-03-17 10:50:18
    工具: 串口数据线、MyCommTool软件、手机主板、电脑。串口数据线一端是USB接口 ,一端是三根线,
  • 通用串口测试工具 使用方法

    万次阅读 2017-12-19 14:47:40
    通用串口测试、调试工具,封装了很多参数应用,丰富的控制方式,使用灵活
  • Arduino使用多个串口方法

    千次阅读 2020-02-27 15:45:16
    如果想要给Arduino UNO R3同时接上WiFi模块和蓝牙模块时,但是Arduino的串口只有一个,怎样才能让Arduino同时使用多个串口呢? 解决方案 其实Arduino官方提供了一个软串口的库SoftwareSerial,不需要额外的去库管理...
  • deepin使用串口工具的使用方法

    千次阅读 2016-04-02 00:29:25
    最近弄来了一根DT-5002A的usb转RS232的线,查询资料后发现其芯片为PL2303芯片。现需要使用deepin连接该通讯线。...最后查询了网上的方法,总结归纳以后可以使用。现梳理汇总如下: 1、命令行运行fin
  • deepin下使用串口方法

    千次阅读 2019-06-20 17:51:08
    deepin系统内置了大部分常用的串口驱动,如果不确定系统是否正确识别了,可以在控制台输入dmesg | grep tty,查看,如下图 也可以直接安装linux下的图形串口工具,在控制台输入 sudo apt-get install cutecom,软件...
  • 一、第一步,使用Cube生成代码1.首先打开cube选型,选择STM32F103ZETX。2.在Pinout窗口左边栏配置串口,选中Asynchronous模式。右侧窗口会自动显示串口占用的相关引脚为绿色。3.在clock configuration窗口内配置各...
  • 串口工具minicom的使用方法

    千次阅读 2017-10-15 22:28:53
    minicom是一个用在Linux操作系统中的串口通讯工具,本文将介绍其用法。安装minicom:下载源码包,解压,正常的安装流程即可: ./configure make make install配置串口:如果是在虚拟机中安装的Linux,则需要先...
  • 串口是我们常用的一个数据传输接口,STM32F103系列单片机共有5个串口,其中1-3是通用同步/异步串行接口USART(Universal Synchronous/Asynchronous Receiver/Transmitter),4,、5是通用异步串行接口UART(Universal ...
  • 树莓派3上用户目前无法正常是使用GPIO中的UART串口(GPIO14&amp;GPIO15),也就是说用户无论是想用串口来调试树莓派,还是想用GPIO中的串口来连接GPS,蓝牙,XBEE等等串口外设目前都是有问题的。 原因是树莓派CPU...
  • C# 串口类SerialPort的使用方法

    千次阅读 2018-07-25 15:52:00
    &#13; 序言:最近做了一个智能... DataReceived 方法,当串口缓冲区有数据时执行该方法。  ReceivedBytesThreshold属性决定了当串口读缓存中数据多少个时才触发DataReceived事件,默认为1。串口接收的指令可...
  • 单片机C51串口printf的使用方法

    千次阅读 2018-06-22 17:50:15
    串口printf的使用函数原型如下:void USART0_Printf(char *fmt,...)//这个是我们的printf函数{ char* ap; //typedef char *va_list; va_list是char型的指针 charxdata string[128]; //访问外部RAM 两字节对齐 va_...
  • 中科爱讯串口WiFi探针TZ001使用方法

    千次阅读 2016-12-05 11:07:57
    中科爱讯串口WiFi探针TZ001使用方法
  • 摘要:文章对多种协议串行通信进行了分析与讨论,给合Linear公司生产的多协议串口芯片,针对传统串口通信实现中的问题以及实际的广域网串行通信的需求,提出了一种多协议串行接口的设计实现方法。 关键词:多协议...
  • 串口服务器的原理及使用方法

    万次阅读 2016-08-12 14:47:15
    它能多个串口设备连接并能将串口数据流进行选择和处理,把现有的RS232接口的数据转化为IP端口的数据,这样就能够将传统的串行数据送上流行的IP通道,而无须过早的淘汰原有的不带以太网模块的数控系统设备,从而提高...
  • 串行接口

    2012-11-16 12:35:00
    串行接口简称串口,也称串行通信接口(通常指COM接口),是采用串行通信方式的扩展接口。 目录 简介由来接口划分标准与并口区别应用展开 简介由来接口划分标准与并口区别应用展开 编辑本段简介 ...
  • 一、创建Windows窗体项目   二、添加SerialPort组件 ...三种方法(本实例用第三种) 1.设置下面的属性 2.代码实现 3.用我封装的一个类来实现  C# 封装了用于对 Serialport类属性的配置类
  • 串口被占用无法使用解决方法

    千次阅读 2019-11-04 12:25:56
    打开注册表,找到 找到键值HKEY_LOCAL_MACHINE/SYSTEM/... 2.移除设备的硬件映射,HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/SERIALCOMM,选中这几个串口,右键删除 3.移除软件映射,HKEY_LOCAL_MAC...
  • 这段时间在学习嵌入式串口测试。使用的开发板是友善之臂的smart210。对于官方给出的测试程序这里不做过多解释。这里主要说下自己使用的方式。 具体步骤下: 1 pc安装友善串口调试助手  具体安装过程,参考安装...
  • USB转串口线的使用方法

    千次阅读 2011-12-31 10:29:07
    记录一下U转串的使用步骤: 1. 首先拿到USB转串口的线,与pc连接; 2. 查看设备管理器,查看PC是否有相关的驱动,第一次使用U转串一般是没有相关驱动的; 3. 下载相关驱动,可以根据设备管理器提供的信息去网上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 188,274
精华内容 75,309
关键字:

串口的使用方法