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?
官方手册只有这么个图,感觉还是达不到楼主“深入验证UART底层通信原理”的目的,
想再深入底层估计得找行业内芯片电路设计工程师
不出串口指哪里不出串口,不能理解
如果是串口助手
使用USB转串口工具:必须要正确连接USB转串口工具才能显示串口设备,单片机连接到USB转串口工具使用UART通信
使用USB CDC直接USB通信:必须USB直接连接单片机,且CDC程序正常工作,这个要CDC程序,不是UART
DebugLab 发表于 2025-1-10 10:22
不出串口指哪里不出串口,不能理解
如果是串口助手
使用USB转串口工具:必须要正确连接USB转串口工具才能显 ...
大概懂您意思了,就是实验箱跑UART通信的话需要接转接工具,如果是USB线是USB-CDC通信,对的吧。我再重新试试把串口1tx,rx转移到P3.6和P3.7,用串口板连接看能不能跑通 太高深了看不懂{:3_41:} <p>如贴下大佬所说,UART通信需要用串口板转接,直接用数据线,只能是走USB-HID。于是参考芯片手册,将串口1引脚转到了3.6,3.7.实现了UART单片机和电脑直接的通信。代码如下:</p>
<p>main.c</p>
<pre><code>#include "ai8051u.h" // 调用头文件
#include "stdio.h"
#include "intrins.h"
#include "UART.h"
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 "ai8051u.h"
void Uart1_Init(void) //9600bps@24.000MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TL1 = 0x8F; //设置定时初始值
TH1 = 0xFD; //设置定时初始值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES = 1; //使能串口1中断
EA = 1;
P_SW1 = (P_SW1 & ~0xc0) | 0x40;//转变串口的引脚至3.6和3.7
}
void UART_SendByte(unsigned char Byte)
{
SBUF = Byte;
while(TI==0);
TI=0;
}
</code></pre>
页:
[1]