Arsun 发表于 2025-1-9 23:31:23

ai8051u串口通信不显示串口上位机如何发送数据验证(已解决)

背景:想通过ai8051u深入验证UART底层通信原理,在验证过程中,各种寄存器的配置都完成了。
但实操过程中,实验箱烧录完程序后是会关闭所有串口的。
耗时一天尝试解决:
1.参考冲哥《Ai8051U视频教程第四集-USB不停电下载配套程序》的代码,但配置串口的代码与USB-cdc好像有冲突,
同时启用就会不出串口,注释自己配置串口代码就有串口。

2.查看芯片手册,看官方例程《AI8051U-DEMO-CODE-V1.2\10-串口1中断模式与电脑收发测试》,例程跑起来也是不出串口的,
也实现不了功能说明的“串口1全双工中断方式收发通讯程序。通过PC向MCU发送数据, MCU收到后通过串口1把收到的数据原样返回.”
3.尝试了配置P_SW1,将串口1的tx、rx转移到P3.6和P3.7,通过 J6 连接串口板,发送数据没反应
一句话说明想咨询的问题:
如何让ai8051在烧录完程序后显示串口1?

wangxiangtan 发表于 2025-1-10 08:50:23

官方手册只有这么个图,感觉还是达不到楼主“深入验证UART底层通信原理”的目的,
想再深入底层估计得找行业内芯片电路设计工程师





DebugLab 发表于 2025-1-10 10:22:54

不出串口指哪里不出串口,不能理解
如果是串口助手
使用USB转串口工具:必须要正确连接USB转串口工具才能显示串口设备,单片机连接到USB转串口工具使用UART通信
使用USB CDC直接USB通信:必须USB直接连接单片机,且CDC程序正常工作,这个要CDC程序,不是UART

Arsun 发表于 2025-1-10 13:56:49

DebugLab 发表于 2025-1-10 10:22
不出串口指哪里不出串口,不能理解
如果是串口助手
使用USB转串口工具:必须要正确连接USB转串口工具才能显 ...

大概懂您意思了,就是实验箱跑UART通信的话需要接转接工具,如果是USB线是USB-CDC通信,对的吧。我再重新试试把串口1tx,rx转移到P3.6和P3.7,用串口板连接看能不能跑通

305444337 发表于 2025-1-10 14:33:24

太高深了看不懂{:3_41:}

Arsun 发表于 2025-1-10 15:06:28

<p>如贴下大佬所说,UART通信需要用串口板转接,直接用数据线,只能是走USB-HID。于是参考芯片手册,将串口1引脚转到了3.6,3.7.实现了UART单片机和电脑直接的通信。代码如下:</p>
<p>main.c</p>
<pre><code>#include &quot;ai8051u.h&quot;                // 调用头文件
#include &quot;stdio.h&quot;
#include &quot;intrins.h&quot;
#include &quot;UART.h&quot;

unsigned char srcc = 1;

void Delay100ms(void)        //@24.000MHz
{
        unsigned long edata i;

        _nop_();
        _nop_();
        i = 599998UL;
        while (i) i--;
}

/******************** 主函数 **************************/
void main(void)
{
    WTST = 0;// 设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    EAXFR = 1; // 扩展寄存器(XFR)访问使能
    CKCON = 0; // 提高访问XRAM速度

    P0M1 = 0x00;   P0M0 = 0x00;   // 设置所有IO口为准双向口
    P1M1 = 0x00;   P1M0 = 0x00;   
    P2M1 = 0x00;   P2M0 = 0x00;   
    P3M1 = 0x00;   P3M0 = 0x00;   
    P4M1 = 0x00;   P4M0 = 0x00;   
    P5M1 = 0x00;   P5M0 = 0x00;   
    P6M1 = 0x00;   P6M0 = 0x00;   
    P7M1 = 0x00;   P7M0 = 0x00;   

        Uart1_Init();

    while (1)
    {
                P40 = 0;
                P00 = 0;
                P01 = 0;
                P02 = 0;
//                UART_SendByte(srcc);
//                Delay100ms();
//                srcc++;
    }
}

void Uart1_Isr(void) interrupt 4
{
        if (TI)                                //检测串口1发送中断
        {
                TI = 0;                        //清除串口1发送中断请求位
        }
        if (RI)                                //检测串口1接收中断
        {
                srcc = SBUF;
                UART_SendByte(SBUF);
                RI = 0;                        //清除串口1接收中断请求位
        }
}

</code></pre>
<p>UART.c</p>
<pre><code>
#include &quot;ai8051u.h&quot;

void Uart1_Init(void)        //9600bps@24.000MHz
{
        SCON = 0x50;                //8位数据,可变波特率
        AUXR |= 0x40;                //定时器时钟1T模式
        AUXR &amp;= 0xFE;                //串口1选择定时器1为波特率发生器
        TMOD &amp;= 0x0F;                //设置定时器模式
        TL1 = 0x8F;                        //设置定时初始值
        TH1 = 0xFD;                        //设置定时初始值
        ET1 = 0;                        //禁止定时器中断
        TR1 = 1;                        //定时器1开始计时
        ES = 1;                                //使能串口1中断
        EA = 1;
        P_SW1 = (P_SW1 &amp; ~0xc0) | 0x40;//转变串口的引脚至3.6和3.7
}

void UART_SendByte(unsigned char Byte)
{
        SBUF = Byte;
        while(TI==0);
        TI=0;
}


</code></pre>
页: [1]
查看完整版本: ai8051u串口通信不显示串口上位机如何发送数据验证(已解决)