标题: 对讲机模块,用串口助手发AT命令,返回OK,用单片机发送,模块没有反应。 [打印本页]

作者: 51beginner    时间: 2021-2-28 15:38
标题: 对讲机模块,用串口助手发AT命令,返回OK,用单片机发送,模块没有反应。
本帖最后由 51beginner 于 2021-2-28 21:05 编辑

一片对讲机模块,用串口助手发送AT+DMOVERQ,模块返回版本信息,用单片机串口发送同样的命令,对讲机模块没有返回数据,通过串口助手查看这两条命令的字符串,是一模一样的,可结果不一样。我要的结果是直接用单片机控制对讲机模块,而不是用电脑通过串口助手控制模块,可是同样的命令,结果却不同,不知是电平问题还是程序问题,求大家给予指点。
#include<reg52.h>
// char code fs[]={"AT+DMOSETGROUP=0,409.7500,409.7500,02,3\r\n"} ;
unsigned char fs[]={"AT+DMOVERQ\r\n"};
unsigned int i,a,bz;

void csh()  //串口初始化
{
TMOD=0X20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}

void main()
{
csh();
while(1)
{
if(bz==1)
{
ES=0;
for (i=0;i<13;i++)
{
SBUF=fs;
while(!TI);
TI=0;
}
ES=1;
bz=0;
}
}
}
void chk() interrupt 4
{
RI=0;
a=SBUF;
bz=1;
}




作者: wulin    时间: 2021-2-28 17:44
你这串口中断程序中a只能保存最后一个字符,前面的数据都被覆盖了。要按字符串长度保存。

unsigned char js[x];//接收缓存,x=数据长度

void chk() interrupt 4
{
        static char num=0;
        RI=0;
        js[num]=SBUF;//收到的字符串按字节保存在缓存
        if(js[0]=='y')        //验证数据头,y=字符串首字节
        {
                num++;
                if(num>=x)//达到x长度,接收结束。
                {
                        num=0;
                        bz=1;
                }
        }
}
作者: 51beginner    时间: 2021-2-28 21:15
wulin 发表于 2021-2-28 17:44
你这串口中断程序中a只能保存最后一个字符,前面的数据都被覆盖了。要按字符串长度保存。

unsigned char ...

我只是想用单片机发送AT命令控制对讲机模块,只要模块对单片机发送的命令有响应就行,单片机不用接收返回的数据。
现在的情况就是,在串口助手里看到的两个同样字符串却产生了不一样的结果,应该有一个关键的步骤没有做对,可我就是找不出来。很是郁闷。
作者: wulin    时间: 2021-3-1 08:01
51beginner 发表于 2021-2-28 21:15
我只是想用单片机发送AT命令控制对讲机模块,只要模块对单片机发送的命令有响应就行,单片机不用接收返回 ...

串口只发不收不必开串口中断。你原来程序是要等串口收到数据后bz=1;才能发送,不能主动发送。给你改为定时1秒发送一次。也可改为按键控制发送方式。
#include<reg52.h>
// char code fs[]={"AT+DMOSETGROUP=0,409.7500,409.7500,02,3\r\n"} ;
unsigned char fs[]={"AT+DMOVERQ\r\n"};
unsigned int i,a,bz;

void csh()  //串口初始化
{
        TMOD=0X21;
        TH1=0xfd;
        TL1=0xfd;
        TH0=0x4C;
        TL0=0x00;
        TR1=1;
        TR0=1;
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
//        ES=1;
        ET0=1;
}

void main()
{
        csh();
        while(1)
        {
                if(bz==1)
                {
//                        ES=0;
                        for (i=0;i<13;i++)
                        {
                                SBUF=fs;
                                while(!TI);
                                TI=0;
                        }
//                        ES=1;
                        bz=0;
                }
        }
}
/*
void chk() interrupt 4
{
        RI=0;
        a=SBUF;
        bz=1;
}*/

void Timer0Interrupt(void) interrupt 1
{
        TH0=0x4C;
        TL0=0x00;
        a++;
        if(a>=20)//1秒
        {
                a=0;
                bz=1;
        }
}

作者: 51beginner    时间: 2021-3-1 22:02
真是听君一席话,胜读十年书,按照您的指导,关闭中断,所有的问题迎刃而解,向您表示万分的感谢。
单片机程序是按照 郭天祥 的教程移植的,用串口助手确定单片机能发出正确的命令字符串后,就再没有仔细分析过,然后就开始折腾,先是买了5V转3V的电平转换模块,不顶事,然后又自己做了个有三个接头的杜邦线,连接串口助手,单片机和对讲机模块,看到一模一样的字符串,却产生不同的结果,很无奈。我已经把朋友的示波器搬回来,准备查看波形了,虽然我不懂怎么使用示波器。没想到兜了这么大的一个圈子解决不了的问题,被你一句话,一个注释符就完美解决了,看来论坛里还是有高人的。
再次向您表示感谢。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1