STM32程序问题

[复制链接]
1648|7
 楼主| huangfeng33 发表于 2014-10-10 14:28 | 显示全部楼层 |阅读模式
程序是使用中断方式接收PC数据,然后回发,
A和B采用TC和TXE标志判断。
A程序发送的数据长度超多一定程度(比如20),发送几次单片机就停了,不知怎么回事。
B程序无任何问题
使用串口调试助手,发送间隔20ms
程序A:
void USART1_IRQHandler(void)
{
        uint8_t ch;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
        {                
           ch = USART_ReceiveData(USART1);               
    while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
        USART_SendData(USART1,  ch);
       
        }          
}

程序B:

void USART1_IRQHandler(void)
{
        uint8_t ch;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
        {                
           ch = USART_ReceiveData(USART1);               
    while (USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
        USART_SendData(USART1,  ch);
       
        }          
} 1.jpg

arefeng 发表于 2014-10-10 16:16 | 显示全部楼层
可能是发送太快了,或许是没用缓存的原因,丢了数据
qq4988 发表于 2014-10-10 17:21 | 显示全部楼层
换个串口工具试试
mmuuss586 发表于 2014-10-10 19:02 | 显示全部楼层
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
应该停在这一句了吧;

不管是哪个程序,都要加容错处理(比如超时退出WHILE循环)
拿起书本 发表于 2014-10-10 19:39 | 显示全部楼层
Tc 的用法有问题。这个是传输结束标志,也就是说如果当时没有数据正在传输,程序就死在那儿傻傻地等下去了
Txe 是传送缓冲区空标志,只要没有数据可送就会置位,所以没问题 。
fanxsd 发表于 2014-10-10 19:40 | 显示全部楼层
mmuuss586 发表于 2014-10-10 19:02
while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
应该停在这一句了吧;

版主思路就是牛啊!
mmuuss586 发表于 2014-10-10 19:42 | 显示全部楼层
fanxsd 发表于 2014-10-10 19:40
版主思路就是牛啊!

尽量用些常用的判断中断标志位的方式;
jxmzzr 发表于 2014-10-12 19:52 | 显示全部楼层
判断头码,校验码,对不上的话,就把整包丢掉,数据指针清零.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

506

主题

2446

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部