此处用例芯片为STC8AK64S4A12
1.首先需要排查是不是硬件上面的问题,可以使用示波器看接收发送口是否有数据;
2.进行串口的设置判断是不是没有配置完全(代码如下);
#include "reg51.h"
#include "intrins.h"
#define FOSC 11059200UL //根据芯片自带或者是外接的晶振选择
#define BRT (65536 - FOSC / 115200 / 4) //115200表示通讯的波特率
sfr T4T3M = 0xd1; //时器3和定时器4的设置
sfr T4H = 0xd2;
sfr T4L = 0xd3;
sfr T3H = 0xd4;
sfr T3L = 0xd5;
sfr S3CON = 0xac;
sfr S3BUF = 0xad; //串行数据缓冲器,接收发送共用一个地址
sfr IE2 = 0xaf; //中断使能寄存器2
bit busy;
char wptr;
char rptr;
char buffer[16];
void Uart3Isr() interrupt 17 //函数名怎么取不要紧,依据的是interrupt17
{
if (S3CON & 0x02)
{
S3CON &= ~0x02; //清除发送标志位
busy = 0;
}
if (S3CON & 0x01)
{
S3CON &= ~0x01; //清除接收的标志位
buffer[wptr++] = S3BUF; //将接收的数据放入到buffer
wptr &= 0x0f;
}
}
void Uart3Init() //串口3的初始化
{
S3CON = 0x50; // 选择定时器3作为串口3的波特率发生器,允许串口3接收数据
T3L = BRT;
T3H = BRT >> 8;
T4T3M = 0x0a; //定时器3开始计时,设置1T模式CPU不分频
wptr = 0x00;
rptr = 0x00;
busy = 0; //清除标志位
}
void Uart3Send(char dat) //发送单个数据
{
while (busy);
busy = 1;
S3BUF = dat;
}
void Uart3SendStr(char *p) //发送字符串
{
while (*p)
{
Uart3Send(*p++);
}
}
void main()
{
Uart3Init(); //初始化串口
IE2 = 0x08; //允许串口3中断
EA = 1; //总中断允许控制位
Uart3SendStr("Uart Test !\r\n");
while (1)
{
if (rptr != wptr) //从RX口写入数据,会从TX发送出来
{
Uart3Send(buffer[rptr++]);
rptr &= 0x0f;
}
}
}
3. 注意事项:
STC8A8K64S4A12 系列 F 版芯片重要说明 1
所有串口 ( 包括串口 1 、串口 2 、串口 3 、串口 4) 的串口发送端发送串口数据时,发送端口: 均需要进行下面的设置: ( 3 种方式任选其一)a. 设置 I/O 口为准双向口模式并打开内部的上拉电阻b. 设置 I/O 口为准双向口模式并外接 3 ~ 10K 的上拉电阻c. 设置 I/O 口为强推挽模式
STC8A8K64S4A12 系列 F 版芯片重要说明 2串口 1 的模式 2 和模式 3 时 , 在设置发送数据的第 9 位( TB8 )时,需要连续设置两次才有效。串口 2 、串口 3 和串口 4 无此问题
4. IO口的配置
如果都配置检测没什么问题,能够正常的发送数据但是不能够接收数据的话就要考虑是不是IO没有配置好;
将RX的端口配置成设置 I/O 口为准双向口模式,再次进行尝试(PS:我测试的时候出现这样的问题)
网友评论