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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2703|回復: 1
打印 上一主題 下一主題
收起左側

stc15單片機串口范例校驗位的一個問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:90212 發表于 2020-6-18 15:09 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
調stc15串口,從stc-isp工具中復制了范例改下調試出現關于校驗位的一個問題。
范例編譯調試都是正常的,其校驗位是固定的,使用宏定義 :
  1. #define NONE_PARITY     0       //無校驗
  2. #define ODD_PARITY      1       //奇校驗
  3. #define EVEN_PARITY     2       //偶校驗
  4. #define MARK_PARITY     3       //標記校驗
  5. #define SPACE_PARITY    4       //空白校驗

  6. #define PARITYBIT NONE_PARITY   //定義校驗位
復制代碼
為了使其在運行中可變校驗位,就將PARITYBIT 改成了全局變量:
  1. BYTE PARITYBIT=NONE_PARITY;//先默認無校驗測試
復制代碼
初始化也做了相應修改:
  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.     }
復制代碼

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

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


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

修改后,串口接收的數據變成了:全部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)部分注釋掉,即不設置校驗位,發送即為正常:“STC15F2K60S2  Uart Test !”

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

哪位幫忙看看 sendData 中該如何修改: stcxx.rar (10.5 KB, 下載次數: 9)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:90212 發表于 2020-6-19 09:15 | 只看該作者
直接了當地問:
當 PARITYBIT = NONE_PARITY ;
以下兩段代碼一個發送數據不正常,一個發送正常:
  1. void SendData(BYTE dat)
  2. {
  3.     while (busy);               //等待前面的數據發送完成
  4.     ACC = dat;                  //獲取校驗位P (PSW.0)
  5.    if (P)                      //根據P來設置校驗位
  6.    {
  7.       if(PARITYBIT == ODD_PARITY)
  8.            TB8 = 0;                //設置校驗位為0
  9.       else if(PARITYBIT == EVEN_PARITY)
  10.             TB8 = 1;                //設置校驗位為1
  11.   }
  12. else
  13.   {
  14.             if(PARITYBIT == ODD_PARITY)
  15.                 TB8 = 1;                //設置校驗位為1
  16.           else if(PARITYBIT == EVEN_PARITY)
  17.                TB8 = 0;            //設置校驗位為0
  18.   }
  19.     busy = 1;
  20.     SBUF = ACC;                 //寫數據到UART數據寄存器
  21. }
復制代碼
  1. void SendData(BYTE dat)
  2. {
  3.      while (busy);               //等待前面的數據發送完成
  4.      ACC = dat;                  //獲取校驗位P (PSW.0)
  5.     busy = 1;
  6.     SBUF = ACC;                 //寫數據到UART數據寄存器
  7. }
復制代碼

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



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表