访问电脑版页面

导航:老古开发网手机版STM32单片机STM32单片机的USART

STM32中IO口模拟串口输出的乱码现象

导读:
关键字:
模拟串口,STM32,

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

STM32中IO口模拟串口输出的乱码现象

[cpp] view plain copy#define OI_TXD PAout(12)

#define OI_RXD PAin(11)

#define BuadRate_9600 100

u8 len = 0; //接收计数

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

u8 recvStat = COM_STOP_BIT;

u8 recvData = 0;

void IO_TXD(u8 Data)

{

u8 i = 0;

OI_TXD = 0;

delay_us(BuadRate_9600);

for(i = 0; i 《 8; i++)

{

if(Data&0x01)

OI_TXD = 1;

else

OI_TXD = 0;

delay_us(BuadRate_9600);

Data = Data》》1;

}

OI_TXD = 1;

delay_us(BuadRate_9600);

}

void USART_Send(u8 *buf, u8 len)

{

u8 t;

for(t = 0; t 《 len; t++)

{

IO_TXD(buf[t]);

}

}

void IOConfig(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

EXTI_InitTypeDef EXTI_InitStruct;

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

//SoftWare Serial TXD

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

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

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

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_12);

//SoftWare Serial RXD

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource11);

EXTI_InitStruct.EXTI_Line = EXTI_Line11;

EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;

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

EXTI_InitStruct.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStruct);

NVIC_InitStructure.NVIC_IRQChannel= EXTI15_10_IRQn ;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;

NVIC_InitStructure.NVIC_IRQChannelSubPriority =2;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

[cpp] view plain copyint main(void)

{

delay_init();

IOConfig();

while(1)

{

USART_Send(“100”,3);

delay_ms(100);

}

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

[cpp] view plain copyvoid USART_Send(u8 *buf, u8 len)

{

u8 t;

for(t = 0; t 《 len; t++)

{

IO_TXD(buf[t]);

delay_ms(1);

}

}

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

来源:网络整理   作者:工程师飞燕  2018/6/21 7:57:00
栏目: [ STM32单片机的USART]

相关阅读

STM32 USART串口DMA接收和发送模式

如何采用STM32单片机串口接收数据

STM32F407的UART串口初始化

STM32f103 双串口配置和中断

STM32单片机串口通讯故障排除处理过程

STM32单片机串口的定义及应用方法

STM32F4 USART配置

STM32单片机串口波特率的计算方法解析

基于STM32单片机发送字符串的函数

STM32单片机重映射USART设计

如何利用STM32单片机串口发送字符串

STM32单片机UART发送配置的步骤及方法

如何在STM32串口通信程序中使用printf发送数据

基于STM32单片机的串口使用解析

什么是串口通信?基于STM32的printf打印输出

基于STM32F4单片机USART寄存器控制的设计

基于STM32的串口DMA发送

STM32单片机的Usart2串口的调试方法

以STM32单片机为核心实现了串口与EM310数据传输的无线终端设计

基于STM32实现串口的两个分案解析