OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5265|回复: 1

串口时灵时不灵求助

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2014-7-1
在线时间
0 小时
发表于 2014-7-1 15:21:02 | 显示全部楼层 |阅读模式
5金钱
       通过串口助手(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从机端程序如果从机号不对的话就不响应,结果也是不能接受新的命令帧了。。
[mw_shl_code=c,true]#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; } } } [/mw_shl_code]



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-7-1 23:34:37 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 03:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表