51单片机串口接收问题请教

oceanxia   2009-8-5 13:44 楼主
我用单片机接收一个数据例如是十六进制的123A,我接收的数据格式是什么那
我从缓存sbuf读出的是什么呀,我想存成data[]={1,2,3,A},该怎么接收啊?
我用
for (i=0,i<4,i++)
   {data=sbuf0;}
可以吗?
请指点谢谢了

回复评论 (23)

接收的是十六进制,转换成字符串搞定。
点赞  2009-8-5 15:09
首先要用中断或者查询的方式从串口接收到正确的数据
然后再根据需要进行转换

看你的描述,应该是HEX到ASCII的转换
点赞  2009-8-5 15:46
提示: 作者被禁止或删除 内容自动屏蔽
点赞  2009-8-5 15:58
引用: 引用 2 楼 arnold9009 的回复:
首先要用中断或者查询的方式从串口接收到正确的数据
然后再根据需要进行转换

看你的描述,应该是HEX到ASCII的转换

也想听听详细的解释
谢谢了
点赞  2009-8-5 15:59
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i <4,i++)
{
   while (!RI) ; // 等待字节收到
   RI = 0;
   data=sbuf0;
}
点赞  2009-8-6 09:11
恩有道理
点赞  2009-8-6 16:30
..............xuexi
点赞  2009-8-6 16:49
引用: 引用 5 楼 great_bug 的回复:
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i <4,i++)
{
? while (!RI) ; // 等待字节收到
? RI = 0;
? data=sbuf0;
}
谢谢了
我调试一下试试
点赞  2009-8-8 18:09

引用: 引用 5 楼 great_bug 的回复:
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i  <4,i++)
{
?  while (!RI) ; // 等待字节收到
?  RI = 0;
?  data=sbuf0;
}
点赞  2009-8-9 16:25
少了超时判断。。
点赞  2009-8-10 11:12
[quote]引用 10 楼 kelibin 的回复:
少了超时判断
楼上的超时判断能说的详细点吗
谢谢了
点赞  2009-8-10 18:56
引用: 引用 11 楼 aaquan66 的回复:
[quote]引用 10 楼 kelibin 的回复:
少了超时判断
楼上的超时判断能说的详细点吗
谢谢了


超时判断就是防止没收到字符的时候一直在等待,程序就死在那里了。
---->>while (!RI) ; // 等待字节收到 <<----
点赞  2009-8-10 23:35

您的意思是我这加个时间判断程序
例如如果10ms没有接收到数据怎么处理时这个意识吗
我加到到---->>while (!RI) ;
下面是吗?
还想请教
我想程序开始运行时先接受数据,接收到后我要按照接收到得数据控制多路开关的闭合,然后采集信号,最后通过串口把采集到得信号发射出去,
想请教我的接收数据和处理多路开关的程序一起写到中断程序里那
还是只把接收写到中断程序,把控制多路开关的写到主程序里
还有我怎么保证让程序初始化后就等待接收数据,接收完了才进行采集信号的操作啊
谢谢了
刚入门不太明白
请高人指点
点赞  2009-8-11 10:11
中断一次接收一字节
点赞  2009-8-14 22:18
[quote]引用 14 楼 onesyu 的回复:
中断一次接收一字节
[/Quote
中断一次全部接受可以吗
点赞  2009-8-17 18:09
二楼正解
点赞  2009-8-18 13:18
楼主那个data[]没定义类型啊,应该定义为unsigned short
点赞  2009-8-23 12:27
顶,
点赞  2009-8-23 13:40
int  n, m, k,i;
int  x,BZ,j;
unsigned char serial_data[30];
unsigned char temp_data[];
unsigned char temp_uchar;
unsigned char kg_data[20];

sbit LED = P0^1;





//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) {

   PCA0MD &= ~0x40;         // WDTE = 0 (disable watchdog timer)
   m = 0;
   k = 0;
   x = 0;
   BZ=0;
  
        


   EA = 1;
  

   
Init_Device();           //功能初始化
UART0_initial();

    LED=1;
   while(1)
   {
    // LED=1;
            while (BZ==11)
                   {
                        ES0 = 0;
                        BZ  = 0;
                         LED=1;
                        //delay (1000);

                    //UART0_initial();
                           serial_send();  //从串口发送数据
                          
                   }
          
        }
   
   }
     
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void Oscillator_Init()  //24.5M
{
    OSCICN    = 0x83;
    RSTSRC  = 0x04;

}


void UART0_initial(void)
{
       
        SCON0=0X50;
        TMOD |= 0x20;
       
        TL1 = 0xB0;//波特率:19200;系统时钟=24.5M;参见F350中文文档191页
        TH1 = 0x60;//波特率:19200
        CKCON |= 0x01;//T0使用系统时钟/4=24.5M/4;参见F350中文文档167页
        ES0=1;
        TR1 = 1;
}





void Port_IO_Init()
{
    // P0.0  -  Skipped,     Open-Drain, Digital
    // P0.1  -  Unassigned,  Push-Pull,  Digital  //控制LED
    // P0.2  -  Unassigned,  Open-Drain, Digital  //连接WR
    // P0.3  -  Unassigned,  Open-Drain, Digital  //连接DATA
    // P0.4  -  TX0 (UART0), Open-Drain, Digital
    // P0.5  -  RX0 (UART0), Open-Drain, Digital
    // P0.6  -  Unassigned,  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital

    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital

    P0MDOUT   = 0x12;  // 使能P0.1为推挽输出
    P0MDIN  |= 0x01;  
    P0SKIP    = 0x0F;
    XBR0      = 0x01;
    XBR1      = 0x40;
    LED       = 0;
}

void Interrupts_Init()
{
    IT01CF    = 0x0A;  //Assign INT0 to P0.2
    EX0       = 1;     //Enable /INT0 interrupts
    ET2       = 1;     //Enable TIMER2 interrupts  
        ET0       = 1;     //Enable TIMER1 interrupts  
        ES0       =1;
}

// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
        //Timer_Init();
    Port_IO_Init();
        Oscillator_Init();
    Interrupts_Init();
}

/* UART0 中断接收子程序*/
void UART0_ISR(void)interrupt 4
{
  //char kai;
  char i;
  for(i=0;i<4;i++)
  {
  while (!RI0)
    {RI0=0;
     //kai=SBUF0;
     temp_data=SBUF0;
     
     }

  }
BZ=1;
//LED=1;
}


void serial_send(void)
{
        char i;
       
        for(i=0; i < k; i++)
        {
                temp_uchar = temp_data;
                SBUF0 = temp_uchar;
        while(!TI0);
                TI0=0;
        }

}
点赞  2009-8-27 11:55
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复