找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 2153|回復(fù): 4
收起左側(cè)

對(duì)講機(jī)模塊,用串口助手發(fā)AT命令,返回OK,用單片機(jī)發(fā)送,模塊沒(méi)有反應(yīng)。

[復(fù)制鏈接]
ID:704846 發(fā)表于 2021-2-28 15:38 | 顯示全部樓層 |閱讀模式
本帖最后由 51beginner 于 2021-2-28 21:05 編輯

一片對(duì)講機(jī)模塊,用串口助手發(fā)送AT+DMOVERQ,模塊返回版本信息,用單片機(jī)串口發(fā)送同樣的命令,對(duì)講機(jī)模塊沒(méi)有返回?cái)?shù)據(jù),通過(guò)串口助手查看這兩條命令的字符串,是一模一樣的,可結(jié)果不一樣。我要的結(jié)果是直接用單片機(jī)控制對(duì)講機(jī)模塊,而不是用電腦通過(guò)串口助手控制模塊,可是同樣的命令,結(jié)果卻不同,不知是電平問(wèn)題還是程序問(wèn)題,求大家給予指點(diǎn)。
#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;
}



回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-2-28 17:44 | 顯示全部樓層
你這串口中斷程序中a只能保存最后一個(gè)字符,前面的數(shù)據(jù)都被覆蓋了。要按字符串長(zhǎng)度保存。

unsigned char js[x];//接收緩存,x=數(shù)據(jù)長(zhǎng)度

void chk() interrupt 4
{
        static char num=0;
        RI=0;
        js[num]=SBUF;//收到的字符串按字節(jié)保存在緩存
        if(js[0]=='y')        //驗(yàn)證數(shù)據(jù)頭,y=字符串首字節(jié)
        {
                num++;
                if(num>=x)//達(dá)到x長(zhǎng)度,接收結(jié)束。
                {
                        num=0;
                        bz=1;
                }
        }
}
回復(fù)

使用道具 舉報(bào)

ID:704846 發(fā)表于 2021-2-28 21:15 | 顯示全部樓層
wulin 發(fā)表于 2021-2-28 17:44
你這串口中斷程序中a只能保存最后一個(gè)字符,前面的數(shù)據(jù)都被覆蓋了。要按字符串長(zhǎng)度保存。

unsigned char ...

我只是想用單片機(jī)發(fā)送AT命令控制對(duì)講機(jī)模塊,只要模塊對(duì)單片機(jī)發(fā)送的命令有響應(yīng)就行,單片機(jī)不用接收返回的數(shù)據(jù)。
現(xiàn)在的情況就是,在串口助手里看到的兩個(gè)同樣字符串卻產(chǎn)生了不一樣的結(jié)果,應(yīng)該有一個(gè)關(guān)鍵的步驟沒(méi)有做對(duì),可我就是找不出來(lái)。很是郁悶。
回復(fù)

使用道具 舉報(bào)

ID:213173 發(fā)表于 2021-3-1 08:01 | 顯示全部樓層
51beginner 發(fā)表于 2021-2-28 21:15
我只是想用單片機(jī)發(fā)送AT命令控制對(duì)講機(jī)模塊,只要模塊對(duì)單片機(jī)發(fā)送的命令有響應(yīng)就行,單片機(jī)不用接收返回 ...

串口只發(fā)不收不必開(kāi)串口中斷。你原來(lái)程序是要等串口收到數(shù)據(jù)后bz=1;才能發(fā)送,不能主動(dòng)發(fā)送。給你改為定時(shí)1秒發(fā)送一次。也可改為按鍵控制發(fā)送方式。
#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;
        }
}
回復(fù)

使用道具 舉報(bào)

ID:704846 發(fā)表于 2021-3-1 22:02 | 顯示全部樓層
真是聽(tīng)君一席話,勝讀十年書(shū),按照您的指導(dǎo),關(guān)閉中斷,所有的問(wèn)題迎刃而解,向您表示萬(wàn)分的感謝。
單片機(jī)程序是按照 郭天祥 的教程移植的,用串口助手確定單片機(jī)能發(fā)出正確的命令字符串后,就再?zèng)]有仔細(xì)分析過(guò),然后就開(kāi)始折騰,先是買了5V轉(zhuǎn)3V的電平轉(zhuǎn)換模塊,不頂事,然后又自己做了個(gè)有三個(gè)接頭的杜邦線,連接串口助手,單片機(jī)和對(duì)講機(jī)模塊,看到一模一樣的字符串,卻產(chǎn)生不同的結(jié)果,很無(wú)奈。我已經(jīng)把朋友的示波器搬回來(lái),準(zhǔn)備查看波形了,雖然我不懂怎么使用示波器。沒(méi)想到兜了這么大的一個(gè)圈子解決不了的問(wèn)題,被你一句話,一個(gè)注釋符就完美解決了,看來(lái)論壇里還是有高人的。
再次向您表示感謝。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表