ercircle
发表于 2025-5-15 11:29:42
小熊熊 发表于 2025-5-15 11:21
好像还是不行
还有你这个B_TX2_Busy 连个类型都没声明噢,居然可以编译通过我也服了。。。。
加了类型声明和volatile关键字汇编里没死循环了
ercircle
发表于 2025-5-15 11:42:12
小熊熊 发表于 2025-5-15 11:21
好像还是不行
不加类型声明,编译器默认是当16位数处理,不过也能执行下去
小熊熊
发表于 2025-5-15 11:52:36
ercircle 发表于 2025-5-15 11:42
不加类型声明,编译器默认是当16位数处理,不过也能执行下去
大哥你的也是AICUBE生成的吗 我的还是不行用串口波特率计算器里面的可以啊
小熊熊
发表于 2025-5-15 12:07:13
ercircle 发表于 2025-5-15 11:42
不加类型声明,编译器默认是当16位数处理,不过也能执行下去
谢谢大哥了
ercircle
发表于 2025-5-15 13:31:12
小熊熊 发表于 2025-5-15 11:52
大哥你的也是AICUBE生成的吗 我的还是不行用串口波特率计算器里面的可以啊 ...
是AiCube生成的,V6.95N支持打开AiCube工程了,可以对比下差异
小熊熊
发表于 2025-5-15 14:16:31
小熊熊 发表于 2025-5-15 11:52
大哥你的也是AICUBE生成的吗 我的还是不行用串口波特率计算器里面的可以啊 ...
大哥能发一个完整程序帮忙看看吗我看看有什么区别 我的也是那个版本我都弄了好几天了因为买了一个串口屏 想玩玩 直接玩自闭了
小熊熊
发表于 2025-5-15 14:17:22
小熊熊 发表于 2025-5-15 14:16
大哥能发一个完整程序帮忙看看吗我看看有什么区别 我的也是那个版本我都弄了好几天了因为买了一 ...
谢谢了刚刚没注意看
小熊熊
发表于 2025-5-15 14:18:44
ercircle 发表于 2025-5-15 13:31
是AiCube生成的,V6.95N支持打开AiCube工程了,可以对比下差异
多谢大哥下班回去看看
小熊熊
发表于 2025-5-15 23:23:47
ercircle 发表于 2025-5-15 13:31
是AiCube生成的,V6.95N支持打开AiCube工程了,可以对比下差异
//<<AICUBE_USER_HEADER_REMARK_BEGIN>>
////////////////////////////////////////
// 在此添加用户文件头说明信息
// 文件名称: uart.c
// 文件描述:
// 文件版本: V1.0
// 修改记录:
// 1. (2025-05-13) 创建文件
////////////////////////////////////////
//<<AICUBE_USER_HEADER_REMARK_END>>
#include "config.h"
#define u8 unsigned char
u8 Rec_Dat; //接收缓冲区
u8 Rec_Num = 0; //接收计数
volatile u8 B_TX2_Busy = 0;
BOOL fPrintfBusy;
//<<AICUBE_USER_INCLUDE_BEGIN>>
// 在此添加用户头文件包含
//<<AICUBE_USER_INCLUDE_END>>
//<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
// 在此添加用户全局变量定义、用户宏定义以及函数声明
//<<AICUBE_USER_GLOBAL_DEFINE_END>>
////////////////////////////////////////
// 串口2中断服务程序
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART2_ISR(void) interrupt UART2_VECTOR
{
//<<AICUBE_USER_UART2_ISR_CODE1_BEGIN>>
// 在此添加中断函数用户代码
if (UART2_CheckTxFlag()) //判断串口发送中断
{
UART2_ClearTxFlag(); //清除串口发送中断标志
fPrintfBusy = 0;
B_TX2_Busy = 0;
}
if (UART2_CheckRxFlag()) //判断串口接收中断
{
UART2_ClearRxFlag(); //清除串口接收中断标志
Rec_Dat = S2BUF;
}
//<<AICUBE_USER_UART2_ISR_CODE1_END>>
}
////////////////////////////////////////
// 串口2初始化函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void UART2_Init(void)
{
#ifdef BAUDRATE
#undef BAUDRATE
#endif
#define BAUDRATE (9600)
#define T2_RELOAD (65536 - (SYSCLK / BAUDRATE + 2) / 4)
UART2_SwitchP4243(); //设置串口数据端口: RxD2 (P4.2), TxD2 (P4.3)
//UART2_Timer2BRT(); //串口2固定选择定时器2作为波特率发生器
TIMER2_TimerMode(); //设置定时器2为定时模式
TIMER2_1TMode(); //设置定时器2为1T模式
TIMER2_SetPrescale(0); //设置定时器2的8位预分频
TIMER2_SetReload16(T2_RELOAD); //设置定时器2的16位重载值
TIMER2_Run(); //定时器2开始运行
UART2_EnableRx(); //使能串口2接收数据
UART2_Mode1(); //设置串口2为模式1 (8位数据可变波特率)
UART2_SetIntPriority(0); //设置中断为最低优先级
UART2_EnableInt(); //使能串口2中断
fPrintfBusy = 0; //清除发送数据忙标志
Rec_Num = 0;
B_TX2_Busy = 0;
//<<AICUBE_USER_UART2_INITIAL_BEGIN>>
// 在此添加用户初始化代码
//<<AICUBE_USER_UART2_INITIAL_END>>
}
char putchar (char dat) //将串口2和printf函数绑定
{
while (fPrintfBusy);
UART2_SendData(dat);
fPrintfBusy = 1;
return dat;
}
void Uart2_SendStr( u8 *puts ) //串口数据发送函数
{
for (; *puts != 0;puts++) //遇到停止符0结束
{
S2BUF = *puts;
B_TX2_Busy = 1;
while(B_TX2_Busy);
}
}
void Usart2_RunTask(void)
{
if( Rec_Num >= 6 ) //是否接收到了6位以上的数据
{
if(( Rec_Dat == 0x02 ) && ( Rec_Dat == 0x02 ) ) //末尾判断
{
if( ( Rec_Dat == 0x05 ) && ( Rec_Dat == 0x04 ) && ( Rec_Dat == 0x03 ) && ( Rec_Dat == 0x01 ))
{
P40 = 0;
P00 = 0;
Uart2_SendStr( "打开成功!\r\n" );
}
else if( ( Rec_Dat == 0x01) && ( Rec_Dat == 0x02 ) && ( Rec_Dat == 0x03 ) && ( Rec_Dat == 0x04 ) && ( Rec_Dat == 0x05 ))
{
P40 = 1;
P00 = 1;
Uart2_SendStr( "关闭成功!\r\n" );
}
Rec_Num = 0;
}
}
}
//<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
// 在此添加用户函数实现代码
//<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
哈哈一样的代码 你的可以 我的就不行
ercircle
发表于 2025-5-16 08:24:20
小熊熊 发表于 2025-5-15 23:23
代码一样那就排查别的问题了,
哪一步不行,
之前用过串口没,线接对着没,
用的什么硬件,硬件好着没
串口软件用的哪个,发的报文是hex还是字符串。
等等,信息提供详细点。
再不行就是串口线上逻辑分析仪抓包呗。