7250|14

70

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

急,求助串口接收溢出问题! [复制链接]

目前我的串口程序遇到了一个问题,我没解决思路,请教大虾。
我使用了一个256大小的缓冲区来存取用户从终端发送过来的命令,如果我是在终端里面手动一个一个字符去输入命令的话正确没问题,输入到256的时候就进入处理,处理完后可以接着输入命令,接收中断进入次数为256。可是假如我一次性粘贴一条超过256长度的命令,程序在处理完前面256长度后接着不能再次输入命令了,程序卡在一直从串口接收缓冲区里面提取数据的地方,接收中断只进入了1次。使用的是UART1。
请教高手,在这种一次性粘贴的长度超过我定义的256缓冲区的时候,我如何把串口接收缓冲区UART1的FIFO里面的数据给清除掉?有没解决办法?

最新回复

我现在的接收中断只进入了256次,也就是在我处理了前面256字节以后,后面多余的字节传过来的时候中断没被触发。  详情 回复 发表于 2010-5-29 10:42
点赞 关注

回复
举报

76

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没怎么明白你的意思,是不是你想一次发大于256,然后接收到256后,自动将前面的清掉,然后继续收后面的数据,是不是?
假如是这样的话,估计没有什么好的办法,只能去读取数据,它才会清空接收buf的东西,才能继续接收。
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
/*---------------------------------------------------------------------
                         LCD1602.C文件 LCD1602的函数  
  作者:Computer-lov     创建日期:2004.11.12    最后修改日期:2004.11.12
  版本:1.0
----------------------------------------------------------------------*/

#include "hardware.h"
#include "lcd1602.h"

void LCD_check_busy(void)   //检测LCD状态,看它是不是还在忙呢
{
while(1)
  {
   LCD_EN=0;
   LCD_RS=0;
   LCD_RW=1;
   LCD_DATA=0xff;
   LCD_EN=1;
   if(!LCD_BUSY)break;
  }
LCD_EN=0;
}

void LCD_cls(void)          //LCD清屏
{

LCD_check_busy();
LCD_RS=0;
LCD_RW=0;
LCD_DATA=1;
LCD_EN=1;
LCD_EN=0;

}

void LCD_write_instruction(unsigned char LCD_instruction)   //写指令到LCD
{
  LCD_check_busy();
LCD_RS=0;
LCD_RW=0;

LCD_DATA=LCD_instruction;
LCD_EN=1;
LCD_EN=0;
}

void LCD_write_data(unsigned char LCD_data)      //输出一个字节数据到LCD
{
  LCD_check_busy();
LCD_RS=1;
LCD_RW=0;

LCD_DATA=LCD_data;
LCD_EN=1;
LCD_EN=0;
}

void LCD_set_position(unsigned char x)            //LCD光标定位到x处
{
LCD_write_instruction(0x80+x);
}

/*
void LCD_go_home(void)                         //LCD光标归位
{
LCD_write_instruction(LCD_GO_HOME);
}
*/

void LCD_printc(unsigned char lcd_data)          //输出一个字符到LCD
{
LCD_write_data(lcd_data);
}

void LCD_prints(unsigned char *lcd_string)       //输出一个字符串到LCD
{
unsigned char i=0;
while(lcd_string!=0x00)
  {
   LCD_write_data(lcd_string);
   i++;
  }
}

void LCD_initial(void)                        //初始化LCD
{
LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE);
LCD_cls();
}
这是protues下1602的驱动,我仿真过的可以用,你试试看
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
先用 LCD_set_position设置好显示位置,然后就可以写数据
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
额,不好意思,发错地方了
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用 1 楼 peasant_lee 的回复:
没怎么明白你的意思,是不是你想一次发大于256,然后接收到256后,自动将前面的清掉,然后继续收后面的数据,是不是?
假如是这样的话,估计没有什么好的办法,只能去读取数据,它才会清空接收buf的东西,才能继续接收。

我想的是发送大于256,在接收处理完256后,剩余的就不处理了,想将接收BUF里的东西给清除掉,这样方便下次输入命令,我现在的是没清除,处理256后BUF里面有数据,因此连中断都不触发了。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

7
 
记录下已接收到串口数据,若大于256则后面的数据不予处理
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

8
 
2楼的,你这个东西很有意思
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
假如不在发送端处理,让发送端一定传少于255字节的话。
在接收端,是否可以像到达了256字节后,你就短暂的屏蔽接收功能,那后面的就接收不成功了。至于屏蔽多久,得看你256后的字节多了多少。。。。而且不能太久,因为有可能下次真的传输会来。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
留点余量,留个50%,每128字节处理一次
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

11
 
真是没搞明白你啥意思

不过LS说的有道理,好歹留点余量
 
 
 

回复

84

帖子

0

TA的资源

一粒金砂(中级)

12
 
类似的我也做了1次
就是按9楼的方法
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

13
 
加上握手,不管多少都能收
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

14
 
我检测到的是在我处理了256字节后程序检测到UART1里面还有数据,然后接着继续收,可是收了几个字节以后它就重复收相同的了,因此在终端上显示出来刷屏,一直在现实相同的数据。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

15
 
我现在的接收中断只进入了256次,也就是在我处理了前面256字节以后,后面多余的字节传过来的时候中断没被触发。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表