找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15877|回复: 24
收起左侧

51串口多字节发送与接收问题

  [复制链接]
回帖奖励 120 黑币 回复本帖可获得 10 黑币奖励! 每人限 1 次
ID:77578 发表于 2015-8-28 14:16 | 显示全部楼层 |阅读模式
在写一个串口接受多字节的一个程序时遇到了一个问题,我写程序使52单片机以9600波特率接受串口助手发送来的12个字节,然后再发回去,但是在程序启动时,单片机第一次收到数据并发回,发现在发回的数据中第一个字节变成了FF,而第12个字节丢失,第二次发送便正常了,这是为什么? {DS6TCZUQ$QLZ0$C1)))0]9.png 下面是我的程序
/*
串口发送多字节
for循环发送
*////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char flag,a,i,b;//串口接受标识,接受的数据,
//uchar code table[]="I get";//定义发送数组
uchar table1[12]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void lnit()//初始化
{
        TMOD=0x20;//设置工作方式
        TH1=0xfd;//设置初值
        TL1=0xfd;
        TR1=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;//开总中断
        ES=1;//开串口中断
}
void main()
{
        lnit();
        while(1)
        {
                if(flag==1)//当接收到数据
                {
                        ES=0;//关闭串口中断
                        for(i=0;i<12;i++)
                        {
                                SBUF=table1[ i];
                                while(!TI);
                                TI=0;
                        }
                        //SBUF=a;
                        //while(!TI);
                //        TI=0;
                        ES=1;
                        b=0;
                        flag=0;
                }
        }
}
void ser()interrupt 4
{
                table1=SBUF;
                while(!RI);
                RI=0;
                b++;
                if(b==12)
                        flag=1;
        
}

评分

参与人数 1黑币 +10 收起 理由
螺旋丸 + 10

查看全部评分

回复

使用道具 举报

ID:18297 发表于 2017-10-9 14:43 | 显示全部楼层
本帖最后由 zjjhtony 于 2017-10-9 14:47 编辑

请看压缩包 aking.rar (30.76 KB, 下载次数: 59)
123.jpg
222.jpg
111.jpg

评分

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

查看全部评分

回复

使用道具 举报

ID:77578 发表于 2015-8-28 20:27 | 显示全部楼层
没人回复,自顶
回复

使用道具 举报

ID:76227 发表于 2015-8-29 14:51 | 显示全部楼层

回帖奖励 +10 黑币

在中断里面接收到数据之后马上发送看看  不要设置flag标志位  你看看结果是不是正确的
回复

使用道具 举报

ID:89092 发表于 2015-8-30 14:28 | 显示全部楼层

回帖奖励 +10 黑币

51串口常於power on第一次傳送时常会發生資料錯誤, 所以, 建議power on時, 可以要求51串口, 傳任意資料, 之後, 才開始接收資料....
回复

使用道具 举报

ID:89101 发表于 2015-8-30 18:49 | 显示全部楼层

回帖奖励 +10 黑币

从调试方法上来说,先单个字节发送,然后在多个字节发送
回复

使用道具 举报

ID:89481 发表于 2015-9-6 11:53 | 显示全部楼层

回帖奖励 +10 黑币

在中断里面接收到数据之后马上发送看看  不要设置flag标志位  你看看结果是不是正确的
回复

使用道具 举报

ID:89738 发表于 2015-9-9 21:02 | 显示全部楼层

回帖奖励 +10 黑币

这个问题我也遇到过,有时候也自己就正常了
回复

使用道具 举报

ID:89750 发表于 2015-9-9 22:05 | 显示全部楼层

回帖奖励 +10 黑币

是不是缓冲区里有上次发送的数据导致乱码。。
回复

使用道具 举报

ID:89053 发表于 2015-9-10 10:52 | 显示全部楼层

回帖奖励 +10 黑币

发送的数据回传么,接收到一个字节进入接收中断后,直接发送,
回复

使用道具 举报

ID:225054 发表于 2017-10-8 09:30 来自手机 | 显示全部楼层
我感觉要先设置串口工作方式后在允许串口发送数据
回复

使用道具 举报

ID:219796 发表于 2017-10-8 18:47 来自手机 | 显示全部楼层
init加flag=0试试
回复

使用道具 举报

ID:237965 发表于 2017-10-9 12:14 | 显示全部楼层
建议接收到数据后delay 一下,再发送数据。先调试发送一个BYTE成功后再调试发送接收多个BYTE。
回复

使用道具 举报

ID:111634 发表于 2017-10-9 15:21 | 显示全部楼层

回帖奖励 +10 黑币

老贴不回了
回复

使用道具 举报

ID:238024 发表于 2017-10-9 16:01 | 显示全部楼层
第一次单片机也是接收12个字节, 只不过第一个字节是FF,楼主可以重点分析这个FF是从哪来的
回复

使用道具 举报

ID:238036 发表于 2017-10-9 16:08 | 显示全部楼层
同样问题同求
回复

使用道具 举报

ID:238225 发表于 2017-10-10 11:40 | 显示全部楼层
ser中断有问题,里面判断RI==1就清RI=0,接收SBUF,退出中断;如果RI==0直接退出
回复

使用道具 举报

ID:238225 发表于 2017-10-10 11:47 | 显示全部楼层
SER中断有问题,判断到RI==0马上退出;RI==1才接收SBUF,清RI
回复

使用道具 举报

ID:237939 发表于 2017-10-10 15:38 | 显示全部楼层
1:你的代码没有任何容错。你既然用0d开头,那你就要检查一下0d,或者插入两到三个无意义的数据作为头。同时加入长度域和校验值。
2:出现ff的可能有两种情况,发送出错或接收出错。
起始位为逻辑0,那么不发送的时候最好是逻辑1.你开始初始化pc机或者单片机的时候,pc机或单片机在初始化之前他的状态不是rs232协议,单片机很多时候口是复用的,有可能开始收到或发送的就会错。这个很好解释。
3:你的代码计数到12,所以多了个ff,自然少了最后一个,这个很正常,这就是为啥我建议你加校验和头,长度的原因。
4:这种代码风格出错是正常的,不错才不正常。
回复

使用道具 举报

ID:237939 发表于 2017-10-10 15:42 | 显示全部楼层
4:在中断里加while(!ri)这样的语句,是巴不得系统死掉的写法。应该用if(ri==0) {再查下为啥进中断居然不置位,然后清掉,return;} 这样才是王道
回复

使用道具 举报

ID:94867 发表于 2017-12-27 19:09 | 显示全部楼层
谢谢讲解
回复

使用道具 举报

ID:267947 发表于 2017-12-27 19:49 | 显示全部楼层
可能是中断问题
回复

使用道具 举报

ID:404720 发表于 2018-11-26 15:04 | 显示全部楼层
请问现在解决了吗?求
回复

使用道具 举报

ID:433533 发表于 2018-11-26 16:35 | 显示全部楼层
进入中断时候,先判断RI是否等于1,然后在把sbuf的数据放入数组中
回复

使用道具 举报

ID:338173 发表于 2018-11-27 19:52 | 显示全部楼层
要有帧头 帧尾 我写过两个单片机蓝牙通信的程序。你加上帧头 帧尾就行了,再有校验位的话,基本万无一失。这个代码虽然不难 但是想了好久 分享一下
QQ截图20181127195125.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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