7887|23

173

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

51单片机串口接收问题请教 [复制链接]

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

最新回复

强制转换吗?  详情 回复 发表于 2009-8-29 18:16
点赞 关注

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
接收的是十六进制,转换成字符串搞定。
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
首先要用中断或者查询的方式从串口接收到正确的数据
然后再根据需要进行转换

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

回复

81

帖子

0

TA的资源

禁止访问

4
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 arnold9009 的回复:
首先要用中断或者查询的方式从串口接收到正确的数据
然后再根据需要进行转换

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

也想听听详细的解释
谢谢了
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

6
 
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i <4,i++)
{
   while (!RI) ; // 等待字节收到
   RI = 0;
   data=sbuf0;
}
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
恩有道理
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

8
 
..............xuexi
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 5 楼 great_bug 的回复:
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i <4,i++)
{
? while (!RI) ; // 等待字节收到
? RI = 0;
? data=sbuf0;
}

谢谢了
我调试一下试试
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 

引用 5 楼 great_bug 的回复:
你必须要等到你要的数据接收到了才能向数组里面保存,比如
for (i=0,i  <4,i++)
{
?  while (!RI) ; // 等待字节收到
?  RI = 0;
?  data=sbuf0;
}

 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

11
 
少了超时判断。。
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

12
 
[quote]引用 10 楼 kelibin 的回复:
少了超时判断
楼上的超时判断能说的详细点吗
谢谢了
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

13
 
引用 11 楼 aaquan66 的回复:
[quote]引用 10 楼 kelibin 的回复:
少了超时判断
楼上的超时判断能说的详细点吗
谢谢了


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

回复

75

帖子

0

TA的资源

一粒金砂(初级)

14
 

您的意思是我这加个时间判断程序
例如如果10ms没有接收到数据怎么处理时这个意识吗
我加到到---->>while (!RI) ;
下面是吗?
还想请教
我想程序开始运行时先接受数据,接收到后我要按照接收到得数据控制多路开关的闭合,然后采集信号,最后通过串口把采集到得信号发射出去,
想请教我的接收数据和处理多路开关的程序一起写到中断程序里那
还是只把接收写到中断程序,把控制多路开关的写到主程序里
还有我怎么保证让程序初始化后就等待接收数据,接收完了才进行采集信号的操作啊
谢谢了
刚入门不太明白
请高人指点
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

15
 
中断一次接收一字节
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

16
 
[quote]引用 14 楼 onesyu 的回复:
中断一次接收一字节
[/Quote
中断一次全部接受可以吗
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

17
 
二楼正解
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

18
 
楼主那个data[]没定义类型啊,应该定义为unsigned short
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

19
 
顶,
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

20
 
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;
        }

}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表