打印

串口助手收不到数据

[复制链接]
7422|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
幻阁|  楼主 | 2010-3-11 18:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位高手帮我看看,为什么能接收串口助手发来的数据,串口助手却收不到回送的数据呢
/////////////////////////////////////
//  Generated Initialization File  //
/////////////////////////////////////
#include "C8051F330.h"
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void PCA_Init()
{
    PCA0MD    &= ~0x40;  //关看门狗
}
void Oscillator_Init()
{
    OSCICN    = 0x83;  //24.5M
}
void Port_IO_Init()
{
     // P0.0  -  Unassigned,  Open-Drain, Digital
    // P0.1  -  Unassigned,  Open-Drain, Digital
    // P0.2  -  Unassigned,  Open-Drain, Digital
    // P0.3  -  Unassigned,  Open-Drain, Digital
    // P0.4  -  TX0 (UART0), Push-Pull,  Digital
    // P0.5  -  RX0 (UART0), Push-Pull,  Digital
    // P0.6  -  Unassigned,  Open-Drain, Digital
    // P0.7  -  Unassigned,  Open-Drain, Digital
    // P1.0  -  Unassigned,  Open-Drain, Digital
    // P1.1  -  Unassigned,  Open-Drain, Digital
    // P1.2  -  Unassigned,  Open-Drain, Digital
    // P1.3  -  Unassigned,  Open-Drain, Digital
    // P1.4  -  Unassigned,  Open-Drain, Digital
    // P1.5  -  Unassigned,  Open-Drain, Digital
    // P1.6  -  Unassigned,  Open-Drain, Digital
    // P1.7  -  Unassigned,  Open-Drain, Digital
    P0MDOUT   = 0x30;
    XBR0      = 0x01;
    XBR1      = 0x40;
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{  Oscillator_Init();
    PCA_Init();
    Port_IO_Init();
}


unsigned char addr=0x01;//从机地址

void init_serial(void)
{SCON0=0xf0;//串口方式3,9位数据位,允许接收数据
TMOD=0x20;//定时器T1工作在方式2
CKCON=0x00;//使用默认的:系统时钟/12
TH1=0x96;//波特率9600
//TL1=0x96;
TR1=1;//计时开始
}
/*
void readRegisters(void)
{
   addr=5;

}
  */
void serial_interrupt (void) interrupt 4
{
   unsigned char temp;
   unsigned char cmd;
   RI0=0;//清接收中断标志
   ES0=0;//关串行中断
   temp=SBUF0;
  if(temp!=addr)
    {ES0=1;goto reti;} //非本机地址,继续监听
   
   TI0=0;
   TB80=0;
   SBUF0=addr;
    while(!TI0); TI0=0;
   MCE0=0;//允许接收数据
   addr=8;//用串手调试助手发送01H,可以运行到此步,但为什么串口助手收不到返回的地址呢?

reti:;  
}     
void main()         
{Init_Device();
init_serial();
ES0=1;//开UART0中断
EA=1;//开总中断
RI0=0;//设置RI0初值
while(1);//原地等待
}

相关帖子

沙发
fover| | 2010-3-11 20:42 | 只看该作者
本帖最后由 fover 于 2010-3-11 20:44 编辑

俺的C是半吊子,当初弄串口时费了很大的劲
俺是一步一步来的
先串口发数据点亮发光二极管,然后单片机收到数据后再往回发,这个时候的程序很简洁,对着串口协议很容易就能发现问题,然后再慢慢写复杂的程序
希望对楼主有帮助,有段时间也是串口收不到返回的数据,最后发现原来是硬件的问题。

使用特权

评论回复
板凳
司徒老鹰| | 2010-3-11 22:01 | 只看该作者
经常发生的事

使用特权

评论回复
地板
幻阁|  楼主 | 2010-3-12 10:31 | 只看该作者
我把程序移植到了STC89c52上,问题依旧,应该不是硬件的问题吧,帮忙看看软件有没有问题啊

使用特权

评论回复
5
awmc_m| | 2010-3-12 13:11 | 只看该作者
软件问题有可能:
1、串口方式不对
2、波特率设置错误
3、中断号不对,或中断初始化错误
4、串口调试助手非16进制发送
5、接收的数据解析错误
6、发送程序错误

使用特权

评论回复
6
928315| | 2010-3-12 15:23 | 只看该作者
没有用过51,,帮忙顶。。

使用特权

评论回复
7
xuezhongaozhu| | 2010-3-12 17:42 | 只看该作者
串口界面不显16进制字符,要按下旁边的HEX才能看到。不过一般不清晰的话都看不懂。。。
建议用sprintf()后再输出。

使用特权

评论回复
8
幻阁|  楼主 | 2010-3-12 18:40 | 只看该作者
这是在STC89c52上的程序,能运行了,但是用C8051F330还是不行,只能接收不能发送,是不是硬件有问题啦

#include "reg52.h"


unsigned char addr=0x01;//从机地址



void init_serial(void)
{SCON=0xf0;//串口方式3,9位数据位,允许接收数据
TMOD=0x20;//定时器T1工作在方式2
PCON=0x00;
TH1=0xfA;//波特率9600
TL1=0xfA;
TR1=1;//计时开始
}
/*
void readRegisters(void)
{
   addr=5;

}

  */

void serial_interrupt (void) interrupt 4
{
   unsigned char temp;
//   unsigned char cmd;
   RI=0;//清接收中断标志
   ES=0;//关串行中断
   temp=SBUF;
  if(temp!=addr)
    {ES=1;
         SBUF=addr+1;
    while(TI!=1); TI=0;       
       
        goto reti;} //非本机地址,继续监听
   SM2=0;//取消监听
   SBUF=addr;
    while(TI!=1); TI=0;       
//        P1=1;
ES=1;
/*  while(!RI0); RI0=0;
  if(RB80==1)                           //接收到地址帧,从机复位
     {MCE0=1;ES0=1;goto reti;}
   cmd=SBUF0;
   switch(cmd)
     {
          case 3:        readRegisters();break;
          default:break;         
         }
   MCE0=1;ES0=1; */
reti:;         

}                          

void main()                                                                               
{//Init_Device();
//P1=0;
init_serial();
// ET1=0;          //关定时器1中断
ES=1;//开UART0中断
EA=1;//开总中断
RI=0;//设置RI0初值
while(1);//原地等待

}

使用特权

评论回复
9
blueice8601| | 2010-3-12 19:53 | 只看该作者
答案同5楼

使用特权

评论回复
10
幻阁|  楼主 | 2010-3-13 20:53 | 只看该作者
问题解决了,原来是C8051的板子有问题

使用特权

评论回复
11
歪 歪| | 2010-3-18 00:09 | 只看该作者
同意
软件问题有可能:
1、串口方式不对
2、波特率设置错误
3、中断号不对,或中断初始化错误
4、串口调试助手非16进制发送
5、接收的数据解析错误
6、发送程序错误

建议用这个现代工具调试,以上问题都可以一步确认,不必再费事查找了。
下载地址:
http://download.cnet.com/ComTrac ... 6892.html?tag=mncol

感觉好别忘了给个review(评论),谢谢!

使用特权

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

本版积分规则

4

主题

25

帖子

0

粉丝