打印

求助

[复制链接]
1531|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linwy84|  楼主 | 2008-10-16 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的是飞思卡尔mc9s12dg128单片机,从PC机通过串口发送一个数据,单片机运算结束后能返回一个两位数吗?如果能返回,后一位为什么把前一位覆盖了,例如8*2=16,只返回6,把1给覆盖了,请高手指点,不胜感谢!
我的程序是:
#include <hidef.h>      /* common defines and macros */
#include <mc9s12dg128.h>     /* derivative information */

#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"

//串行通信需要用到的头文件
#include "mc9s12dg128.h"              //MCU映像寄存器名

//串行通信寄存器及标志位定义
#define ReSendStatusR SCI0SR1            //SCI状态寄存器
#define ReTestBit     5                  //接收缓冲区满标志位
#define SendTestBit   7                  //发送缓冲区空标志位
#define ReSendDataR   SCI0DRL            //数据寄存器



void init(void) 
{unsigned char t; 
 SCI0BDL=0x9C;
 SCI0BDH=0x00;
 SCI0CR1=0x08;
 t=SCI0DRL;
 t=SCI0SR1;
 SCI0CR2=0x0C;
 }

 
unsigned char SCIRe1(unsigned char *p){
    unsigned int k;
    unsigned char i;
    //ReStatusR第ReTestBit位为1表示可接收数据
    for (k=0; k<0xfbbb; k++)
        if ((ReSendStatusR & (1<<ReTestBit)) != 0)
        {
            i = ReSendDataR;
            *p = 0x00;
            break;
        }
     //接收失败
    if (k >= 0xfbbb)
    {
      i=0xff;
        *p=0x01;
    }
   
    return i;    //返回接收到的数据 
}

 /*SCIReN:串行接收N个字节--------------------------*
*功  能:接收N个字节数据,并存放在ch数组中               *       
*参  数:待接收的数据字节数及其存放的数组首地址         *       
*返  回:接收标志=0收到数据,=1未收到数据                * 
*-----------------------------------------------------*/
unsigned char SCIReN(unsigned char n,unsigned char ch[])
 {unsigned int m;                  
  unsigned char fp;
   m=0;
   while (m<n)
 {    
   ch[m]=SCIRe1(&fp); 
   if (fp==1) return 1; 
   m++;
  } 
   return 0;
 }
void SCISend1(unsigned char o){
 unsigned char s[2];
     s[0]=((o-48)*2/10)+48;
     s[1]=((o-48)*2%10)+48;    
  while(1){      
 if(!(SCI0SR1&0x20)) {
     SCI0DRL=s;
   }
  break; 
 

}   
}
 
 /*SCISendN:串行发送N个字节----------------------------*
*功  能:发送数组中的N个字节数据                        *
*参  数:待发送的数据字节数及其要存放的数组首地址       *          
*返  回:无                                             *
*-----------------------------------------------------*/
void SCISendN(unsigned char n,unsigned char ch[])
  { unsigned int i;
    for(i=0;i<n;i++)
    SCISend1(ch);
}
void main(void) 
{ unsigned int i;
  unsigned char ch[5];                          
  init();
  while(1) {
  i=SCIReN(1,ch);
  if(i==0)
  SCISendN(1,ch);
}
}

相关帖子

沙发
xc_cz| | 2008-10-16 10:59 | 只看该作者

因为“16”转换成ASC码后是两个字节

而你只接受和发送了一个字节,所以。。
改成:
void main(void) 
{ unsigned int i;
  unsigned char ch[5];                          
  init();
  while(1) {
  i=SCIReN(2,ch);
  if(i==0)
  SCISendN(2,ch);
}
}

使用特权

评论回复
板凳
zusen| | 2008-10-16 12:47 | 只看该作者

BUF

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

8

帖子

0

粉丝