wuzhengmin 发表于 2026-3-6 17:41:45

用AiCube 生成串口2代码,遇到困难,请大侠指教:

用AICube 生成了框架,正常应该是我在串口助手发送什么字符串(回车换行)


单片机AI8051U就会送什么

在串口1就一切正常,同样的设置,串口2就不能正常工作

在串口助手发送汉字字符串出现如下画面:

AI8051U芯片进入了(HID1) USB-Writer 状态,不知道问题出在哪里?

设置的画面是这样的



wuzhengmin 发表于 2026-3-6 17:46:40

u16 UART1 RX STA; 这个状态变量这样用
变量最高位表示数据接收有没有完成?
先定义个协议:数据有0D0A(就是\r\n),表示数据接收结束,就把UART1 RX STA最高位第15位设置为1,否则就是0 :


////////////////////////////////////////
// 串口2中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART2_ISR(void) interrupt UART2_VECTOR
{
    //<<AICUBE_USER_UART2_ISR_CODE1_BEGIN>>
    // 在此添加中断函数用户代码
                u8 r= 0;
    if (UART2_CheckTxFlag())            //判断串口发送中断
    {
      UART2_ClearTxFlag();            //清除串口发送中断标志

      fPrintfBusy = 0;                //清除printf发送忙标志
    }

    if (UART2_CheckRxFlag())            //判断串口接收中断
    {
      UART2_ClearRxFlag();            //清除串口接收中断标志
                r= UART2_ReadData();
                if(!(UART2_RX_STA&0x8000))//判断16位数据UART1_RX_STA最高位是否=1
                {
                        if(UART2_RX_STA & 0x4000 ) //判断16位数据UART1_RX_STA次高位是否=1
                        //是1的话说明上次接收到的是“0D”
                        {
                                if(r!=0x0a)UART2_RX_STA=0;//假如现在接收到的不是“0x0a”,说明接收错了,从头再来
                                else UART2_RX_STA|=0x8000;//或的目的是最高位置1的同时保留其他位不变
                        }
                        else//正常接收数据
                        {
                                if(r==0x0d) UART2_RX_STA|=0x4000;//如果收到的是0x0d,次高置1
                                else
                                {
                                        UART2_RX_BUF= r; //接收数据缓冲区,后14位保存数据
                                        UART2_RX_STA++;
                                        if(UART2_RX_STA>UART2_REC_LEN-1) UART2_RX_STA=0;
                                       
                                }
                               
                        }
                }
    }
    //<<AICUBE_USER_UART2_ISR_CODE1_END>>
}



上面这段程序在串口1正常运行(当然是把相应的系统函数变成串口1的,标志也是)

wuzhengmin 发表于 2026-3-6 17:51:13

问题主要是从PC机串口助手发送的字符串不能正常被Ai8051U 接收

如果单纯从Ai8051U向PC串口助手打印字符串是可以的,但是一从PC机串口助手发送字符串给

Ai8051U单片机,就好像死机了

狂热主宰 发表于 2026-3-6 17:58:54

AiCube-ISP
今天有更新版本

wuzhengmin 发表于 2026-3-6 18:09:39

哦哦
我尝试了新版本,故障现象没有改变,

我把超时中断是程序段移植过来,也是一样:

首先是编译没报错,下载后串口状态不对:

看图:

这个 (HID1) USB-Writer 不是我按P32+power键出现的,是我下载完自动出现的,在这个状态,肯定是不能正常工作的

怎么才能解决呢?我打算把AiCube 用好,就可以阶段性放松,不用查寄存器.........


看来还不太可靠,更可能是我哪里搞错啦?还有一种可能,就是STC的本意是PC机和单片机之间的串口通信,是直接用USB_CDC串口,不用在外接USB转TTL再接串口?


因为我今天发现,无论是串口2或者串口3,使能USB-CDC串口后,使用USB-CDC串口和单片机通信的话,是非常顺畅的.............

32G12K128 发表于 2026-3-9 17:12:39

这个 (HID1) USB-Writer 不是我按P32+power键出现的,是我下载完自动出现的,在这个状态,肯定是不能正常工作的====P3.2不要接地,退出USB下载模式

STC的本意是PC机和单片机之间的串口通信,是直接用USB_CDC串口,不用在外接USB转TTL再接串口===对的。

wuzhengmin 发表于 2026-3-15 09:37:53

32G12K128 发表于 2026-3-9 17:12
这个 (HID1) USB-Writer 不是我按P32+power键出现的,是我下载完自动出现的,在这个状态,肯定是不能正常工 ...

万分感激您,确实是,本身单片机串口就2根线,资源有限,所以我才猜想STC公司应该是倡导MCU和PC助手通信的时候,直接用USB-CDC,明显快很多......................
页: [1]
查看完整版本: 用AiCube 生成串口2代码,遇到困难,请大侠指教: