找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2139|回复: 4
打印 上一主题 下一主题
收起左侧

对讲机模块,用串口助手发AT命令,返回OK,用单片机发送,模块没有反应。

[复制链接]
跳转到指定楼层
楼主
ID:704846 发表于 2021-2-28 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 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;
                }
        }
}
回复

使用道具 举报

板凳
ID:704846 发表于 2021-2-28 21:15 | 只看该作者
wulin 发表于 2021-2-28 17:44
你这串口中断程序中a只能保存最后一个字符,前面的数据都被覆盖了。要按字符串长度保存。

unsigned char ...

我只是想用单片机发送AT命令控制对讲机模块,只要模块对单片机发送的命令有响应就行,单片机不用接收返回的数据。
现在的情况就是,在串口助手里看到的两个同样字符串却产生了不一样的结果,应该有一个关键的步骤没有做对,可我就是找不出来。很是郁闷。
回复

使用道具 举报

地板
ID:213173 发表于 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;
        }
}
回复

使用道具 举报

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表