欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2779|回復(fù): 6
收起左側(cè)

新手疑惑 關(guān)于C51單片機(jī)串口通訊的問(wèn)題,挺急的在線等

[復(fù)制鏈接]
ID:379876 發(fā)表于 2018-7-31 23:08 | 顯示全部樓層 |閱讀模式
50黑幣
各位好,本人由于剛剛接觸51單片機(jī),在學(xué)習(xí)串口通訊中遇到了困難,

{~}]@@8K`T7{0QJAWV]A8{8.png

問(wèn)題是:
由串口助手輸入字符串后,再返回到串口助手上的字符串卻有丟失,丟失的特點(diǎn)為,間隔丟失。
自己的理解:
函數(shù)中有比較函數(shù) strstr(),輸入ready后,可以繼續(xù)運(yùn)行(led會(huì)滅)
所以rec數(shù)組所存的是輸入串口助手中的字符串,但顯示出來(lái)卻是“ray”,
應(yīng)該是send_str()函數(shù)有問(wèn)題,但找不出原因。

請(qǐng)求老手指點(diǎn)!不勝感激!!
由于是新手,如果能夠解釋得清楚一些就更好了!
下面是我的源碼:
  1. #include "reg52.h"
  2. #include   <string.h>
  3. #include   <stdio.h>
  4. #include   <stdlib.h>
  5. #include   <intrins.h>

  6. typedef unsigned char u8;
  7. typedef unsigned int u16;

  8. sbit LED=P2^0;

  9. u8 rec_ct=0;                        //記錄接收數(shù)據(jù)的位數(shù)
  10. u8 rec_flag=0;                        //接收完成標(biāo)志
  11. u8 rec[10];                                //定義一個(gè)數(shù)組

  12. void delay3s(void)      //延時(shí)3s,誤差 0us
  13. {
  14.     unsigned char a,b,c;
  15.     for(c=254;c>0;c--)
  16.         for(b=96;b>0;b--)
  17.             for(a=60;a>0;a--);
  18.     _nop_();  //if Keil,require use intrins.h
  19. }

  20. void delay500ms(void)   //延時(shí)0.5s,誤差 0us
  21. {
  22.     unsigned char a,b,c;
  23.     for(c=205;c>0;c--)
  24.         for(b=116;b>0;b--)
  25.             for(a=9;a>0;a--);
  26. }



  27. void UsartInit()                //串口初始化
  28. {
  29. SCON=0x50;                        //串口設(shè)置
  30. TMOD=0X20;                        //T1計(jì)數(shù)器設(shè)置
  31. PCON=0x80;                        //倍增打開(kāi)
  32. TH1=0xf3;
  33. TL1=0xf3;                        //波特率設(shè)為4800;
  34. EA=1;                                //IE設(shè)置
  35. ES=1;
  36. TR1=1;                                //開(kāi)始計(jì)數(shù)
  37. }


  38. void send_str()                        //發(fā)送接收到的字符串
  39. {
  40. u8 i;
  41. for(i=0;i<10;i++)
  42. {
  43.   SBUF=rec[i];
  44.   while(!TI);
  45.   TI=0;
  46.   i++;
  47. }
  48. }



  49. void Ustar() interrupt 4
  50. {
  51. if(RI==1)
  52. {
  53.   RI=0;
  54.   rec[rec_ct]=SBUF;                        //接收串口數(shù)據(jù)
  55.   rec_ct++;
  56.   if(rec_ct==10) rec_ct=0;        //防止溢出
  57.   rec_flag = 1;
  58. }
  59. }


  60. void main()
  61. {
  62. u8 ct;
  63. UsartInit();

  64. start:

  65.          ct = 0;
  66.         while(1)
  67.         {        
  68.                 LED=0;                              //這個(gè)燈作為指示燈
  69.                 delay3s();                          //等待3S
  70.                 if(rec_flag == 1)                   //串口接收到數(shù)據(jù)
  71.                 {
  72.             rec_flag = 0;
  73.                         send_str();                                                //發(fā)送接收到的字符串
  74.                         if(strstr(rec, "ready"))        //有沒(méi)有ready
  75.                         {
  76.                                 P2 = 0xff;                   //接收到正確的回復(fù)就滅
  77.                                 delay500ms();
  78.                                 break;
  79.                         }
  80.         }
  81.                 ct ++;
  82.                 if(ct>=3) goto start;               //超過(guò)三次重新開(kāi)始     
  83.   }
  84.   while(1);
  85. }



復(fù)制代碼




最佳答案

查看完整內(nèi)容

你的send_str函數(shù)里面已經(jīng)在for循環(huán)里將i++了,然后你TI = 0;后依然i++。檢查一下。 void send_str(void) //發(fā)送接收到的字符串 { u8 i; for(i=0; i
回復(fù)

使用道具 舉報(bào)

ID:221865 發(fā)表于 2018-7-31 23:08 | 顯示全部樓層
你的send_str函數(shù)里面已經(jīng)在for循環(huán)里將i++了,然后你TI = 0;后依然i++。檢查一下。
void send_str(void)                        //發(fā)送接收到的字符串
{
    u8 i;
    for(i=0; i<10; i++)
    {
        TI = 0;
        SBUF=rec[i];
        while(!TI);
        TI = 0;
    }
}
回復(fù)

使用道具 舉報(bào)

ID:375003 發(fā)表于 2018-8-1 01:21 | 顯示全部樓層
把發(fā)送也要寫到中斷里,不能這樣寫
回復(fù)

使用道具 舉報(bào)

ID:375003 發(fā)表于 2018-8-1 01:22 | 顯示全部樓層
象這樣寫.
void intSIO() interrupt 4 using 2
{
if(TI){
  TI=OFF;
  if(bSD){
   if(curSND<lenSND) SBUF=bufSND[curSND++];
   else {bSD=OFF;/*mSI=0;*/}}}
if(RI){
  RI=OFF;
  bufRCV[putRCV++]=SBUF;
  putRCV &= 0X07;}
}
回復(fù)

使用道具 舉報(bào)

ID:379876 發(fā)表于 2018-8-1 07:38 | 顯示全部樓層
那請(qǐng)問(wèn)將發(fā)送寫入中斷后,如何觸發(fā)TI=1的條件呢?如果不能觸發(fā)TI=1就不能將數(shù)據(jù)寫入SBUF,而數(shù)據(jù)沒(méi)有寫入SBUF,就無(wú)法觸發(fā)TI=1的條件,這是個(gè)死循環(huán)啊。。。。。。 我的理解是這樣的
回復(fù)

使用道具 舉報(bào)

ID:381546 發(fā)表于 2018-8-1 09:39 | 顯示全部樓層
void intSIO() interrupt 4 using 2
{
    if(TI)
    {
        TI=OFF;
        if(bSD)
        {
        if(curSND<lenSND) SBUF=bufSND[curSND++];
       else {bSD=OFF;/*mSI=0;*/}}}
      if(RI){
         RI=OFF;
          bufRCV[putRCV++]=SBUF;
            putRCV &= 0X07;}
}
回復(fù)

使用道具 舉報(bào)

ID:379876 發(fā)表于 2018-8-2 08:21 | 顯示全部樓層
謝謝各位前輩給我的建議和熱心的解答!但是我的問(wèn)題是為什么會(huì)出現(xiàn)這樣的情況以及解決方法,最佳答案只能給解決了這兩個(gè)問(wèn)題的人哈。大家對(duì)我編程的建議我都應(yīng)用在后續(xù)程序中了,使得邏輯更加清晰了,非常感謝!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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