找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2016|回复: 3
收起左侧

关于串口传输的一些问题

[复制链接]
ID:128697 发表于 2017-4-15 11:49 | 显示全部楼层 |阅读模式
在使用串口调试软件时,发送数据后会不断重复数据的最后一个字符,如下图。波特率一致,为4800bps,程序如下,我检查了很多次也不知道什么原因,故发帖专心请教。
程序:
#include<reg51.h>
void comsetting();        //串口设置程序

void main()
{
        comsetting();
        while(1)
        {
        }
}

void comsetting()
{
        SCON=0x50;          //串口工作方式1
        TMOD=0x20;          //定时器工作方式2
        PCON=0x80;          //波特率加倍
        TH1=0xf4;          //定时器设置初值,波特率为4800(已加倍)
        TL1=0xf4;
        ES=1;                //允许串行中断
        EA=1;                //打开总中断
        TR1=1;                //打开定时器1
}

void comint() interrupt 4                //中断服务程序
{
        unsigned char rdata; //定义变量为接收的数据receive data
        rdata=SBUF;                         //把接收缓冲器接收的数据赋给变量
        RI=0;                                //接收中断标志,接收结束,硬件自动置1,用软件复位
        SBUF=rdata;                        //把变量的数据赋给发送缓冲器
        while(!TI)                    //等待数据发送完成
        TI=0;                                //发送结束,软件复位
}



调试图片:
1.png

回复

使用道具 举报

ID:128697 发表于 2017-4-15 12:22 | 显示全部楼层
应该是TH1=0xf3;TL1=0xf3
回复

使用道具 举报

ID:123289 发表于 2017-4-16 06:56 | 显示全部楼层
每次串口中断后,你都会从SBUF中取一个数字发出;
收到最后一个时SBUF读到“o”,你发“o”。
注意:串口中断响应是不管收还是发,都会发生中断,所以发完最后一个“o”后,也会生产中断,当然你取到的SBUF一定是上次的SBUF也就是“o”,所以你又发一次“o”,发生后还会再中断(发送中断)……
实际上,当你收到“h”时,在发出“h”后也会产生发送中断,但这个中断不会被立即响应,因为这时程序还在中断服务程序中尚未返回,当你中断返回后,响应发送中断时,接收中断也收到了,新发来了下一个“e”(接收中断与发送中断几乎同时到达),所以你并未再发一次“h”,而是新收到的“e”。也就是说你已丢了一次中断,但丢掉的洽洽是重复的那一个!
读懂以上后,程序修改一下就好了,应当很简单了!

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:500065 发表于 2019-3-28 17:47 | 显示全部楼层
poseidon 发表于 2017-4-15 12:22
应该是TH1=0xf3;TL1=0xf3

TH1=0xf3;TL1=0xf3和TH1=0xf4;TL1=0xf4有什么差别吗!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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