久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2589|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜资源 | 91亚洲精品久久久电影 | 天堂色区| 精品少妇一区二区三区在线播放 | 国产视频在线观看一区二区三区 | 久久久女女女女999久久 | 在线观看成人av | 91文字幕巨乱亚洲香蕉 | 国产一级在线观看 | 国产羞羞视频在线观看 | 中文字幕亚洲区一区二 | 久久精品aaa | 在线免费观看色 | 久久精品国产精品青草 | 久久精品色视频 | 免费视频二区 | 中文字字幕一区二区三区四区五区 | 国产精品一区二区视频 | 亚洲女人天堂网 | 亚洲精品电影网在线观看 | 欧美激情在线精品一区二区三区 | 在线视频 欧美日韩 | 狠狠av| 日韩一区二区三区在线视频 | 欧美一区二区在线播放 | 欧美成人视屏 | 91视频精选| 精品视频一区二区 | 日批免费在线观看 | 国产精品毛片无码 | 欧美激情在线一区二区三区 | 日韩高清一区 | 欧美中文字幕一区二区 | 日本特黄特色aaa大片免费 | 亚洲一区二区三区四区五区午夜 | 亚洲一区二区久久 | 久久99视频 | 国产精品爱久久久久久久 | 伊色综合久久之综合久久 | 毛片在线看片 | 美日韩精品 |