目前我的串口程序遇到了一个问题,我没解决思路,请教大虾。
我使用了一个256大小的缓冲区来存取用户从终端发送过来的命令,如果我是在终端里面手动一个一个字符去输入命令的话正确没问题,输入到256的时候就进入处理,处理完后可以接着输入命令,接收中断进入次数为256。可是假如我一次性粘贴一条超过256长度的命令,程序在处理完前面256长度后接着不能再次输入命令了,程序卡在一直从串口接收缓冲区里面提取数据的地方,接收中断只进入了1次。使用的是UART1。
请教高手,在这种一次性粘贴的长度超过我定义的256缓冲区的时候,我如何把串口接收缓冲区UART1的FIFO里面的数据给清除掉?有没解决办法?
没怎么明白你的意思,是不是你想一次发大于256,然后接收到256后,自动将前面的清掉,然后继续收后面的数据,是不是?
假如是这样的话,估计没有什么好的办法,只能去读取数据,它才会清空接收buf的东西,才能继续接收。
/*---------------------------------------------------------------------
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的驱动,我仿真过的可以用,你试试看
先用 LCD_set_position设置好显示位置,然后就可以写数据
引用: 引用 1 楼 peasant_lee 的回复:
没怎么明白你的意思,是不是你想一次发大于256,然后接收到256后,自动将前面的清掉,然后继续收后面的数据,是不是?
假如是这样的话,估计没有什么好的办法,只能去读取数据,它才会清空接收buf的东西,才能继续接收。
我想的是发送大于256,在接收处理完256后,剩余的就不处理了,想将接收BUF里的东西给清除掉,这样方便下次输入命令,我现在的是没清除,处理256后BUF里面有数据,因此连中断都不触发了。
记录下已接收到串口数据,若大于256则后面的数据不予处理
假如不在发送端处理,让发送端一定传少于255字节的话。
在接收端,是否可以像到达了256字节后,你就短暂的屏蔽接收功能,那后面的就接收不成功了。至于屏蔽多久,得看你256后的字节多了多少。。。。而且不能太久,因为有可能下次真的传输会来。
真是没搞明白你啥意思
不过LS说的有道理,好歹留点余量
我检测到的是在我处理了256字节后程序检测到UART1里面还有数据,然后接着继续收,可是收了几个字节以后它就重复收相同的了,因此在终端上显示出来刷屏,一直在现实相同的数据。
我现在的接收中断只进入了256次,也就是在我处理了前面256字节以后,后面多余的字节传过来的时候中断没被触发。