找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1876|回复: 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)
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表