串口调试助手控制esp8266串口中断问题? 50

串口接收的部分程序如下voidinit_uart()//串口初始化{EA=1;//打开总中断ES=1;//打开串口中断TR1=1;//打开定时器1SCON=0X50;//... 串口接收的部分程序如下
void init_uart() //串口初始化
{
EA = 1; //打开总中断
ES = 1; //打开串口中断
TR1 = 1; //打开定时器1
SCON = 0X50; //串口工作方式1
TMOD = 0X20; //定时器1工作方式2 工作于8位自动重载模式, 用于产生波特率
TH1 = 0XFD; //串口波特率9600
TL1 = 0XFD;
}
void uart_shou()//接收数据
{
if(flag_s_en == 1) //接收到设置的报警值
{
flag_s_en = 0;
if(Rxbuff[1] == 'T')
if(Rxbuff[2] == '4') //接收
{
key_can = 4; //得到按键值
}
if(Rxbuff[1] == 'T')
if(Rxbuff[2] == '3') //接收
{
key_can = 3; //得到按键值
}
if(Rxbuff[1] == 'T')
if(Rxbuff[2] == '2') //接收
{
key_can = 2; //得到按键值
}
if(Rxbuff[1] == 'T')
if(Rxbuff[2] == '1') //接收
{
key_can = 1; //得到按键值
}
}
}
void main() //主函数
{
init_1602(); //1602初始化
init_uart(); //串口初始化
LED = 0; //led开
delay_ms(1000);
LED = 1; //led关
P0 = P1 = P2 = P3 = 0xff;
ESP8266_SERVER(); //初始化ESP8266
while(1)
{
key();
if(key_can < 5)
{
key_with();
}
flag_300ms ++;
if(flag_300ms >= 300)
{
flag_300ms = 0;
clock_h_l(); //报警函数
shidu = ad0832read(1,0); //读出湿度
shidu = 99 - shidu * 99 / 255;
write_lcd2(1,9,shidu); //显示湿度等级
send_shuju(); //WIFI发送数据
}
uart_shou(); //接收WIFI数据
delay_ms(1);
}
}
void uatr0() interrupt 4 //串口中断程序
{
if(RI) //是否接收中断
{
RI = 0; //中断标志清零
Rxbuff[Rxnum]=SBUF; //接收串口数据 放到数组里面
Rxnum++;
if(Rxnum>=2) //接收完成
{
Rxnum=0;flag_s_en=1; //接收成功
}
}
}
在串口调试助手发送T1之后单片机没反应,程序是不是哪里有错误
展开
 我来答
阿明ykkk
2023-05-10 · 用心做事,诚恳做人
阿明ykkk
采纳数:15 获赞数:16

向TA提问 私信TA
展开全部

1在串口初始化函数中,TMOD被设置为0x20,这意味着定时器1是8位自动重载模式,但您的注释说它是用于产生波特率。这可能是一个错误,应该将TMOD设置为0x21,以使用定时器1作为16位自动重载模式,并用于产生波特率。

2在串口接收函数中,多个if语句用于检查接收到的数据。但是,这些if语句都只检查了第二个和第三个字节,而没有检查第一个字节。这可能会导致误判,因为一个完整的命令可能是由多个字节组成的。您可能需要在第一个if语句中检查整个命令,并仅在完整命令接收完成后设置标志位。

3在主函数的while循环中,当按下按键时,将调用key_with()函数,但是在您提供的代码中没有这个函数的实现。这可能会导致编译错误或运行时错误。

4您的代码没有检查ESP8266模块是否已经成功连接到Wi-Fi网络。在发送数据之前,您可能需要添加一些代码来确保ESP8266已成功连接到网络。

    以上是我发现的一些问题,希望对您有所帮助。至于您的具体问题,我无法判断单片机是否存在错误,因为我无法查看您的硬件环境。您可以尝试使用调试工具或者添加调试信息来确定问题的原因。

匿名用户
2023-05-10
展开全部

在代码中没有找到完整的信息,无法判断整个程序的正确性。但是,程序中如果串口调试助手已经成功发送了字符"T1",而单片机没有响应,则可能是以下原因导致的问题:

  • 波特率设置不正确,导致单片机无法正确接收串口数据。请确保单片机和串口调试助手的波特率设置相同,比如都设置为9600。

  • 串口通信时数据位、停止位、奇偶校验位等设置不正确。请确保单片机和串口调试助手的这些设置都一致。

  • 单片机中串口接收的缓存区已满,无法继续接收数据。可以在串口中断程序中加入缓存区满的处理方法。

  • 单片机串口硬件或软件出现故障,导致无法正确接收数据。可以检查单片机和串口电路的连接是否正确,是否存在损坏等问题。

  • 以上是可能导致问题的几个原因,您可以根据具体情况进行排查和调试。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友9bdf67d
2023-05-10
知道答主
回答量:26
采纳率:0%
帮助的人:1.2万
展开全部
可以考虑以下几个方面:
1. 检查串口连线是否正确,是否按照通信协议进行配置。
2. 检查芯片数据手册,确保波特率、数据位、停止位、校验方式等参数设置正确。
3. 检查程序中接收数据的长度和格式是否正确。在本程序中,需要连续接收2个字符,才能判断接收完成。所以可以先在程序中添加一些调试信息,检查程序是否正确接收了数据。
4. 在检查其他函数的实现,如是否存在死循环或者阻塞现象,是否干扰了Serial口中断的正常处理。
建议您在调试过程中,可以添加调试信息输出,以便更好地定位问题所在。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
认真答却总被删BAIDU我凭什么同情你
2023-05-10 · TA获得超过444个赞
知道小有建树答主
回答量:1800
采纳率:79%
帮助的人:100万
展开全部

根据您提供的代码,我发现以下几个问题:

  • 在 uart_shou() 函数中,你在检查 Rxbuff 数组的值时使用了多个 if 语句。这会导致程序逻辑混乱。你应该使用嵌套的 if 语句或 else if 语句来简化代码:

void uart_shou() //接收数据
{
if(flag_s_en == 1) //接收到设置的报警值
{
flag_s_en = 0;
if(Rxbuff[1] == 'T') {
if(Rxbuff[2] == '4') //接收
{
key_can = 4; //得到按键值
}
else if(Rxbuff[2] == '3') //接收
{
key_can = 3; //得到按键值
}
else if(Rxbuff[2] == '2') //接收
{
key_can = 2; //得到按键值
}
else if(Rxbuff[2] == '1') //接收
{
key_can = 1; //得到按键值
}
}
}
}

  • 在 uatr0() 函数中,你应该清除 TI(发送中断)标志。虽然你的代码中没有发送数据,但在未来如果需要发送数据,这是个好习惯。

void uatr0() interrupt 4 //串口中断程序
{
if(RI) //是否接收中断
{
RI = 0; //中断标志清零
Rxbuff[Rxnum]=SBUF; //接收串口数据 放到数组里面
Rxnum++;
if(Rxnum>=2) //接收完成
{
Rxnum=0;flag_s_en=1; //接收成功
}
}
if (TI) // 是否发送中断
{
TI = 0; // 中断标志清零
}
}

请尝试修改这些问题,并确保你的硬件连接正确。如果问题仍然存在,我建议你检查 ESP8266 是否成功初始化,并确保你的单片机和串口调试助手的波特率设置相同。

追问
esp8266初始化了,发送中断标志位在前边清零了,程序没问题的话我在串口助手发送什么指令能控制单片机是T1,T2,T3,T4吗
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
民间高手wf
2023-05-10
知道答主
回答量:9
采纳率:0%
帮助的人:3571
展开全部

根据您提供的代码,可能有以下原因导致单片机无法接收到串口调试助手发送的数据:

  • 波特率设置不正确:您的串口通信波特率设置为 9600,需要确认串口调试助手的波特率设置是否正确。

  • 外围电路连接问题:检查单片机外围电路中有关串口收发的连接是否正确,例如串口调试助手与单片机是否共地(交流连接)。

  • 缓冲区溢出:您的接收缓冲区 Rxbuff 数组大小是 1,该数组只能接收一个字节的数据,如果接收到的数据超过一个字节,将会导致缓冲区溢出,可能会影响数据的接收。

  • 其他原因:如硬件故障等,导致单片机无法正常接收到串口调试助手发送的数据。

  • 您可以尝试以下排查步骤:

  • 确认串口调试助手的波特率设置是否正确,与单片机的波特率设置一致。

  • 测试外围电路中串口收、发线路是否连接正确。

  • 尝试增大接收缓冲区 Rxbuff 数组的大小,确保能够正常接收数据。

  • 如果以上步骤无法解决问题,您可以尝试用 OLS 逻辑分析仪或示波器等工具检查串口的硬件信号和波形,从而定位问题所在。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式