找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 4315|回復(fù): 15
收起左側(cè)

stc8a8串口接收不穩(wěn)定怎么辦?丟字節(jié) 求助大佬

[復(fù)制鏈接]
ID:370473 發(fā)表于 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, 下載次數(shù): 6

回復(fù)

使用道具 舉報

ID:370473 發(fā)表于 2020-5-31 14:06 | 顯示全部樓層
void UartInit(void)                //1000000bps@24.000MHz {         SCON = 0x50;                //8位數(shù)據(jù),可變波特率         AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發(fā)生器         TMOD &= 0x0F;                //設(shè)定定時器1為16位自動重裝方式         TL1 = 0xFA;                //設(shè)定定時初值         TH1 = 0xFF;                //設(shè)定定時初值         ET1 = 0;                //禁止定時器1中斷         TR1 = 1;                //啟動定時器1 }
回復(fù)

使用道具 舉報

ID:370473 發(fā)表于 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"));}   }          }
回復(fù)

使用道具 舉報

ID:299519 發(fā)表于 2020-5-31 15:15 | 顯示全部樓層
我覺得8a的串口不如15w的好使。
回復(fù)

使用道具 舉報

ID:155507 發(fā)表于 2020-5-31 18:49 | 顯示全部樓層
你的串口是否支持這么高波特率,然后用示波器或者邏輯分析儀抓一下波形,看看時序是否出錯,可能是波特率過高,誤差超過允許范圍所以亂碼
回復(fù)

使用道具 舉報

ID:370473 發(fā)表于 2020-5-31 20:25 | 顯示全部樓層
myemcu 發(fā)表于 2020-5-31 15:15
我覺得8a的串口不如15w的好使。

發(fā)現(xiàn)15基本沒有這個問題
回復(fù)

使用道具 舉報

ID:370473 發(fā)表于 2020-6-1 22:32 來自手機 | 顯示全部樓層
angmall 發(fā)表于 2020-5-31 18:49
你的串口是否支持這么高波特率,然后用示波器或者邏輯分析儀抓一下波形,看看時序是否出錯,可能是波特率過 ...

兩周前同樣代碼可以完美接收
兩周后同樣代碼就不行了
不知到為啥會這樣
回復(fù)

使用道具 舉報

ID:370473 發(fā)表于 2020-6-1 22:34 來自手機 | 顯示全部樓層
angmall 發(fā)表于 2020-5-31 18:49
你的串口是否支持這么高波特率,然后用示波器或者邏輯分析儀抓一下波形,看看時序是否出錯,可能是波特率過 ...

發(fā)的對收不對
回復(fù)

使用道具 舉報

ID:370473 發(fā)表于 2020-6-1 22:37 來自手機 | 顯示全部樓層
angmall 發(fā)表于 2020-5-31 18:49
你的串口是否支持這么高波特率,然后用示波器或者邏輯分析儀抓一下波形,看看時序是否出錯,可能是波特率過 ...

店家的hex燒錄了也一樣的效果
回復(fù)

使用道具 舉報

ID:370473 發(fā)表于 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"));}


}
       
}

//一臉懵逼這是舊主函數(shù) 其他庫沒變
//突然就好了
回復(fù)

使用道具 舉報

ID:370473 發(fā)表于 2020-6-2 00:29 | 顯示全部樓層
問題發(fā)現(xiàn) 我去掉了這個延時for(a=60000;a;a--);
并且 后來加上的延時不合要求
回復(fù)

使用道具 舉報

ID:383721 發(fā)表于 2020-6-2 08:50 | 顯示全部樓層
降低波特率試試看,換個定時器做波特率發(fā)生器試試看
回復(fù)

使用道具 舉報

ID:1046027 發(fā)表于 2022-9-27 15:18 | 顯示全部樓層
myemcu 發(fā)表于 2020-5-31 15:15
我覺得8a的串口不如15w的好使。

我發(fā)現(xiàn)8系列的串口有問題
回復(fù)

使用道具 舉報

ID:1034262 發(fā)表于 2022-9-28 11:57 | 顯示全部樓層
STC8系列速度更快,按理應(yīng)該更好用的。丟數(shù)據(jù)基本都是應(yīng)用的問題,可以使用STC官方的例程測試100萬個字節(jié)看看,一個也不會錯才算通過。我用過STC8的幾乎所有型號做產(chǎn)品,都很穩(wěn)定。特備是4串口的做工控很方便。
回復(fù)

使用道具 舉報

ID:106977 發(fā)表于 2022-9-28 12:49 | 顯示全部樓層
芯片很穩(wěn)定,問題在自己!
回復(fù)

使用道具 舉報

ID:624769 發(fā)表于 2022-9-28 13:29 | 顯示全部樓層
在一個有收有發(fā)的  程序里, 串口中斷里 只開了接收,沒有開發(fā)送,不丟字是僥幸,丟字才是必然。

說的白話一點, 一個半雙工通訊系統(tǒng)中,你不設(shè)計一個 如何在發(fā)送時 對端設(shè)備絕對不會發(fā)送的流程的話,丟字是必然的。
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表