如何通过AT命令来操作MODEM;

linwd 2004-07-02 02:16:20
如题,急

怎样建立连接,发送及接受数据等
有示例代码更佳

感激不尽!!
...全文
513 34 打赏 收藏 转发到动态 举报
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)

2,644

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧