打印
[STM8]

关于STM8L152C6 USART问题

[复制链接]
1630|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
磁轨炮|  楼主 | 2014-9-23 11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大神,小弟编写了一个STM8L152C6单片机USART一收一发程序,出现一个问题,在发送然后再返回数据时会丢失数据,而且是每隔11个丢一个,比如发1 2 3 4 5 6 7 8 9 10 11 12 13 14 15.。。。就会丢失12 23 34,


主函数部分:
/* MAIN.C file
*
* Copyright (c) 2002-2005 STMicroelectronics
*/

#include "stm8l15x.h"
#include "stm8l15x_conf.h"


void delayms(unsigned int x)
{
        unsigned int j=0,i=0;
        for(;i<x;i++)
                for(;j<65535;j++);
}

main()
{
        GPIO_TypeDef GPIO_Struct;
       
        GPIO_DeInit(&GPIO_Struct);
        GPIO_Init(GPIOB,(GPIO_Pin_4|GPIO_Pin_5),GPIO_Mode_Out_PP_Low_Fast);

        GPIO_Write(GPIOB,0x10);
        GPIO_Init(GPIOC,GPIO_Pin_2,GPIO_Mode_In_PU_No_IT);
        GPIO_Init(GPIOC,GPIO_Pin_3,GPIO_Mode_Out_PP_Low_Fast);
        GPIO_Init(GPIOE,GPIO_Pin_0,GPIO_Mode_Out_PP_Low_Fast);
        CLK_PeripheralClockConfig(CLK_Peripheral_USART1,ENABLE);
       
        USART_DeInit(USART1);
        USART_Init(USART1,9600,USART_WordLength_8b,USART_StopBits_1,USART_Parity_No,(                        USART_Mode_TypeDef)(USART_Mode_Rx|USART_Mode_Tx));
        USART_ClockInit(USART1,USART_Clock_Disable,USART_CPOL_Low,USART_CPHA_2Edge,USART_LastBit_Disable);
        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_Cmd(USART1,ENABLE);
       
        enableInterrupts();
       
         GPIO_SetBits (GPIOE,GPIO_Pin_0);
        while (1)
        {               
               
        }
}


中断函数

@far @interrupt void USART_RX_IRQHandler (void) //28
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
                Buf=USART_ReceiveData8(USART1);
        //        while((USART1->SR&0x80)==0x00);
                        USART_SendData8(USART1,Buf);
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
                        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}

谢谢各位大神了
沙发
honami520| | 2014-9-23 13:23 | 只看该作者
你不能这样做的!你是用中断的方式,但是在中断里面还查询。不伦不类的。
要么就中断的方式发送。要么就禁止中断,然后把你的这段函数写到一个子函数里面,在主循环里面去发送。

使用特权

评论回复
板凳
磁轨炮|  楼主 | 2014-9-23 13:48 | 只看该作者
honami520 发表于 2014-9-23 13:23
你不能这样做的!你是用中断的方式,但是在中断里面还查询。不伦不类的。
要么就中断的方式发送。要么就禁 ...

大神您好,在中断里查询的是发送完成状态,还有,写到主函数里的话,是不是就不能实时接收了?

使用特权

评论回复
地板
honami520| | 2014-9-23 15:33 | 只看该作者
磁轨** 发表于 2014-9-23 13:48
大神您好,在中断里查询的是发送完成状态,还有,写到主函数里的话,是不是就不能实时接收了? ...

别喊大神,只是比你早学。
不过既然你这么客气,我就多说点!
串口发送,分2种,一种是中断发送。一种是查询方式发送。
你程序里面写的那种就是查询方式。查询发送完成标志,等待完成,然后发送,然后再查询,再发送,直到你发完为止。这种叫查询方式,是用普通函数来做的。因为里面有个死等while的判断,所以这种叫查询。

中断,就是开启发送中断标志,开启之后,发送完成一个字节,就会产生中断。然后在中断函数里面继续发送其他的。直到全部发送完成。所以,在中断函数里面,可以查询发送完成标志,但是不需要while这个死等的判断。
我这边有个里程,是STM8L152C6T6串口DMA发送的。不过比较复杂。库函数的。如果你需要,可以发给你研究!不过,比你现在的都还要复杂很多。怕你搞不会

使用特权

评论回复
5
mmuuss586| | 2014-9-23 19:28 | 只看该作者

楼上正解;

使用特权

评论回复
6
磁轨炮|  楼主 | 2014-9-23 20:05 | 只看该作者
honami520 发表于 2014-9-23 15:33
别喊大神,只是比你早学。
不过既然你这么客气,我就多说点!
串口发送,分2种,一种是中断发送。一种是 ...

大神,求函数,我的邮箱 yue_wot@163.com现在看不懂以后不一定看不懂,万分感谢

使用特权

评论回复
7
honami520| | 2014-9-23 23:59 | 只看该作者
磁轨** 发表于 2014-9-23 20:05
大神,求函数,我的邮箱 yue_wot@163.com现在看不懂以后不一定看不懂,万分感谢 ...

OK,程序发给你参考下

使用特权

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

本版积分规则

13

主题

38

帖子

0

粉丝