21ic问答首页 - 从 STC8H1Kxx 升级到 STC8A8K64D4 串口乱码
从 STC8H1Kxx 升级到 STC8A8K64D4 串口乱码
jrcsh2021-12-13
本帖最后由 jrcsh 于 2021-12-14 03:09 编辑
从 8H1Kxx 升级到 8A8K64D4 代码复制过去发现串口乱码, 花了一个晚上排查出
是配置了 P1 口 引起 P3 口 的串口乱码, 有其他人也遇到这样吗?
以下代码主要引用至厂家例程:
//#include "reg51.h"
#include "STC8HX.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
//s/fr AUXR = 0x8e;
//sfr T2H = 0xd6;
//sfr T2L = 0xd7;
bit busy;
char wptr;
char rptr;
char buffer[16];
char aaa;
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
buffer[wptr++] = SBUF;
wptr &= 0x0f;
}
}
void UartInit()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
wptr = 0x00;
rptr = 0x00;
busy = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void UartSendStr(char *p)
{
while (*p)
{
UartSend(*p++);
}
}
void main()
{
P1M1 = 0x00; //设置P1强推
P1M0 = 0xf0;// 8H1k f0
UartInit();
ES = 1;
EA = 1;
UartSendStr("Uart Test !\r\n");
while (1)
{
aaa++; if(aaa>10){aaa=0; UartSendStr("Uart Test ! #\r\n"); }
Delay100ms();
UartSendStr("Uart Test !\r\n");
if (rptr != wptr)
{
UartSend(buffer[rptr++]);
rptr &= 0x0f;
}
}
}
下载视频
从 8H1Kxx 升级到 8A8K64D4 代码复制过去发现串口乱码, 花了一个晚上排查出
是配置了 P1 口 引起 P3 口 的串口乱码, 有其他人也遇到这样吗?
以下代码主要引用至厂家例程:
//#include "reg51.h"
#include "STC8HX.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
//s/fr AUXR = 0x8e;
//sfr T2H = 0xd6;
//sfr T2L = 0xd7;
bit busy;
char wptr;
char rptr;
char buffer[16];
char aaa;
void Delay100ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 5;
j = 52;
k = 195;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
buffer[wptr++] = SBUF;
wptr &= 0x0f;
}
}
void UartInit()
{
SCON = 0x50;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
wptr = 0x00;
rptr = 0x00;
busy = 0;
}
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
void UartSendStr(char *p)
{
while (*p)
{
UartSend(*p++);
}
}
void main()
{
P1M1 = 0x00; //设置P1强推
P1M0 = 0xf0;// 8H1k f0
UartInit();
ES = 1;
EA = 1;
UartSendStr("Uart Test !\r\n");
while (1)
{
aaa++; if(aaa>10){aaa=0; UartSendStr("Uart Test ! #\r\n"); }
Delay100ms();
UartSendStr("Uart Test !\r\n");
if (rptr != wptr)
{
UartSend(buffer[rptr++]);
rptr &= 0x0f;
}
}
}
下载视频
赞0
从你的代码和你的描述来看,两者就互相冲突了。
你描述的是MCU主频22.1184MHz,波特率9600,但你的代码里面用来计算波特率的代码部分系统主频设置是11.0592MHz,波特率115200。
产品的代码是 22
引用 厂家代码来测试用的是 11
问题应该定位在硬件的可能性比较大概率了, 因为是新片所以BUG无限可能~~~~
IO 口的焊接也有现有理想的疑是有短路情况(又不是这次的IO 。。。。 真晕 )
评论
2021-12-17
赞0
前段时间有个产品更换MCU型号以后出现问题,也一度怀疑是MCU的问题,最后反复排查才发现是最初的硬件电路就有问题。
你这个最好也是先排查一下你的代码、硬件电路等。
从你的代码和你的描述来看,两者就互相冲突了。
你描述的是MCU主频22.1184MHz,波特率9600,但你的代码里面用来计算波特率的代码部分系统主频设置是11.0592MHz,波特率115200。
评论
2021-12-14
赞0
对阿~~~ 本来就无关联的~~~ P1 既然影响到 P3
评论
2021-12-14
赞0
这个看心情~~~~~
评论
2021-12-14
赞0
初步排查 PCB 串口线有和P1 靠近的是一个过孔 距离 0.2mm 左右
第二块 PCB 成品 测试 还是有这个问题....... 看来 PCB 或者这批 MCU 有问题的可能性大 PCB 洗板水影响电汽绝缘的可能性有点小...不排除是助焊剂残留?
评论
2021-12-14
测试一下电阻,再用示波器看看即可。
赞0
P1口语P3口无关的。
评论
2021-12-13
赞0
评论
2021-12-13
赞0
2、每一行的代码都应该注释清楚,养成好习惯,方便查找问题;
3、8A系列没用过,8H用过,可以肯定的告诉你,是你代码的问题,这类问题STC目前不会有了,十几年前用STC的时候问题还是很多,今年又用了一年,发现基本没问题了
评论
2021-12-13
赞0
P1M1 = 0x00;
P1M0 = 0xf0;// 8H1k f0
设置的是p1口,影响到了P3 p30.31上的串口。 22.118400mhz9600 出来的数据,变成了乱码。
评论
2021-12-13
您需要登录后才可以回复 登录 | 注册