标题:
stc15单片机串口范例校验位的一个问题
[打印本页]
作者:
gongzhu
时间:
2020-6-18 15:09
标题:
stc15单片机串口范例校验位的一个问题
调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 中的if(P) 部分。
个人理解,如果
PARITYBIT=NONE_PARITY
那么if(P)以下判断语句实际并未执行。
哪位帮忙看看 sendData 中该如何修改:
stcxx.rar
(10.5 KB, 下载次数: 9)
2020-6-18 15:08 上传
点击文件名下载附件
串口校验位
作者:
gongzhu
时间:
2020-6-19 09:15
直接了当地问:
当 PARITYBIT = NONE_PARITY ;
以下两段代码一个发送数据不正常,一个发送正常:
void SendData(BYTE dat)
{
while (busy); //等待前面的数据发送完成
ACC = dat; //获取校验位P (PSW.0)
if (P) //根据P来设置校验位
{
if(PARITYBIT == ODD_PARITY)
TB8 = 0; //设置校验位为0
else if(PARITYBIT == EVEN_PARITY)
TB8 = 1; //设置校验位为1
}
else
{
if(PARITYBIT == ODD_PARITY)
TB8 = 1; //设置校验位为1
else if(PARITYBIT == EVEN_PARITY)
TB8 = 0; //设置校验位为0
}
busy = 1;
SBUF = ACC; //写数据到UART数据寄存器
}
复制代码
void SendData(BYTE dat)
{
while (busy); //等待前面的数据发送完成
ACC = dat; //获取校验位P (PSW.0)
busy = 1;
SBUF = ACC; //写数据到UART数据寄存器
}
复制代码
个人觉得
if (P)
下面只对奇偶校验判断做了处理,并无无校验的处理部分,理论上以上两段代码应该都正常。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1