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

wzw12315 2012-05-22 03:16:18
#include<reg51.h>

#define uchar unsigned char
#define uint unsigned int
sbit REST = P2^2;
sbit IO = P2^0;

uchar buf[25]; //数据缓存区
uchar SendBuf_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} ;

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

/*****************用于微调发送接收的时间**************/
void Delay()
{
uchar i;
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;
}
}
}
串口没输出。急求解???????????

...全文
647 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
流水源 2012-05-29
  • 打赏
  • 举报
回复
串口调试助手的接收要设置为16进制显示才能看到1122334455667788。能看到B字符,是因为接收是字符显示,下面的11,22,33...是16进制数,字符是乱码或者没显示。
dsoyy 2012-05-25
  • 打赏
  • 举报
回复
其次判断串口能否正确输出指定的字符串。

wzw12315 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
首先判断是否接收到字符串;
其次判断串口能否正确输出指定的字符串。
[/Quote]已经能准确判断加密芯片返回的数据是正确的,我是用下面的程序判断的:
.........
ReceArt(10); //芯片加密后返回在数据,存放在buf数据缓冲中
if(buf[0]==0x11 && buf[1] ==0x22 && buf[2]==0x33&&buf[3]==0x44
&& buf[4]==0x55 && buf[5]==0x66 && buf[6]==0x77 && buf[7]==0x88&& buf[8]==0x90 && buf[9]==0x00);
{
a=0;
while(a<=9)
{
SBUF = 'B'; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
a++; // 下一个字符
}
}
while(1);
}
这样后串口输出正常的字符,这样的话,就可以判断单片机接收的数据是正确的;但是当我试图将单片机接收的数据(16进制的)直接输出到串口,却发现串口输出的数据不对。是不是要把16进制的转换成字符再输出到串口才正确的? 我的程序是这样的:
ReceArt(10); //芯片加密后返回在数据,存放在buf数据缓冲中
if(buf[0]==0x11 && buf[1] ==0x22 && buf[2]==0x33&&buf[3]==0x44
&& buf[4]==0x55 && buf[5]==0x66 && buf[6]==0x77 && buf[7]==0x88&& buf[8]==0x90 && buf[9]==0x00);
{
a=0;
while(a<=9)
{
SBUF =buf[a]; //SUBF接受/发送缓冲器(又叫串行通信特殊功能寄存器)
while(!TI); // 等特数据传送 (TI发送中断标志)
TI = 0; // 清除数据传送标志
a++; // 下一个字符
}
}
while(1);
}
串口的输出不是1122334455667788了,哪里的问题?
dsoyy 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
1、单片机能接收到字符串,存放在unsigned char buf[25]数据缓冲中,但是我很纳闷,因为加密芯片加密后返回的数据是16进制的,然后呢buf[25]是unsigned char型,不知道这样会不会有问题。
2、我把加密芯片返回的数据(16进制的)直接发送到串口上,出现乱码。是不是在发送到串口之前好把16进制数据转换成字符串?
[/Quote]

1、16进制接收到的数据可以把发送的字符串自己转换成16进制,二者对比,判断是接收部分是否正确。
2、需要转换为字符串在发送。

其实可以认为的将发送的字符串写成“teststring”,看看接收的是什么,可以验证发送部分是否正确。

这样接收部分和发送部分都能独立验证对不对,再出问题就是数据中转的处理问题了。
dceacho 2012-05-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
1、单片机能接收到字符串,存放在unsigned char buf[25]数据缓冲中,但是我很纳闷,因为加密芯片加密后返回的数据是16进制的,然后呢buf[25]是unsigned char型,不知道这样会不会有问题。
2、我把加密芯片返回的数据(16进制的)直接发送到串口上,出现乱码。是不是在发送到串口之前好把16进制数据转换成字符串?
[/Quote]

不涉及计算比较大小等,就不用管他什么类型,是什么数就发什么数,发送到串口出现乱码应该是有其他原因,另外如果有硬件资源最好不要用软件模拟UART来接收
wzw12315 2012-05-22
  • 打赏
  • 举报
回复
1、单片机能接收到字符串,存放在unsigned char buf[25]数据缓冲中,但是我很纳闷,因为加密芯片加密后返回的数据是16进制的,然后呢buf[25]是unsigned char型,不知道这样会不会有问题。
2、我把加密芯片返回的数据(16进制的)直接发送到串口上,出现乱码。是不是在发送到串口之前好把16进制数据转换成字符串?
dsoyy 2012-05-22
  • 打赏
  • 举报
回复
首先判断是否接收到字符串;
其次判断串口能否正确输出指定的字符串。

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧