社区
硬件/系统
帖子详情
如何通过AT命令来操作MODEM;
linwd
2004-07-02 02:16:20
如题,急
怎样建立连接,发送及接受数据等
有示例代码更佳
感激不尽!!
...全文
513
34
打赏
收藏
如何通过AT命令来操作MODEM;
如题,急 怎样建立连接,发送及接受数据等 有示例代码更佳 感激不尽!!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
34 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
linwd
2004-07-03
打赏
举报
回复
我们周末也要上班!
搞定了,原来是每个命令后面要加\r\n才能发送出去。因为在CreateFile的时候没指定读。
感谢!
zhangnanonnet
2004-07-02
打赏
举报
回复
明天是周末哦。。。。。。。
linwd
2004-07-02
打赏
举报
回复
还是不行,不知道什么问题。我下班了,明天再向你请教
今天麻烦你了,先谢过了。
zhangnanonnet
2004-07-02
打赏
举报
回复
或者你直接在LINK的代码中加入设置波特率
在createfile之后
int ZComm::set_baudrate(int baud_rate)
{
DCB dcb;
BOOL fsuccess;
fsuccess = GetCommState(idComDev, &dcb);
if (!fsuccess) return 0;
dcb.BaudRate =baud_rate;
dcb.ByteSize =8; //number of bits/byte, 4-8
dcb.Parity =NOPARITY;
dcb.StopBits =ONESTOPBIT;
dcb.EvtChar=0x02;
/*
dcb.fOutxCtsFlow = 1;
dcb.fDtrControl = 1;
dcb.fRtsControl = 2;
dcb.EofChar = 0;
*/
dcb.fOutxCtsFlow = 0;
dcb.fDtrControl = 0;
dcb.fRtsControl = 2;
dcb.EofChar = 0;
//dcb.fNull=TRUE;
fsuccess=SetCommState(idComDev, &dcb);
if (!fsuccess) return 0;
return 1;
}
应该就可以了
zhangnanonnet
2004-07-02
打赏
举报
回复
szPort 赋值"\\\\.\\com3", Baud_rate就是波特率,比如9600,115200之类的
zhangnanonnet
2004-07-02
打赏
举报
回复
可能是波特率的问题,你把打开串口的那部分(link)换成下面的代码试试
ZComm::open(char *szPort,int Baud_rate)
{
int retbuflength=0;
idComDev=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
0, //is overlapped or no
NULL );
if (idComDev==(HANDLE) -1){
DWORD RR=GetLastError();
CloseHandle(idComDev) ;
fCOMMOpened=0;
return (0);
}
set_baudrate(Baud_rate);
fCOMMOpened=1;
SetupComm(idComDev,11520,2048);
PurgeComm(idComDev, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
SetCommMask(idComDev, EV_RXFLAG );
//set time out
SetTimeOut(10,50,800);
return (1);
}
BOOL ZComm::SetTimeOut(DWORD ReadIntervalTimeout,
DWORD ReadTotalTimeoutMultiplier,
DWORD ReadTotalTimeoutConstant)
{
COMMTIMEOUTS timeouts;
GetCommTimeouts(idComDev,&timeouts);
timeouts.ReadIntervalTimeout=ReadIntervalTimeout;
timeouts.ReadTotalTimeoutMultiplier=ReadTotalTimeoutMultiplier;
timeouts.ReadTotalTimeoutConstant=ReadTotalTimeoutConstant;
return SetCommTimeouts(idComDev,&timeouts);
}
int ZComm::set_baudrate(int baud_rate)
{
DCB dcb;
BOOL fsuccess;
fsuccess = GetCommState(idComDev, &dcb);
if (!fsuccess) return 0;
dcb.BaudRate =baud_rate;
dcb.ByteSize =8; //number of bits/byte, 4-8
dcb.Parity =NOPARITY;
dcb.StopBits =ONESTOPBIT;
dcb.EvtChar=0x02;
/*
dcb.fOutxCtsFlow = 1;
dcb.fDtrControl = 1;
dcb.fRtsControl = 2;
dcb.EofChar = 0;
*/
dcb.fOutxCtsFlow = 0;
dcb.fDtrControl = 0;
dcb.fRtsControl = 2;
dcb.EofChar = 0;
//dcb.fNull=TRUE;
fsuccess=SetCommState(idComDev, &dcb);
if (!fsuccess) return 0;
return 1;
}
linwd
2004-07-02
打赏
举报
回复
好象命令根本就没发送出去,是不是有什么缓冲区要刷新的。
linwd
2004-07-02
打赏
举报
回复
我都改成一个了,两个都返回 true了,
可是我发送了命令好象没有被执行。怪了
zhangnanonnet
2004-07-02
打赏
举报
回复
你的link和SendStrCommand都返回true了?
zhangnanonnet
2004-07-02
打赏
举报
回复
对了,我给你的代码串口的句柄好像发送和接收是不一样的,你要确保他们的句柄都是LINK打开时候的句柄才行,你跟踪一下,是不是句柄无效的问题
linwd
2004-07-02
打赏
举报
回复
还是没反映
if(Link()){
puts("ok");
if (SendStrCommand("AT+GMM\r")) {
puts("send command ok");
Sleep(5000);
cout << ReceiveATInfo() << endl;;
}
Unlink();
}
else
puts("failed");
zhangnanonnet
2004-07-02
打赏
举报
回复
是有个时间差,但是很短。。。。sleep(10)就应该差不多了,如果单步调试都不能收到的话就是接收的有问题,你怎么决定AT指令发送成功了,是发ATD...拨大一个电话那个电话有反映吗?
linwd
2004-07-02
打赏
举报
回复
不知道是怎么会事,发什么命令都没有返回字符。
在调用发送指令后,马上调用获取返回值可以吗。中间是不是有个时间差
zhangnanonnet
2004-07-02
打赏
举报
回复
发送完了接收之前最好sleep(10)左右,具体的时间你可以自己测试一下
linwd
2004-07-02
打赏
举报
回复
呵呵,分当然不是问题。
多谢,不过好象还不能接收返回字符。一会就给分。
zhangnanonnet
2004-07-02
打赏
举报
回复
以下是一段我以前写的查找MODEM的代码,可能对你有用
我把通讯什么的都封装了,比如ResearchDev什么的,你就看过程就可以了
CString sDevComm, RetInfo;
int i, iBaut[] = {/*2400, 4800,*/ 9600, 14400, 19200, 38400, 57600, 115200};
char cInfo[100], cBaut[10];
memset(cInfo, 0, 100);
memset(cBaut, 0, 10);
i = 0;
m_Status2.SetWindowText("正在搜索GPRS设备...");
do
{
sDevComm = theApp.ResearchDev(iBaut[i]);
i++;
}
while(sDevComm.GetLength() == 0 && i<=16);
if (sDevComm.GetLength() == 0)
{
theApp.mobile.CloseComm();
m_Status2.SetWindowText("没有搜索到设备");
}
else
{
theApp.mobile.CloseComm();
sprintf(cInfo,
"搜索到设备在%s/%dbps,点击\"修改>>\"可以将设备设置更改到普通操作状态",
sDevComm, iBaut[i-1]);
sprintf(cBaut, "%d", iBaut[i-1]);
m_Baut1.SetWindowText(cBaut);
m_Status2.SetWindowText(cInfo);
}
zhangnanonnet
2004-07-02
打赏
举报
回复
哥们,我就差你这100分就10000分了。。。多多支持啊。
zhangnanonnet
2004-07-02
打赏
举报
回复
是的,一般这种通讯软件都是第一次一个一个找,每个MODEM都有一个指定的设备号,可以通过AT指令找到,或者你就发AT,那个COM返回OK你也可以认为是(这样就可能有多个MODEM连接你只选择第一个的情况,看你的实际情况了),当然在找的时候还有可能波特率不同,都是在第一次初始化的时候试出来的,然后把这些信息保留在一个INI文件中,下次就可以直接打开了。
linwd
2004-07-02
打赏
举报
回复
好了,能连上了。非常感谢。
现在就是有个问题,在我的机子上是COM3,在别人的机子上不一定是这个吧。
我怎么能获得哪个才是,难道要一个个试吗
zhangnanonnet
2004-07-02
打赏
举报
回复
怎么不行。。什么反应。
加载更多回复(14)
modem
at
命令
集
有兴趣要查看
modem
at
命令
的可以看看
GSM
MODEM
AT
命令
手册.pdf
GSM
MODEM
AT
命令
手册.pdfGSM
MODEM
AT
命令
手册.pdfGSM
MODEM
AT
命令
手册.pdfGSM
MODEM
AT
命令
手册.pdf
MTK AT
命令
log工具 Cacher
MTK 抓取和解析
Modem
Log的PC端工具, 经常使用来查看
Modem
Log
通过AT指令修改NV文件值的
操作
指引.docx
通过AT指令修改NV文件值的
操作
指引.docx
java调用
modem
执行at指令
java调用
modem
执行at指令,一般用来做计算机端的电话
操作
等等
硬件/系统
2,644
社区成员
17,232
社区内容
发帖
与我相关
我的任务
硬件/系统
VC/MFC 硬件/系统
复制链接
扫一扫
分享
社区描述
VC/MFC 硬件/系统
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章