美文网首页
STC8串口没有办法通讯的问题

STC8串口没有办法通讯的问题

作者: 烟花繁江尘辗 | 来源:发表于2020-05-25 16:57 被阅读0次
    此处用例芯片为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:我测试的时候出现这样的问题)

    相关文章

      网友评论

          本文标题:STC8串口没有办法通讯的问题

          本文链接:https://www.haomeiwen.com/subject/lpayahtx.html