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

標(biāo)題: stc15單片機串口范例校驗位的一個問題 [打印本頁]

作者: gongzhu    時間: 2020-6-18 15:09
標(biāo)題: stc15單片機串口范例校驗位的一個問題
調(diào)stc15串口,從stc-isp工具中復(fù)制了范例改下調(diào)試出現(xiàn)關(guān)于校驗位的一個問題。
范例編譯調(diào)試都是正常的,其校驗位是固定的,使用宏定義 :
  1. #define NONE_PARITY     0       //無校驗
  2. #define ODD_PARITY      1       //奇校驗
  3. #define EVEN_PARITY     2       //偶校驗
  4. #define MARK_PARITY     3       //標(biāo)記校驗
  5. #define SPACE_PARITY    4       //空白校驗

  6. #define PARITYBIT NONE_PARITY   //定義校驗位
復(fù)制代碼
為了使其在運行中可變校驗位,就將PARITYBIT 改成了全局變量:
  1. BYTE PARITYBIT=NONE_PARITY;//先默認無校驗測試
復(fù)制代碼
初始化也做了相應(yīng)修改:
  1. /*
  2. #if (PARITYBIT == NONE_PARITY)
  3.     SCON = 0x50;                //8位可變波特率
  4. #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
  5.     SCON = 0xda;                //9位可變波特率,校驗位初始為1
  6. #elif (PARITYBIT == SPACE_PARITY)
  7.     SCON = 0xd2;                //9位可變波特率,校驗位初始為0
  8. #endif
  9. */
  10. //改為如下:
  11.     switch(PARITYBIT)
  12.     {
  13.     case NONE_PARITY:
  14.         SCON = 0x50;
  15.         break;//8位可變波特率
  16.     case ODD_PARITY:
  17.     case EVEN_PARITY:
  18.     case MARK_PARITY:
  19.         SCON = 0xda;
  20.         break;     //9位可變波特率,校驗位初始為1
  21.     case SPACE_PARITY:
  22.         SCON = 0xd2;
  23.         break; //9位可變波特率,校驗位初始為0
  24.     default:
  25.         break;
  26.     }
復(fù)制代碼

發(fā)送程序中也改為如下:
  1. void SendData(BYTE dat)
  2. {
  3.     while (busy);               //等待前面的數(shù)據(jù)發(fā)送完成
  4.     ACC = dat;                  //獲取校驗位P (PSW.0)
  5.     if (P)                      //根據(jù)P來設(shè)置校驗位
  6.     {
  7.         /*
  8. #if (PARITYBIT == ODD_PARITY)
  9.         TB8 = 0;                //設(shè)置校驗位為0
  10. #elif (PARITYBIT == EVEN_PARITY)
  11.         TB8 = 1;                //設(shè)置校驗位為1
  12. #endif*/
  13.           if(PARITYBIT == ODD_PARITY)
  14.         TB8 = 0;                //設(shè)置校驗位為0
  15.       else if(PARITYBIT == EVEN_PARITY)
  16.         TB8 = 1;                //設(shè)置校驗位為1
  17.     }
  18.     else
  19.     { /*
  20. #if (PARITYBIT == ODD_PARITY)
  21.         TB8 = 1;                //設(shè)置校驗位為1
  22. #elif (PARITYBIT == EVEN_PARITY)
  23.         TB8 = 0;                //設(shè)置校驗位為0
  24. #endif */
  25.           if(PARITYBIT == ODD_PARITY)
  26.         TB8 = 1;                //設(shè)置校驗位為1
  27.       else if(PARITYBIT == EVEN_PARITY)
  28.         TB8 = 0;            //設(shè)置校驗位為0
  29.     }
  30.     busy = 1;
  31.     SBUF = ACC;                 //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
  32. }
復(fù)制代碼

為了便于對比,范例原代碼修改部分都注釋掉了。串口工具接收數(shù)據(jù)觀察如下:


修改前,程序循環(huán)發(fā)送字符串:“STC15F2K60S2  Uart Test !”,串口接收顯示正常。

修改后,串口接收的數(shù)據(jù)變成了:全部0x00,“\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0”

如將 SendData 中 if(P)部分注釋掉,即不設(shè)置校驗位,發(fā)送即為正常:“STC15F2K60S2  Uart Test !”

那問題也就出現(xiàn)在 sendData 中的if(P) 部分。
個人理解,如果 PARITYBIT=NONE_PARITY 那么if(P)以下判斷語句實際并未執(zhí)行。

哪位幫忙看看 sendData 中該如何修改: stcxx.rar (10.5 KB, 下載次數(shù): 9)

作者: gongzhu    時間: 2020-6-19 09:15
直接了當(dāng)?shù)貑枺?br /> 當(dāng) PARITYBIT = NONE_PARITY ;
以下兩段代碼一個發(fā)送數(shù)據(jù)不正常,一個發(fā)送正常:
  1. void SendData(BYTE dat)
  2. {
  3.     while (busy);               //等待前面的數(shù)據(jù)發(fā)送完成
  4.     ACC = dat;                  //獲取校驗位P (PSW.0)
  5.    if (P)                      //根據(jù)P來設(shè)置校驗位
  6.    {
  7.       if(PARITYBIT == ODD_PARITY)
  8.            TB8 = 0;                //設(shè)置校驗位為0
  9.       else if(PARITYBIT == EVEN_PARITY)
  10.             TB8 = 1;                //設(shè)置校驗位為1
  11.   }
  12. else
  13.   {
  14.             if(PARITYBIT == ODD_PARITY)
  15.                 TB8 = 1;                //設(shè)置校驗位為1
  16.           else if(PARITYBIT == EVEN_PARITY)
  17.                TB8 = 0;            //設(shè)置校驗位為0
  18.   }
  19.     busy = 1;
  20.     SBUF = ACC;                 //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
  21. }
復(fù)制代碼
  1. void SendData(BYTE dat)
  2. {
  3.      while (busy);               //等待前面的數(shù)據(jù)發(fā)送完成
  4.      ACC = dat;                  //獲取校驗位P (PSW.0)
  5.     busy = 1;
  6.     SBUF = ACC;                 //寫數(shù)據(jù)到UART數(shù)據(jù)寄存器
  7. }
復(fù)制代碼

個人覺得 if (P)  下面只對奇偶校驗判斷做了處理,并無無校驗的處理部分,理論上以上兩段代碼應(yīng)該都正常。








歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1