STM32模拟串口输出偶有乱码

发布者:EnchantedDreams最新更新时间:2018-06-10 来源: eefocus关键字:STM32  模拟串口输出  乱码 手机看文章 扫描二维码
随时随地手机看文章

因为芯片串口不够用,只好用IO口模拟串口,在网上下载了个模拟串口的程序,可运行,但发现串口输出隔几个字符就会出现乱码,主要部分代码如下:


  1. #define OI_TXD  PAout(12)  

  2. #define OI_RXD  PAin(11)  

  3.   

  4. #define BuadRate_9600   100  

  5.   

  6. u8 len = 0; //接收计数  

  7. u8 USART_buf[11];  //接收缓冲区  

  8.   

  9. u8 recvStat = COM_STOP_BIT;  

  10. u8 recvData = 0;  

  11.   

  12. void IO_TXD(u8 Data)  

  13. {  

  14.     u8 i = 0;  

  15.     OI_TXD = 0;    

  16.     delay_us(BuadRate_9600);  

  17.     for(i = 0; i < 8; i++)  

  18.     {  

  19.         if(Data&0x01)  

  20.             OI_TXD = 1;    

  21.         else  

  22.             OI_TXD = 0;       

  23.           

  24.         delay_us(BuadRate_9600);  

  25.         Data = Data>>1;  

  26.     }  

  27.     OI_TXD = 1;  

  28.     delay_us(BuadRate_9600);  

  29. }  

  30.       

  31. void USART_Send(u8 *buf, u8 len)  

  32. {  

  33.     u8 t;  

  34.     for(t = 0; t < len; t++)  

  35.     {  

  36.         IO_TXD(buf[t]);  

  37.     }  

  38. }  

  39.       

  40.  void IOConfig(void)  

  41.  {  

  42.     GPIO_InitTypeDef  GPIO_InitStructure;  

  43.     NVIC_InitTypeDef NVIC_InitStructure;  

  44.     EXTI_InitTypeDef EXTI_InitStruct;  

  45.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOA, ENABLE);  //使能PB,PC端口时钟   

  46.        

  47.      //SoftWare Serial TXD  

  48.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;        

  49.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;       //推挽输出  

  50.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;      //IO口速度为50MHz     

  51.   GPIO_Init(GPIOA, &GPIO_InitStructure);                      

  52.   GPIO_SetBits(GPIOA,GPIO_Pin_12);                        

  53.        

  54.        

  55.     //SoftWare Serial RXD  

  56.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;  

  57.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  

  58.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;       

  59.     GPIO_Init(GPIOA, &GPIO_InitStructure);     

  60.   

  61.     GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);  

  62.     EXTI_InitStruct.EXTI_Line = EXTI_Line11;  

  63.     EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;  

  64.     EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发中断  

  65.     EXTI_InitStruct.EXTI_LineCmd=ENABLE;  

  66.     EXTI_Init(&EXTI_InitStruct);  

  67.   

  68.   

  69.     NVIC_InitStructure.NVIC_IRQChannel= EXTI15_10_IRQn ;   

  70.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;   

  71.     NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;    

  72.     NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;    

  73.     NVIC_Init(&NVIC_InitStructure);    

  74.       

  75. }  


  76. int main(void)  

  77. {         

  78. delay_init();  

  79.        IOConfig();  

  80.        while(1)  

  81. {  

  82.     USART_Send("100",3);  

  83.     delay_ms(100);  

  84. }  

一般出现输出乱码,可能是输出部分延时不够造成的,于是检查输出部分使用延时的情况,发现USART_Send中没有用到延时,所在在USART_Send中加入一个1ms的延时,错误解除,改过的代码如下:


  1. void USART_Send(u8 *buf, u8 len)  

  2. {  

  3.     u8 t;  

  4.     for(t = 0; t < len; t++)  

  5.     {  

  6.         IO_TXD(buf[t]);  

  7.         delay_ms(1);  

  8.     }  

  9. }  

延时虽然简单,但有时真的会发挥很大的作用。


关键字:STM32  模拟串口输出  乱码 引用地址:STM32模拟串口输出偶有乱码

上一篇:STM32F1xx单片机使用固件库时串口打印乱码的解决办法
下一篇:在STM32中使用printf发送字符串到串口

推荐阅读最新更新时间:2024-03-16 16:05

学习STM32笔记3 GPIO设置
/******************************************************************************* 设置GPIO基本参数 *******************************************************************************/ void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; //根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器 GPIO_InitStructure.GPIO_Pin = GPIO_P
[单片机]
5050 RGB8路LED灯驱动(PWM驱动,STM32
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 RGB LED模块:淘宝有售 二、实验效果 类似奥迪转向灯,灯以此亮起,如此循环。颜色256 * 256 * 256色可调。 三、驱动原理 模块上面的RGB引脚低电平有效,LED灯IO口也是低电平有效。 四、驱动代码 led.h #ifndef __LED_H__ #define __LED_H__ #include stm32f10x.h #include gpio.h #include pwm.h #define LED_R PAout(1) #define LED_G PAout(2) #de
[单片机]
5050 RGB8路LED灯驱动(PWM驱动,<font color='red'>STM32</font>)
STM32访问外部存储器-NOR-Flash
今天调试了一天STM32程序走了很多弯路,还好最后完全走通,调试过程中的一些经验总结如下: 1、不要完全相信编译器,很多时候可能你只是少了一个分号或者括号,编译器可能给你报一大堆不相关的错误,这时候如果想着一个个去改的话显然找不到正确答案。因此为了保险起见原先编译成功的程序在改动的时候,每改动一次就对相应的文件编译一次,这样可以避免一下子改动很多最后一编译出现很多错误不好定位。第一步编译只是编译当前文件,只有在build的时候才会对所有改动的文件重新编译,因此等到build的时候发现错误很多时候并不能很好定位。 2、加入功能时要注意改动几个地方;首先是/stm32f10x_conf.h中相应的头文件有没有去掉注释,这一点很
[单片机]
STM32开发板实验箱8位独立按键测试学习
1、畅学STM32核心板 2、 配套STM32主芯片 F103C8T6 3、 畅学系列STM32实验箱 EESKILL畅学系列多功能开发学习板功能底板,加上配套畅学STM32核心板,再配上专用的超大铝箱即构成了EESKILL畅学STM32开发学习实验箱。 整个开发板由功能主板和扩展核心板组成,扩展核心板可以通过铜柱、螺母固定到底板,组合成为一个多功能开发学习板。功能底板和扩展核心板可以一起使用,也可以分开单独使用,灵活性、扩展性极强。 除STM32核心板之外,畅学系列多功能开发学习板/实验箱还支持以下核心板:  畅学51单片机核心板  畅学PIC单片机核心板  畅学MSP430单片机核心板 (2种)
[单片机]
<font color='red'>STM32</font>开发板实验箱8位独立按键测试学习
STM32 定时器输出比较主动模式
STM32的定时器还可以工作在输出主动模式TIM_OCMode_Active。这里所谓的主动模式,通俗地说就是当定时器的计数值达到比较值的时候,强制在引脚端输出高电平。在这里,我这里编写一个程序使定时器工作输出比较主动模式,然后经过已经时间的延时,然后在通道引脚电平就会强制被拉高。 下面就讲讲相关的代码,还是基于我自己的规范工程。 1、工程的修改 1)这里用到了定时器,所以需要将stm32f10x_tim.h添加到STM32F10x_StdPeriod_Driver工程组中。 2)打开stm32f0x_conf.h文件,将其中原先被屏蔽的语句:#include stm32f10x_tim.h 的注释去掉。 3)新建OCAc
[单片机]
<font color='red'>STM32</font> 定时器<font color='red'>输出</font>比较主动模式
判断STM32 GPIO输入口的输入状态(高电平或低电平)
以PE2和PE4为例: ① 判断单个端口是否为高电平: if(GPIOE- IDR& GPIO_IDR_IDR2) { 函数体; } 当PE2端口为高电平时,if条件为真;当PE2口为低电平时,if条件为假; ② 判断单个端口是否为低电平: if((~GPIOE- IDR)& GPIO_IDR_IDR2) { 函数体; } 分析:首先通过 &GPIO_IDR_IDR屏蔽掉PE2之外的其他PE口。当PE2为高电平时,GPIO-〉IDR的bit2为‘1’,取反后为‘0’,因此条件为假;当PE2为低电平时,GPIO-〉IDR的bit2为‘0’,取反后为‘1’,因此条件为真;通过此方法
[单片机]
STM32 usb_pwr.c文件分析
usb_pwr.c 这个文件看文件名就知道跟功耗有关了,有很多的状态:上电、掉电、挂起、恢复。 当首先是usb的上电和断电函数的定义了。 usb上电函数如下: /******************************************************************************* * Function Name : PowerOn * Description : 上电 * Input : None. * Output : None. * Return : USB_SUCCESS. ***************************************
[单片机]
RyanMqtt移植指南
测试环境:stm32F401RCT6、RT-Thread版本: v4.1.0、RT-Thread Studio版本: 2.2.6、网络硬件使用ec800m移植at_socket使用sal框架。 1、移植介绍 RyanMqtt 库希望应用程序为以下接口提供实现: system 接口 RyanMqtt 需要 RTOS 支持,必须实现如下接口才可以保证 mqtt 客户端的正常运行 network 接口 RyanMqtt 依赖于底层传输接口 API,必须实现该接口 API 才能在网络上发送和接收数据包 MQTT 协议要求基础传输层能够提供有序的、可靠的、双向传输(从客户端到服务端 和从服务端到客户端)的字节流 time 接口
[单片机]
RyanMqtt移植指南
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved