wuzhengmin 发表于 2026-1-23 13:59:04

请教Ai8051U实验箱串口2--PC通信,单片机无法接受PC机数据?

这几天在听陈桂友老师的课程,串口通信达实验,遇到个问题:


实验环境如下:

1 Ai8051U实验箱+“一箭双雕”

主要是验证串口2和PC之间无校验通信:

关键程序如下:

void Timer0_Init(void)                                // 1毫秒@11.0592MHz
{
        AUXR |= 0x80;                                                                // 定时器时钟1T模式
        TMOD &= 0xF0;                                                                // 设置定时器模式
        TL0 = 0xCD;                                                                        // 设置定时初始值
        TH0 = 0xD4;                                                                        // 设置定时初始值
        TF0 = 0;                                                                                // 清除TF0标志
        TR0 = 1;                                                                                // 定时器0开始计时
        ET0 = 1;                                                                                // 使能定时器0中断
}

void Uart2Isr() interrupt 8
{
        if (S2TI)                                                                                // 发送中断标志置1时
        {
                S2TI = 0;                                                                        // 清零发送中断标志
                busy = 0;                                                                        // 清零忙状态
        }
        if (S2RI)                                                                                // 接收中断标志置1时
        {
                S2RI = 0;                                                                        // 清零接收中断标志
//                buffer = S2BUF;        // 接收长度16
//                wptr &= 0x0f;                                                // 接收长度16
                blinkflag = 1;                                         // LED闪烁标志置1
                buffer = S2BUF;                                        // 接收长度1
                if(buffer == '1')                         // 当接收到的字符是‘1’时
                {
                        blinkflag = 1;                                         // LED闪烁标志置1
                }
        }
}
void Uart2Init()                                                        // UART2初始化
{
        S2CFG = 0x01;                                                                // 串口2此位必须为1,否则可能产生不可预期后果
        //Ai8051U试验箱是P4.2 RXD2_2 P4.3 TXD2_2,利用J18A J18B
        P_SW2 |= 1;       //UART2 switch to: 0: P1.2 P1.3, 1: P4.2 P4.3
                          //屠龙刀久不需要这行
        S2CON = 0x50;                                                                // 模式1(8位数据)、接收使能
        T2L = BRT;                                               
        T2H = BRT >> 8;                                                        // 波特率对应的重装载值
        T2x12 = 1;                                                                        // 1T模式
        T2R = 1;                                                                                // 启动定时器2
        wptr = 0x00;                                                                // 清零写指针
        rptr = 0x00;                                                                // 清零读指针
        busy = 0;                                                                                // 清零忙标志
}
void UartSend(char dat)                                // 发送字符函数
{
        while (busy);                                                                // 当串口忙时,等待
        busy = 1;                                                                                // 忙标志置1
        S2BUF = dat;                                                                // 发送数据dat
}
void UartSendStr(char *p)                        // 发送字符串函数
{
        while (*p)                                                                        // 字符串结束标志‘\0’前循环
        {
                UartSend(*p++);                                                // 逐个发送字符串的字符
        }
}
void Blink()                                                                        // P2口流水灯
{
        u8 i;
        for(i = 0;i < 6;i++)                                // 闪烁3次(即亮灭6个过程)
        {
                P0 = !P0;                                                                        // 取反实现亮灭
                delayms(200);                                                        // 延时200ms
        }
}现在遇到的问题是,实验箱按P32,串口助手能通过CDC串口接受到字符串“HelloWorld!”

但是从PC机这端串口助手以字符串形式发送“1” ,实验箱没反应

我们直接在接受中断无条件执行blinkflag = 1; // LED闪烁标志置1


都没有反应,证明单片机根本没有进入接受中断服务函数


把“一箭双雕”换了STC link1D 也是同样现象,哪位大侠帮手看看?


wuzhengmin 发表于 2026-1-23 14:03:03

硬件连接如下:

wuzhengmin 发表于 2026-1-23 14:09:08

其实是我昨天晚上直接把陈老师的UART2 向PC发送字符串的实验改了一下

昨晚更离谱,连试验箱向PC串口助手发送字符串都不行,后来把STC的例子程序

下载后,证实是原程序从STC8H8K64U移植到Ai8051U试验箱,应该是软件哪里出问题

今天想进一步双向通信,怎么试验箱就没能收到串口助手的“1”呢?

实际是根本没有发生接受中断...........

wuzhengmin 发表于 2026-1-23 14:10:59

我已经把“一箭双雕”和STC link1D 都升级到V6.96O

版本了.........

这种基础实验,以前都是很顺利的,没发现有问题啊

是哪里升级后不匹配么?......................


通道上首先是STC的CDC串口助手,我换了SSCOMv5132,还是一样

那么剩下的就是“一箭双雕”和STC link1D,难道2中固件都出问题?其实我手头STC link1D有2个

“一箭双雕”也是2个,都交叉换过,现象是一样的。

而这个串口2的软件,课堂演示和实验室使用也好几年了,只能重点怀疑“一箭双雕”和STC link1D,

包括2者的升级。

wuzhengmin 发表于 2026-1-23 16:34:28

我手头前段时间在淘宝买了2块追风剑,拿来试一试?

结果发现另一个问题:追风剑PCB板没有丝印,勉强从芯片手册查到:

P1.0P1.1 是左边开始最上端数,的第12,13脚:

wuzhengmin 发表于 2026-1-23 16:41:30

//STC32F12K54-64MHZ-LQFP48       
        S2_S = 0;      //RXD2/P1.0, TXD2/P1.1

RXD是接P1.0TXD是接P1.1

其他脚就没法查,太细小啦,不过还是单向通信:

wuzhengmin 发表于 2026-1-23 16:42:36

问题好像真的存在于一箭双雕和STC link1D

不行了,搞不掂,投降啦

PC端的串口助手,单片机,通信软件 和“一箭双雕”或者STC link1D

从历史来看,最短的就是“一箭双雕”或者STC link1D

从复杂程度来看,最麻烦的也是“一箭双雕”或者STC link1D

原来一个340芯片,独占一个USB只能产生一个串口,现在“一箭双雕”或者STC link1D在只有1个USB

的情况下,不但要产生2个CDC串口(速度是12M!),还要有烧录的一个串口,一定会很复杂,出错的机会就多。

这个很容易理解,毕竟平时都是用USB库函数,直接自己搞是不行的。

DebugLab 发表于 2026-1-24 12:42:08

wuzhengmin 发表于 2026-1-23 16:42
问题好像真的存在于一箭双雕和STC link1D

不行了,搞不掂,投降啦


未能复现此问题
短接Link1D的RXD和TXD试一下自收发是否正常
可用最新版ISP软件更新Link1D固件
接USB,按下脱机下载键,按一下电源键断电然后松开电源键,ISP软件识别到USB Writer后松开脱机下载键,然后按图操作




wuzhengmin 发表于 2026-1-26 22:23:55

DebugLab 发表于 2026-1-24 12:42
未能复现此问题
短接Link1D的RXD和TXD试一下自收发是否正常
可用最新版ISP软件更新Link1D固件


感谢感谢!我再慢慢查找原因!辛苦您啦!
页: [1]
查看完整版本: 请教Ai8051U实验箱串口2--PC通信,单片机无法接受PC机数据?