文锦成 2022-01-28 11:18 采纳率: 50%
浏览 64
已结题

利用51单片机串口发送数据,一次发送6个字节,但就是有时接收到的数据长短不一,这是为什么?

我想用51单片机通过串口发送一系列数据,每次发送6个字节,keil和proteus波特率都是设置的9600,晶振11.0592MHZ,但是用串口调试助手有时接收到的数据长短不一致,有时不是6个字节,结果如下图:

img

keil程序代码:

#include <reg51.h>
unsigned char code MESSAGE[]={
    0x80,0x8C,0x98,0xA5,0xB0,0xBC,0xC7,0xD1,           //正弦数据表
    0xDA,0xE2,0xEA,0xF0,0xF6,0xFA,0xFD,0xFF,
    0xFF,0xFF,0xFD,0xFA,0xF6,0xF0,0xEA,0xE3,
    0xDA,0xD1,0xC7,0xBC,0xB1,0xA5,0x99,0x8C,
    0x80,0x73,0x67,0x5B,0x4F,0x43,0x39,0x2E,
    0x25,0x1D,0x15,0x0F,0x09,0x05,0x02,0x00,
    0x00,0x00,0x02,0x05,0x09,0x0E,0x15,0x1C,
    0x25,0x2E,0x38,0x43,0x4E,0x5A,0x66,0x73
};
unsigned char a;
void delay(unsigned int delaytime)
{
    unsigned char c;
        for(;delaytime!=0;delaytime--)
        for(c=0;c!=124;c++);
}
void main(void)
{
    SCON = 0x50;//设置串行口工作方式1,接收控制打开
    TMOD = 0x20;//定时器1设置工作方式2
    TH1 = 0xFD;//设置波特率为9600,数据位8,停止位1,无校验位,晶振频率11.0592M
    TL1 = 0xFD;
    TR1 = 1;//启动定时器1
        
    while(1)
    {
        a=0;
        while(a!=64)
        {
            SBUF = 0x5A;
                        while(!TI);//等待发送中断标志为1
            TI=0;//清除发送中断标志
                        
                        SBUF = 0x43;
                        while(!TI);//等待发送中断标志为1
            TI=0;//清除发送中断标志
                                    
                        SBUF = 0x48;
                        while(!TI);//等待发送中断标志为1
            TI=0;//清除发送中断标志
                        
                        SBUF = MESSAGE[a];//将一个字符放入串行数据缓冲器SBUF
            while(!TI);//等待发送中断标志为1
            TI=0;//清除发送中断标志
                        
                        SBUF = 0x35;
                        while(!TI);//等待发送中断标志为1
            TI=0;//清除发送中断标志
                        
                        SBUF = 0x35;
                        while(!TI);//等待发送中断标志为1
            TI=0;//清除发送中断标志
                                            
            a++;//准备下一个字符
                        delay(1000);//延时
        }
    }
}

proteus仿真图如下:

img

找了很久都没发现问题,不知道哪里出了问题,想每次都固定发送6个字节的数据,大家帮忙看看

展开全部

  • 写回答

2条回答 默认 最新

  • 老皮芽子 2022-01-29 02:42
    关注

    你的代码没毛病,结果也是正确的
    串口通讯是按字节来的,你发送出去了6个字节,串口助手也接收到了这6个字节,这是正确的。
    只是串口助手没把这6个字节在一行上用一个时间戳显示出来,这是没关系的。是可以忽略的。
    我们做上位机程序时是按字节流来处理这6个字节的,是没问题的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    文锦成 2022-01-31 10:20

    这样啊,感谢

    回复
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 2月21日
  • 已采纳回答 2月14日
  • 创建了问题 1月28日

悬赏问题

  • ¥15 IEd中开关量采样信号通道设计
  • ¥45 字符串操作——数组越界问题
  • ¥15 Loss下降到0.08时不在下降调整学习率也没用
  • ¥15 QT+FFmpeg使用GPU加速解码
  • ¥15 为什么投影机用酷喵播放电影放一段时间就播放不下去了?提示发生未知故障,有什么解决办法吗?
  • ¥15 来个会搭建付费网站的有偿
  • ¥100 有能够实现人机模式的c/c++代码,有图片背景等,能够直接进行游戏
  • ¥20 校园网认证openwrt插件
  • ¥15 以AT89C51单片机芯片为核心来制作一个简易计算器,外部由4*4矩阵键盘和一个LCD1602字符型液晶显示屏构成,内部由一块AT89C51单片机构成,通过软件编程可实现简单加减乘除。
  • ¥15 求GCMS辅导数据分析
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部