这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 高校专区 » 漓东e学堂 » 字符串输入后,数码管显示乱码

共16条 1/2 1 2 跳转至

字符串输入后,数码管显示乱码

菜鸟
2014-11-18 23:00:47     打赏
#define buff_size  16;
char rx_buff[],rx_buff_count=0;

void USART_SendStr(USART_TypeDef* USARTx,char *str)  //传送字符串
{
   while((*str)!='\0')
   {
		 USART_SendData(USARTx,*str++);
     while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
   }
}

void func(char *S,char LEN)  //判断字符串输入长度
{ 
	if((LEN!=6)&(LEN!=7)&(LEN!=8))
    {USART_SendStr(USART1,"\r\n Erro input!!!\r\n");}
}
	
int number()   //从UART1输入的字符串数据转成整型
{ 
	int number;
    rx_buff[rx_buff_count]= USART_ReceiveData(USART1);  //把逐个字符放进字符串数组
	rx_buff_count++;
	number=atoi(rx_buff);  //把字符串数组里的数字转成整型
	return number;
}

void input_ASK()
{	
	char j;
	func(rx_buff,rx_buff_count);
	rx_buff_count=0;
	for (j=0;j");
}

void USART1_IRQHandler(void) //中断函数
{ 

  if(USART_ReceiveData(USART1)==0x0d)
    {input_ASK();}
  else
    {
     USART_SendData(USART1,USART_ReceiveData(USART1));
     rx_buff[rx_buff_count]= USART_ReceiveData(USART1);
	   rx_buff_count++;
  }
     USART_ClearFlag(USART1, USART_FLAG_RXNE);

}

/**
  * @brief  Main program.
  * @param  None
  * @retval None
  */

int main(void)
{  
	int i;
	RCC_Configuration();
	GPIO_INIT();
	USART_int(9600);
	USART_SendStr(USART1,"\r\n");
	USART_SendStr(USART1,"SyStem booting......\r\n");
	USART_SendStr(USART1,"\n>");
	i=number();
	while(1){
		Dis_number(i);//数码管显示函数
	}
}

 

每次输入data=00~99时,数码管只显示上面两幅图任意一个。但是字符串转整型的函数在先前的作业是没有问题,不过数码管不能保持,现在做到数码管保持不灭了,可是显示的问题想过很多方法,一直不能解决,现在求助下大神,希望有点新思路。代码就把功能实现的代码放上,初始化的就算了。


高工
2014-11-19 09:56:07     打赏
2楼

一、可以先将收到的字符串转为整型的数据后要么用仿真查看是否正确或者再发送到串口助手,检测这部分有没有问题,如果没问题就检查数码管显示部分

二、先随意测试几个数在数码管显示,如果没有问题,那就再检查其他吧,感觉就涉及这两个部分

三、在while(1)里判断是否收到有效数据,如果确定是有效数据,就调用你数码管显示的程序显示出来


菜鸟
2014-11-19 11:30:04     打赏
3楼

1.主函数调用了number函数,number又调用了USART_ReceiveData,这一句主函数很快就执行完了,那时没有接受到数据的话就直接过了吧?相当于没执行。  难道会在这里等待接收数据?

2.主函数的末尾用一个while(1)等待中断,这个循环也让数码管亮起不灭。这时假如来了中断,rx_buff[rx_buff_count] 的值和它的长度rx_buff_count才会被修改。

输入完毕以后执行input_ASK,input_ASK又调用了func函数,而fun函数最终也顶多是起到提示输入错误的功能,假如输入的长度对了呢,也应该执行相应的程序吧。。。。

ps:

atoi用得好赞~
本人也是小菜鸟一只。。说得不对还请指正。

 


菜鸟
2014-11-19 12:07:35     打赏
4楼
貌似atoi函数是把整个字符串即“data=”从“d”开始,把整个字符串变成整形的。之前我写了的atoi函数是因为刚好写到D0,但是后来发现这个函数不对,输入什么都是亮D0,(废了一层楼)所以换了一个算法。你先用别人的转换算法试试看正常不?

高工
2014-11-19 23:09:56     打赏
5楼

在USART的接收中断里面已经读取了数据

为什么在 number()函数里面又读取一次呢?


高工
2014-11-19 23:12:24     打赏
6楼
可以查查标准c的sprintf这个函数

菜鸟
2014-11-20 01:20:49     打赏
7楼

老师,不是你看错了就是我又犯傻了

你说的标准c的sprintf函数,是把整形转成字符串吧,itoa同左

你是不是看错itoa和atoi函数啦

atoi是吧字符串转成整形欸

楼主是想把字符串转成数字啦

我觉得是atoi函数的问题 所以老是返回0,所以我才老是亮D0灯吧!!!!原来如此==啊啊啊


高工
2014-11-20 11:48:43     打赏
8楼

你分析得没错

不过字符型的数字转换成整型数字

只相差个30H而已了


高工
2014-11-20 11:49:27     打赏
9楼

都是超级夜猫啊

这么晚了还不睡觉,你班主任造不?


菜鸟
2014-11-20 12:10:10     打赏
10楼
昨晚疯狂补教案中,又老了一点

共16条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]