找回密码
 立即注册
查看: 369|回复: 5

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-04-07 22:47:13
已绑定手机

2

主题

10

回帖

138

积分

注册会员

积分
138
发表于 2025-1-9 23:31:23 | 显示全部楼层 |阅读模式
背景:想通过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?
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-02 07:32:37

21

主题

564

回帖

2678

积分

金牌会员

积分
2678
发表于 2025-1-10 08:50:23 | 显示全部楼层
官方手册只有这么个图,感觉还是达不到楼主“深入验证UART底层通信原理”的目的,
想再深入底层估计得找行业内芯片电路设计工程


QQ截图20250110084642.jpg


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2025-1-10 10:22:54 | 显示全部楼层
不出串口指哪里不出串口,不能理解
如果是串口助手
使用USB转串口工具:必须要正确连接USB转串口工具才能显示串口设备,单片机连接到USB转串口工具使用UART通信
使用USB CDC直接USB通信:必须USB直接连接单片机,且CDC程序正常工作,这个要CDC程序,不是UART
DebugLab
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-04-07 22:47:13
已绑定手机

2

主题

10

回帖

138

积分

注册会员

积分
138
发表于 2025-1-10 13:56:49 | 显示全部楼层
Debu*** 发表于 2025-1-10 10:22
不出串口指哪里不出串口,不能理解
如果是串口助手
使用USB转串口工具:必须要正确连接USB转串口工具才能显 ...

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

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:160
  • 最近打卡:2025-05-02 08:46:01
已绑定手机

12

主题

191

回帖

677

积分

高级会员

积分
677
发表于 2025-1-10 14:33:24 | 显示全部楼层
太高深了  看不懂
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:36
  • 最近打卡:2025-04-07 22:47:13
已绑定手机

2

主题

10

回帖

138

积分

注册会员

积分
138
发表于 2025-1-10 15:06:28 | 显示全部楼层

如贴下大佬所说,UART通信需要用串口板转接,直接用数据线,只能是走USB-HID。于是参考芯片手册,将串口1引脚转到了3.6,3.7.实现了UART单片机和电脑直接的通信。代码如下:

main.c

#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接收中断请求位
	}
}

UART.c


#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;
}


回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 13:06 , Processed in 0.284597 second(s), 87 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表