我用的是飞思卡尔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); } }
|