首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

STC单片机从io口模拟uart读入数据保存在数据缓存中,怎么然后从串口发出去

2012-06-15 
STC单片机从io口模拟uart读入数据保存在数据缓存中,如何然后从串口发出去。#includereg51.h#defineucharu

STC单片机从io口模拟uart读入数据保存在数据缓存中,如何然后从串口发出去。
#include<reg51.h>

#defineuchar unsigned char
#defineuint unsigned int
sbitREST = P2^2;
sbitIO = P2^0;

ucharbuf[25];//数据缓存区
ucharSendBuf_1[23]={0x80,0x08,0x00,0x00,0x12,0x01,0x01,0x02,
0x03,0x04,0x05,0x06,0x07,0x08,0x08,0x11,
0x22,0x33,0x44,0x55,0x66,0x77,0x88};

ucharSendBuf_2[5]={0x00,0xc0,0x00,0x00,0x08};

/*****************用于微调发送接收的时间**************/
void Delay()
{
uchari;
for(i=0;i<3;i++);
}

/*********************发送接收一位的时间 etu=3.579/372 = 104us*************
***************因发送接收其它指令也要占用时间这里的DelayEtu = 90us********/
void Delay_100us()
{
uchar i;
for(i=0;i<28;i++);
}

/*****************上电发送复位请求******************/
void Rest()
{
Delay() ;
IO = 1; //必须为高等待接收LKT加密芯片发送的起始位
REST = 0;
Delay_100us();
REST = 1; 


/****************读取LTK4101的返回信息并将其存入数据缓存区****************/
void ReceArt(char m)  
{
uchar i,n;

for(n=0;n<m;n++)
{
while(IO);
for(i=0;i<8;i++) //读一个字节函数 
{
Delay_100us();
buf[n] >>= 1;
if(1 == IO)
buf[n] |= 0x80;
}
Delay_100us();
ACC = buf[n];  
if(IO == P) //判断偶校验位
{
Delay_100us();
Delay_100us();
}
}

}

/****************发送随机数命令信息***************/

void SendChar(uchar m,uchar Send[])
{
  uchar i,n,flag,SendChar;

for(n = 0 ;n<m ; n++)
{
ACC = Send[n] ;
flag = P;
SendChar = Send[n]; //将发送的字节放在SendChar
IO = 0;
for(i=0;i<8;i++) //发送一个字节
{
Delay_100us();
if(SendChar & 0x01)
IO = 1;
else
IO = 0;
SendChar >>=1;
}
Delay_100us();
IO = flag; //发送保存的奇偶位
Delay_100us();
IO = 1; //发送停止位
Delay_100us();
Delay_100us();
}


void main()
{
uchar temp;
temp = SendBuf_1[1]; //保存所发送第二字节
Rest();
ReceArt(17); //必须接收完或延时足够长(大于LKT加密芯片向MCU传送返回信息的时间)才能向LKT加密芯片发送数据
Delay_100us();
SendChar(5,SendBuf_1);//根据T=0协议先向LKT加密芯片发送前5字节,LKT加密芯片应返回第二字节
ReceArt(1);
if(buf[0] == temp)//判断是否返回第二字节,返回正确发送剩下的字节
{

SendChar(18,&SendBuf_1[5]);
ReceArt(2);

}  
if(buf[0]==0x61 && buf[1] ==0x08 ); //判断应答位是否正确
SendChar(5,SendBuf_2) ; //应答正确发送读取数据信息
ReceArt(10);
while(1);
}

STC单片机从io口模拟uart读入经过处理的数据保存在数据缓存中,如何然后从串口发出去。???????我把main函数中改成:
 main()
{
.......
ReceArt(10);
while(1)
{
i=0;
while(i<=9)
{
SBUF=buf[i];
i=i+1;
while(!TI);
TI=0;
}
}
}
串口没输出。急求解???????????



[解决办法]
首先判断是否接收到字符串;
其次判断串口能否正确输出指定的字符串。
[解决办法]

探讨
1、单片机能接收到字符串,存放在unsigned char buf[25]数据缓冲中,但是我很纳闷,因为加密芯片加密后返回的数据是16进制的,然后呢buf[25]是unsigned char型,不知道这样会不会有问题。
2、我把加密芯片返回的数据(16进制的)直接发送到串口上,出现乱码。是不是在发送到串口之前好把16进制数据转换成字符串?

[解决办法]
探讨
1、单片机能接收到字符串,存放在unsigned char buf[25]数据缓冲中,但是我很纳闷,因为加密芯片加密后返回的数据是16进制的,然后呢buf[25]是unsigned char型,不知道这样会不会有问题。
2、我把加密芯片返回的数据(16进制的)直接发送到串口上,出现乱码。是不是在发送到串口之前好把16进制数据转换成字符串?

------解决方案--------------------


其次判断串口能否正确输出指定的字符串。


[解决办法]
串口调试助手的接收要设置为16进制显示才能看到1122334455667788。能看到B字符,是因为接收是字符显示,下面的11,22,33...是16进制数,字符是乱码或者没显示。

热点排行