1849|1

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口问题 [复制链接]

    通过串口助手(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从机端程序如果从机号不对的话就不响应,结果也是不能接受新的命令帧了。。
  1. #include "initial.h"
  2. #include <string.h>
  3. typedef unsigned char         byte;

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

  9. main(void)
  10. {
  11.     byte i;       
  12.         byte *ssd;
  13.         rec_ptr = 0;
  14.         received = 0;        
  15.         PCA0MD &= ~0x40;                 // WDTE = 0 关闭看门狗,上电默认打开
  16.     Init();
  17.        
  18.         EA=1;                                                 //允许所有中断
  19.                         
  20.   while(1)
  21.   {               
  22.         while (rec_flag==1)
  23.           {
  24.                 send[0]= rec_bytes;
  25.                 send[1]= 0x00;
  26.                 ssd = send;
  27.             if(receive[0] == 0x34)
  28.                 {
  29.                         for(i=0;i<2;++i)
  30.                         {                                        
  31.                                 SBUF0=*ssd++;
  32.                                 while(TI0==0);
  33.                             TI0=0;
  34.                         }
  35.                 }
  36.         /*        else       
  37.                 {
  38.                         SBUF0=0xff;
  39.                         while(TI0==0);
  40.                     TI0=0;
  41.                 } */
  42.                 rec_flag=0;
  43.         }
  44.   }
  45. }

  46. void uart0(void) interrupt 4
  47. {       
  48.         if(RI0)
  49.         {
  50.             RI0=0;
  51.         receive[rec_ptr++] = SBUF0;         // rec_ptr初始值为0,每接受一个数据便自增1
  52.                
  53.                 if (rec_ptr==3 )
  54.                 {
  55.                         rec_bytes = rec_ptr;
  56.                         rec_ptr = 0;               
  57.                         rec_flag = 1;               
  58.                 }
  59.     }
  60. }
复制代码


此帖出自单片机论坛

最新回复

过来看看~~~~~~~~~~~  详情 回复 发表于 2014-7-1 15:51
点赞 关注
 

回复
举报

1119

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
过来看看~~~~~~~~~~~
此帖出自单片机论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表