急,求助串口接收溢出问题!

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

回复评论 (14)

没怎么明白你的意思,是不是你想一次发大于256,然后接收到256后,自动将前面的清掉,然后继续收后面的数据,是不是?
假如是这样的话,估计没有什么好的办法,只能去读取数据,它才会清空接收buf的东西,才能继续接收。
点赞  2010-5-26 18:37
/*---------------------------------------------------------------------
                         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的驱动,我仿真过的可以用,你试试看
点赞  2010-5-26 19:06
先用 LCD_set_position设置好显示位置,然后就可以写数据
点赞  2010-5-26 19:08
额,不好意思,发错地方了
点赞  2010-5-26 19:09
引用: 引用 1 楼 peasant_lee 的回复:
没怎么明白你的意思,是不是你想一次发大于256,然后接收到256后,自动将前面的清掉,然后继续收后面的数据,是不是?
假如是这样的话,估计没有什么好的办法,只能去读取数据,它才会清空接收buf的东西,才能继续接收。

我想的是发送大于256,在接收处理完256后,剩余的就不处理了,想将接收BUF里的东西给清除掉,这样方便下次输入命令,我现在的是没清除,处理256后BUF里面有数据,因此连中断都不触发了。
点赞  2010-5-27 09:17
记录下已接收到串口数据,若大于256则后面的数据不予处理
点赞  2010-5-27 10:08
2楼的,你这个东西很有意思
点赞  2010-5-27 10:41
假如不在发送端处理,让发送端一定传少于255字节的话。
在接收端,是否可以像到达了256字节后,你就短暂的屏蔽接收功能,那后面的就接收不成功了。至于屏蔽多久,得看你256后的字节多了多少。。。。而且不能太久,因为有可能下次真的传输会来。
点赞  2010-5-27 11:02
留点余量,留个50%,每128字节处理一次
点赞  2010-5-27 20:58
真是没搞明白你啥意思

不过LS说的有道理,好歹留点余量
点赞  2010-5-27 23:10
类似的我也做了1次
就是按9楼的方法
点赞  2010-5-28 15:16
加上握手,不管多少都能收
点赞  2010-5-28 16:33
我检测到的是在我处理了256字节后程序检测到UART1里面还有数据,然后接着继续收,可是收了几个字节以后它就重复收相同的了,因此在终端上显示出来刷屏,一直在现实相同的数据。
点赞  2010-5-29 09:30
我现在的接收中断只进入了256次,也就是在我处理了前面256字节以后,后面多余的字节传过来的时候中断没被触发。
点赞  2010-5-29 10:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复