问个单片机数据接收问题!(应该比较简单,来就送分)

leungpokit   2009-12-24 21:24 楼主
    单个字符接收没什么问题,多字节接收不行了!比如我要从串口调试助手送出一串字符(AAC234,7568等),单片机接收后存到缓存里?有几个菜的问题先问下:这个字符串是动态的,个数不定,是不是只要将接收数组定义大点就可以,数据处理暂时不管。可以在中断外再处理分离。
   代码如下:大家帮我看下这样写可行么,但是显示数码管老不对!
#include
#define uchar unsigned char
#define uint  unsigned int

uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar stringaz[15];//从串口接收的数据
uchar iaz=0;
/********************************************************************
* 名称 : Delay_1ms()
* 功能 : 延时子程序,延时时间为 1ms * x
* 输入 : x (延时一毫秒的个数)
* 输出 : 无
***********************************************************************/
void Delay_1ms(uint i)//1ms延时
{
        uchar x,j;
        for(j=0;j         for(x=0;x<=148;x++);       
}

/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
         if(RI)
         {
           RI=0;
             for(iaz=0;iaz<15;iaz++)
               {
                 stringaz[iaz]=SBUF;
                }
          }
}

/********************************************************************
* 名称 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Init(void)
{
     TMOD = 0x20;
     PCON = 0x00;
     SCON = 0x50;                       
     TH1 = 0xFd;    //设置波特率 9600
     TL1 = 0xFd;
     TR1 = 1;                //启动定时器1
         ES = 1;                //开串口中断
         EA = 1;                //开总中断               
}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Main()
{
        uchar i = 0;
        Delay_1ms(100);
        Com_Init();
       
        while(1)
        {
                 P0 = table[stringaz[1]];//这样写对不对,测试点亮数码管的,但是显示老不对       
                  P2 = 0x07;//数码管位选
                Delay_1ms(10);
       

        }     

}       

数据接收后依次放入stringaz数组里,在串口调试助手里送1234567等,接收后stringaz[1]是不是应该是第2个数?

回复评论 (11)

先友情帮顶下, 一会忙完再看下
点赞  2009-12-24 21:34
stringaz[1]

不知道你传的是什么数据

如果是以十六进制发的1,2,3,啥的,你可以这样直接用作数据的下标

如果是以ASCII码发的,你得把ASCII转成数组下标

通常方法是:ASCII码 - ‘0’
点赞  2009-12-25 09:25
楼你可以把uchar stringaz[15];数组元素个数定义大点就行
P0 = table[stringaz[1]];是显示你接收的第二个数据,前提是发送的是16进制数值。如果是ASCII码,则0~9对应的是32~41,这样你P0 = table[stringaz[1]]的显示就不对了,这个程序是显示一位数字的,而32~41是俩位数,可以改为P0 = table[stringaz[1]-32]就ok了
点赞  2009-12-25 09:50
数组大点可以!
确定理论上stringaz[1]是不确定的,因为你的程序要循环接收15个数,你第一次和第2次第3次发的数后,就会乱掉。例如1次发12个,二次发6个,那么你的stringaz[1]就是第2次的第5个了!
每次发完,确定一个结束标识,才能不乱,例如回车符!
点赞  2009-12-25 10:58
用循环队列
点赞  2009-12-25 13:31

/********************************************************************
* 名称 : Com_Int()
* 功能 : 串口中断子函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void Com_Int(void) interrupt 4
{
if(RI)
{
? RI=0;
? ? ? ? ? ? for(iaz=0;iaz <15;iaz++)
? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? stringaz[iaz]=SBUF;
? ? ? ? ? ? ? ? }
? }
}
这段程序有问题,每次串行中断接收只有一个字节,存在SBUF中。一个字节怎么可能赋给一个数组
void uart_isr() interrupt 4       
{
    if(RI)
        {
                  RI = 0;                  
                  stringaz[iaz]=SBUF;
                  iaz++;  //iaz=0为全局变量
        }
}
试试看
点赞  2009-12-25 14:48
  楼上正解。
点赞  2009-12-25 15:36
6楼正解
点赞  2009-12-25 15:52
引用: 引用 4 楼 galle 的回复:
数组大点可以!
确定理论上stringaz[1]是不确定的,因为你的程序要循环接收15个数,你第一次和第2次第3次发的数后,就会乱掉。例如1次发12个,二次发6个,那么你的stringaz[1]就是第2次的第5个了!
每次发完,确定一个结束标识,才能不乱,例如回车符!

     for(iaz=0;iaz <15;iaz++)

是有点不妥
点赞  2009-12-25 16:01
哦凯,谢了各位,学习了不少,自己再琢磨琢磨继续调试!确实看着简单,问题还真多!来者有分!新年快乐各位!
点赞  2009-12-25 19:23
楼主如果解决后要告诉大家下哦
点赞  2009-12-25 20:48
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复