使用Proteus仿真AT89C51的串口时,发送数据正常,可是怎么也接收不到数据吗,怎么回事!

java_lover_ 2010-04-16 08:58:21
我使用串口虚拟软件虚拟了一对物理上连通的串口COM3, COM4,在Proteus里面的COMPIM里面使用的是COM3,在串口调试助手里面使用的是COM4.当单片机给PC的COM4发送数据时,串口调试助手上面正常接收并显示到接收文本框里。
但是,当使用串口调试助手向Proteus里面的虚拟部分发送数据时,Proteus里面没有任何反应,我在Proteus里面使用示波器测量了一下,当PC的串口调试助手向下发送数据时,示波器里面有波形的变化,单片机就是不做任何反应,这个是为什么呢!代码是Copy的网上的!

#include <reg51.h>
#include "type_wb.h"
#include "hd44780.h"
#define BUFFERLEGTH 10
//-----------------------------------------------------------------
void UART_init(); //串口初始化函数
void COM_send(void); //串口发送函数
char str[20]="hello\r\n";

//-------------------------------------------------------------------
void main(void)
{
unsigned char i;
UART_init(); //初始化串口
Init_HD44780();
LCD_puts( 0, 0, "ALL Init 1", 10 );
for(i = 0;i < 10 ;i++)
{
COM_send(); //首先发送一次数据作为测试用
}

while(1);
}


//-------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
// 串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
//初始化串行口和波特率发生器
SCON =0x50; //选择串口工作方式1,打开接收允许
TMOD =0x20; //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfA; //实现波特率9600(系统时钟11.0592MHZ)
PCON = 0x80;
TR1 =1; //启动定时器T1
ET1 =0;
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
}
//------------------------------------------------------------
void COM_send(void)
{
unsigned char point = 0;
for(point=0;point< 20;point++) //连续发送二十位数据 //把缓存区的数据都发送到串口
{
SBUF=str[point];
while(!TI);
TI=0;
}
}
//--------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
// 函数名称: com_interrup()串口接收中断处理函数
// 函数功能: 接收包括起始位'S'在内的十位数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
void com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI) //处理接收中断
{
RI=0; //清除中断标志位
RECEIVR_buffer=SBUF; //接收串口数据
LCD_puts( 1, 0, "data arrive", 11 );
if (RECEIVR_buffer == 's')
{
SCON =0x40; //接收不允许
COM_send(); //发送数据
SCON =0x50; //接收允许
}
}
}
...全文
2708 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
darwinner3 2011-11-06
  • 打赏
  • 举报
回复
我的也差不多。串口助手发送的数据>=8的,可以正常返回。。小的话就全为FF了。。
shutadie 2011-05-09
  • 打赏
  • 举报
回复
我也有同样的问题,依然不懂
java_lover_ 2010-04-17
  • 打赏
  • 举报
回复
已经自行解决,总结经验如下:如果是使用中断函数来处理中断任务,最好不要分配过多的任务,因为在处理任务的时候 数据可能已经来了,要保证每个数据都收到,就少在中断处理函数中写代码。
其次,还是采用中断函数接收的比较好,这样的话,你可以在main的while(1)中处理数据!
afei8856 2010-04-16
  • 打赏
  • 举报
回复
可能是COM口的问题吧

27,382

社区成员

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

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