打印
[STM32F1]

串口通讯问题,停止位不对,请帮忙看下

[复制链接]
1836|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主


串口配置的9600 8位数据 无校验 1位停止位

上图是逻辑分析仪抓出来的图,上面串口停止位是0.208ms,正常的一位停止位的时间在0.104ms左右
现在变成了两位停止位,不知道为什么

//初始化
void RS232_Init(u32 bound)
{
        GPIO_InitTypeDef GPIO_InitStructure;     
        USART_InitTypeDef USART_InitStructure;   
        NVIC_InitTypeDef NVIC_InitStructure;     
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);               
       
        USART_DeInit(USART1);     
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;             
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          
        GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;            
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(GPIOA, &GPIO_InitStructure);  
       
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,ENABLE);
        RCC_APB2PeriphResetCmd(RCC_APB2Periph_USART1,DISABLE);
       
        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(USART1, &USART_InitStructure);            

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;           
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;         
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           
        NVIC_Init(&NVIC_InitStructure);                     

        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

        USART_Cmd(USART1, ENABLE);                  
       
        USART_ClearFlag(USART1, USART_FLAG_TC);                       
}


//发送程序
void RS232_Send_Data(u8 *buf,u8 len)
{
        u8 t;
          for(t=0;t<len;t++)                //循环发送数据
        {                  
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);        //等待发送完成
                USART_SendData(USART1,buf[t]);
        }         
        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);                       

}











沙发
mmuuss586| | 2014-7-26 15:57 | 只看该作者
程序没啥问题,可能函数库不对;
下面这段也改下看看
  for(t=0;t<len;t++)                //循环发送数据
        {         
                USART_SendData(USART1,buf[t]);
                while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);        //等待发送完成               
            }  
发送放到上面试下;  

现在用串口调试助手接收到的数据不对吗???

使用特权

评论回复
板凳
厌世恶男|  楼主 | 2014-7-26 16:08 | 只看该作者
mmuuss586 发表于 2014-7-26 15:57
程序没啥问题,可能函数库不对;
下面这段也改下看看
  for(t=0;t

串口调试助手接收没有任何问题,字符都对,
关键问题是在于每帧后面的那个停止位,我串口初始化配置的就是1位停止位,但实际的停止位是2位,


我一次发送8字节,停止位过长,这样就导致另一个设备认为这是8组数据,

使用特权

评论回复
地板
mmuuss586| | 2014-7-26 16:12 | 只看该作者
厌世恶男 发表于 2014-7-26 16:08
串口调试助手接收没有任何问题,字符都对,
关键问题是在于每帧后面的那个停止位,我串口初始化配置的就 ...

哦,你这段程序没啥问题的;
换个串口抓下波形看看,还有问题就是你的函数库或者其它什么地方有问题,肯定不是你贴的这段程序问题;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝