找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3280|回复: 15
收起左侧

stc8a8串口接收不稳定怎么办?丢字节 求助大佬

[复制链接]
ID:370473 发表于 2020-5-31 13:55 | 显示全部楼层 |阅读模式
stc8a8k64a4s12 接收丢字 求助

main
#include "h.h"


extern char rrec[50];
extern count;



unsigned char Data_compare(unsigned char *p)
{
    if(strstr(rrec,p)!=NULL)
            return 1;
         else
                  return 0;
}

void main(){
        
init();
uartinit();        
        
lcddisplay(2,0,"hello uart test ");
lcddisplay(1,0,"STC 8A8K64S4A12 ");
        

while(1){
        
if(Data_compare("AT")==1){Uart1SendStr("ok\n",strlen("ok\n")); lcd1602clean(' ');}
else
memset(rrec, 0, 50);count=0;
lcddisplay(1,0,rrec);
delay_us(2);

if(P53==0)
{lcd1602clean(' ');Uart1SendStr("cl\n",strlen("cl\n"));}


}
        
}


uart

#include "uart.h"

char rrec[lenth];
int count=0;


void uartinit()//1000000bps
{
        

        SCON = 0x50;                //8???,?????
        AUXR |= 0x40;                //???1???Fosc,?1T
        AUXR &= 0xFE;                //??1?????1???????
        TMOD &= 0x0F;                //?????1?16???????
        TL1 = 0xFA;                //??????
        TH1 = 0xFF;                //??????
        ET1 = 0;                //?????1??
        TR1 = 1;                //?????1
  ES  = 1;   
  EA  = 1;         
}  


void uart()interrupt 4
{ uartrec();}
        

void uartrec(){
unsigned char rec;        
        if(RI){RI=0;
        rec=SBUF;
        rrec[count] = SBUF;
                count++;
        if(count>lenth) count = 0;
        }
}
        


void uartsend(unsigned char dat)
{
        if(TI){TI=0;}
        SBUF=dat;
        while(!TI);
        TI=0;
}


void Uart1SendStr(unsigned char *str ,unsigned char len)
{
        while(len--)
        {
                uartsend(*str);
                str++;
        }
}

uart+1602.rar

66.68 KB, 下载次数: 6

回复

使用道具 举报

ID:370473 发表于 2020-5-31 14:06 | 显示全部楼层
void UartInit(void)                //1000000bps@24.000MHz {         SCON = 0x50;                //8位数据,可变波特率         AUXR |= 0x40;                //定时器1时钟为Fosc,即1T         AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器         TMOD &= 0x0F;                //设定定时器1为16位自动重装方式         TL1 = 0xFA;                //设定定时初值         TH1 = 0xFF;                //设定定时初值         ET1 = 0;                //禁止定时器1中断         TR1 = 1;                //启动定时器1 }
回复

使用道具 举报

ID:370473 发表于 2020-5-31 14:06 | 显示全部楼层
#include "h.h"   extern char rrec[50]; extern count;    unsigned char Data_compare(unsigned char *p) {      if(strstr(rrec,p)!=NULL)             return 1;          else                   return 0; }  void main(){          init(); uartinit();                  lcddisplay(2,0,"hello uart test "); lcddisplay(1,0,"STC 8A8K64S4A12 ");           while(1){          if(Data_compare("AT")==1){Uart1SendStr("ok\n",strlen("ok\n")); lcd1602clean(' ');}  else memset(rrec, 0, 50);count=0; lcddisplay(1,0,rrec); delay_us(2);    if(P53==0)  {lcd1602clean(' ');Uart1SendStr("cl\n",strlen("cl\n"));}   }          }
回复

使用道具 举报

ID:299519 发表于 2020-5-31 15:15 | 显示全部楼层
我觉得8a的串口不如15w的好使。
回复

使用道具 举报

ID:155507 发表于 2020-5-31 18:49 | 显示全部楼层
你的串口是否支持这么高波特率,然后用示波器或者逻辑分析仪抓一下波形,看看时序是否出错,可能是波特率过高,误差超过允许范围所以乱码
回复

使用道具 举报

ID:370473 发表于 2020-5-31 20:25 | 显示全部楼层
myemcu 发表于 2020-5-31 15:15
我觉得8a的串口不如15w的好使。

发现15基本没有这个问题
回复

使用道具 举报

ID:370473 发表于 2020-6-1 22:32 来自手机 | 显示全部楼层
angmall 发表于 2020-5-31 18:49
你的串口是否支持这么高波特率,然后用示波器或者逻辑分析仪抓一下波形,看看时序是否出错,可能是波特率过 ...

两周前同样代码可以完美接收
两周后同样代码就不行了
不知到为啥会这样
回复

使用道具 举报

ID:370473 发表于 2020-6-1 22:34 来自手机 | 显示全部楼层
angmall 发表于 2020-5-31 18:49
你的串口是否支持这么高波特率,然后用示波器或者逻辑分析仪抓一下波形,看看时序是否出错,可能是波特率过 ...

发的对收不对
回复

使用道具 举报

ID:370473 发表于 2020-6-1 22:37 来自手机 | 显示全部楼层
angmall 发表于 2020-5-31 18:49
你的串口是否支持这么高波特率,然后用示波器或者逻辑分析仪抓一下波形,看看时序是否出错,可能是波特率过 ...

店家的hex烧录了也一样的效果
回复

使用道具 举报

ID:370473 发表于 2020-6-2 00:14 | 显示全部楼层
#include"h.h"


extern char rrec[lenth];
extern count;



unsigned char Data_compare(unsigned char *p)
{
    if(strstr(rrec,p)!=NULL)
            return 1;
         else
                  return 0;
}

void main(){
        int a=0;
        init();
uartinit();
       
lcddisplay(2,0,"hello uart test ");
lcddisplay(1,0,"hello uart test ");
while(1){
       
if(Data_compare("cl\n")==1){Uart1SendStr("all right!\n",strlen("all right!\n")); lcd1602clean(' ');}
        Uart1SendStr(rrec,strlen(rrec));
  memset(rrec, 0, 50);count=0;
         for(a=60000;a;a--);
  lcddisplay(1,0,rrec);
  if(P32==0)
{lcd1602clean(' ');Uart1SendStr("cl\n",strlen("cl\n"));}


}
       
}

//一脸懵逼这是旧主函数 其他库没变
//突然就好了
回复

使用道具 举报

ID:370473 发表于 2020-6-2 00:29 | 显示全部楼层
问题发现 我去掉了这个延时for(a=60000;a;a--);
并且 后来加上的延时不合要求
回复

使用道具 举报

ID:383721 发表于 2020-6-2 08:50 | 显示全部楼层
降低波特率试试看,换个定时器做波特率发生器试试看
回复

使用道具 举报

ID:1046027 发表于 2022-9-27 15:18 | 显示全部楼层
myemcu 发表于 2020-5-31 15:15
我觉得8a的串口不如15w的好使。

我发现8系列的串口有问题
回复

使用道具 举报

ID:1034262 发表于 2022-9-28 11:57 | 显示全部楼层
STC8系列速度更快,按理应该更好用的。丢数据基本都是应用的问题,可以使用STC官方的例程测试100万个字节看看,一个也不会错才算通过。我用过STC8的几乎所有型号做产品,都很稳定。特备是4串口的做工控很方便。
回复

使用道具 举报

ID:106977 发表于 2022-9-28 12:49 | 显示全部楼层
芯片很稳定,问题在自己!
回复

使用道具 举报

ID:624769 发表于 2022-9-28 13:29 | 显示全部楼层
在一个有收有发的  程序里, 串口中断里 只开了接收,没有开发送,不丢字是侥幸,丢字才是必然。

说的白话一点, 一个半双工通讯系统中,你不设计一个 如何在发送时 对端设备绝对不会发送的流程的话,丢字是必然的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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