打印
[STM32F1]

串口接收数据丢包?

[复制链接]
5506|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1021256354|  楼主 | 2014-9-23 09:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口接收数据丢包,波特率38400,没有校验,串口工具接收完整,但是连接103的串口以后就出现丢包,怎么会这样??
沙发
qq4988| | 2014-9-23 09:43 | 只看该作者
检查一下103的接收程序

使用特权

评论回复
板凳
1021256354|  楼主 | 2014-9-23 10:46 | 只看该作者
接收程序没有问题,只是没有限制接收字节

使用特权

评论回复
地板
franki_18| | 2014-9-23 10:59 | 只看该作者
贴程序出来看看

使用特权

评论回复
5
1021256354|  楼主 | 2014-9-23 13:18 | 只看该作者
void uart3_init(u32 bound){
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);        //使能USART3,GPIOB时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//功能复用
        USART_DeInit(USART3);  //复位串口3
         //USART3_TX  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //TX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化TX
   
    //USART3_RX         
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化

   //Usart3 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级2,0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

        USART_InitStructure.USART_BaudRate = bound;//一般设置为9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        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(USART3, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART3, ENABLE);                    //使能串口
        USART_ClearFlag(USART3,USART_FLAG_TC);//发送完成标志位
}

使用特权

评论回复
6
1021256354|  楼主 | 2014-9-23 13:19 | 只看该作者
void USART3_IRQHandler(void)                        //串口3中断服务程序
        {
//        u8 Res;

        if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                {
                     rf_isr();//接收处理
}
}

使用特权

评论回复
7
1021256354|  楼主 | 2014-9-23 13:20 | 只看该作者
void rf_isr(void)
{
        u8 dat;

        dat = USART_ReceiveData(USART3);                  //串口UARTA1   接收的数据
//        second_recvData[recont++]=dat;

#if 1
        switch (rf_frame.stage)
        {       
                case 0:
                        if(dat == 0x02)
                                {
                                 rf_frame.stage = 1;
                                 rf_frame.recvNum = 0;
                                 rf_frame.recvData[rf_frame.recvNum] = dat;
                                 rf_frame.recvNum ++;
                                }
                        else
                                {
                                        rf_frame.stage = 0;
                                        rf_frame.recvNum = 0;
                                }
                        break;
                case 1:
                        if(dat == 0x10)
                                {
                                        rf_frame.stage = 2;
                                        rf_frame.recvData[rf_frame.recvNum] = dat;
                                        rf_frame.recvNum++;
                                }
                        else
                                {
                                        rf_frame.stage = 0;
                                        rf_frame.recvNum = 0;
                                }                                       
                        break;
                case 2:
                        if(dat == 0x18)
                                {
                                        rf_frame.stage = 3;
                                        rf_frame.recvData[rf_frame.recvNum] = dat;
                                        rf_frame.recvNum++;
                                }
                        else
                                {
                                        rf_frame.stage = 0;
                                        rf_frame.recvNum = 0;
                                }                                       
                        break;
                case 3:
                        rf_frame.recvData[rf_frame.recvNum] = dat;
                       
                        rf_frame.recvNum++;
                    }
              }
}

使用特权

评论回复
8
1021256354|  楼主 | 2014-9-23 13:22 | 只看该作者
发送的数据不是定值,接收丢包,但是用串口工具接收就没有问题

使用特权

评论回复
9
mmuuss586| | 2014-9-23 19:31 | 只看该作者
波特率调低点看看还丢不丢包;

使用特权

评论回复
10
songchenping| | 2014-9-23 20:10 | 只看该作者
接收数据肯定要设定字头和字尾,以及每包数据的长度。当然你也可以接收一个显示一个。像串口调试工具一样。

使用特权

评论回复
11
songchenping| | 2014-9-23 20:14 | 只看该作者
硬件上是否加上拉电阻。

使用特权

评论回复
12
1021256354|  楼主 | 2014-9-24 15:58 | 只看该作者
没有加上拉电阻

使用特权

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

本版积分规则

个人签名:多读书 多看报 少吃零食 多睡觉

148

主题

642

帖子

3

粉丝