钻石会员
  
主题
帖子
积分11732
阅读权限50
注册时间2013-9-14
最后登录1970-1-1
在线时间 小时
|
本帖最后由 gongzhu 于 2020-6-18 15:29 编辑
调stc15串口,从stc-isp工具中复制了范例改下调试出现关于校验位的一个问题。
范例编译调试都是正常的,其校验位是固定的,使用宏定义 :
- #define NONE_PARITY 0 //无校验
- #define ODD_PARITY 1 //奇校验
- #define EVEN_PARITY 2 //偶校验
- #define MARK_PARITY 3 //标记校验
- #define SPACE_PARITY 4 //空白校验
- #define PARITYBIT NONE_PARITY //定义校验位
复制代码
为了使其在运行中可变校验位,就将PARITYBIT 改成了全局变量:
- BYTE PARITYBIT=NONE_PARITY;//先默认无校验测试
复制代码
初始化也做了相应修改:
- /*
- #if (PARITYBIT == NONE_PARITY)
- SCON = 0x50; //8位可变波特率
- #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
- SCON = 0xda; //9位可变波特率,校验位初始为1
- #elif (PARITYBIT == SPACE_PARITY)
- SCON = 0xd2; //9位可变波特率,校验位初始为0
- #endif
- */
- //改为如下:
- switch(PARITYBIT)
- {
- case NONE_PARITY:
- SCON = 0x50;
- break;//8位可变波特率
- case ODD_PARITY:
- case EVEN_PARITY:
- case MARK_PARITY:
- SCON = 0xda;
- break; //9位可变波特率,校验位初始为1
- case SPACE_PARITY:
- SCON = 0xd2;
- break; //9位可变波特率,校验位初始为0
- default:
- break;
- }
复制代码 发送程序也改为如下:
- void SendData(BYTE dat)
- {
- while (busy); //等待前面的数据发送完成
- ACC = dat; //获取校验位P (PSW.0)
- if (P) //根据P来设置校验位
- {
- /*
- #if (PARITYBIT == ODD_PARITY)
- TB8 = 0; //设置校验位为0
- #elif (PARITYBIT == EVEN_PARITY)
- TB8 = 1; //设置校验位为1
- #endif*/
- if(PARITYBIT == ODD_PARITY)
- TB8 = 0; //设置校验位为0
- else if(PARITYBIT == EVEN_PARITY)
- TB8 = 1; //设置校验位为1
- }
- else
- { /*
- #if (PARITYBIT == ODD_PARITY)
- TB8 = 1; //设置校验位为1
- #elif (PARITYBIT == EVEN_PARITY)
- TB8 = 0; //设置校验位为0
- #endif */
- if(PARITYBIT == ODD_PARITY)
- TB8 = 1; //设置校验位为1
- else if(PARITYBIT == EVEN_PARITY)
- TB8 = 0; //设置校验位为0
- }
- busy = 1;
- SBUF = ACC; //写数据到UART数据寄存器
- }
复制代码 修改前,程序循环发送字符串:“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中关于校验位设置该如何修改:
|
-
stc串口
|