打印
[51单片机]

求帮忙解决C8051串口问题

[复制链接]
1345|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
urak|  楼主 | 2014-7-1 15:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    通过串口助手(9600-8-0-1)发送三个字节,如果首字节为0x34,则返回两个字节0x03、0x00,继续等待接受新输入;如果首字节不是0x34,则不作应答,等待接受新输入。调试发现如果连续手动输入34 01 02返回结果正确,可一旦输入首字节不是34(如01 02 03),则再输入34 01 02也没有反应了。通过观察窗发现最后输的34 01 02没有被读进数组receive。然后加入else那一段,即首字节不是34的话就返回ff,这样两种情况都正常返回,且可以连续输入。看上去好像要再接受字符的话必须要先发送字符?没道理啊,请各位帮帮忙。
    我用的是C8051F310。本来是在编modbus从机端程序如果从机号不对的话就不响应,结果也是不能接受新的命令帧了。。

#include "initial.h"
#include <string.h>
typedef unsigned char         byte;

byte send[20];        //用于存放发送的数据,最大ModBus帧是256字节
byte receive[20];     //用于存放接收的数据
byte rec_ptr;          //用于给接收到的数据编号
byte rec_flag;         //rec_flag=1时表示已接收到一帧数据,对数据帧解析完rec_flag被置为0
byte rec_bytes;        //接收的字节数  

main(void)
{
    byte i;       
        byte *ssd;
        rec_ptr = 0;
        rec_flag= 0;        
        PCA0MD &= ~0x40;                 // WDTE = 0 关闭看门狗,上电默认打开
    Init();
       
        EA=1;                                                 //允许所有中断
                        
  while(1)
  {               
        while (rec_flag==1)
          {
                send[0]= rec_bytes;
                send[1]= 0x00;
                ssd = send;
            if(receive[0] == 0x34)
                {
                        for(i=0;i<2;++i)
                        {                                        
                                ACC = *ssd;
                            TB80 = ~P;
                                SBUF0=*ssd++;
                                while(TI0==0);
                            TI0=0;
                        }
                }
        /*        else       
                {
                        ACC = *xFF;
          TB80 = ~P;
                        SBUF0=0xFF;
                        while(TI0==0);
                    TI0=0;
                } */
                rec_flag=0;
        }
  }
}

void uart0(void) interrupt 4
{       
        if(RI0)
        {
            RI0=0;
        receive[rec_ptr++] = SBUF0;         // rec_ptr初始值为0,每接受一个数据便自增1
               
                if (rec_ptr==3 )
                {
                        rec_bytes = rec_ptr;
                        rec_ptr = 0;               
                        rec_flag = 1;               
                }
    }
}

相关帖子

沙发
ayb_ice| | 2014-7-1 16:19 | 只看该作者
牛人一个,
这样用ACC

使用特权

评论回复
板凳
cdf1214| | 2015-3-28 16:50 | 只看该作者
本公司主营TI. NXP. IR. ON. SiLicon                                                                                                       等著名世界品牌产品。
MSP430F一系列TI储存芯片 微控处理器
MSP430F149IPMR MSP430F5438AIPZR MSP430F5438IPZR等。
C8051F 一系列SILICON 单片机 微控处理器
C8051F020 C8051F120 C8051F340 C8051F040等
LPC一系列NXP单片机  
LPC2132FBD64 LPC2134FBD64 LPC2214FBD144  
LPC2378FBD144 LPC2292FBD144等一系列供应
专营:低压差 基准源 三 五 七端稳压 二三极管 场效应 快恢复 肖特基二极管 可控硅 达林顿 整流桥 TVS管 光藕 MAX AD 集成电路
                   北京长实拓展电子销售:陈冬锋
                                     QQ:2850327057
                      电话:15711002528,13641144498

使用特权

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

本版积分规则

2

主题

3

帖子

0

粉丝