modem问题:如何向modem发送AT command,并接收其返回值

huaboy2004 2005-11-19 09:29:16
如题!
另外如果能实现向其发送数据包,并接收校验更好。
网上有个PassMark ModemTest,功能好像就是这样的,但是就是不知道实现原理。
哪位大侠对modem有所研究的话,望不吝赐教,谢谢。

PS:哪位感兴趣的,可以先看看PassMark的小软件
http://www.passmark.com/download/index.htm
...全文
340 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
huaboy2004 2006-03-11
  • 打赏
  • 举报
回复
能不能把BreaKing和38062708的分调过来,斑竹帮帮忙了,谢谢。
huaboy2004 2006-03-11
  • 打赏
  • 举报
回复
靠,给分也给错了
怎么能改回来
huaboy2004 2006-03-11
  • 打赏
  • 举报
回复
郁闷,结贴!
38062708 2005-12-06
  • 打赏
  • 举报
回复
向 MODEM 发送数据包?

不懂你的意思,我推测是向 MODEM 连接的另一端 PC 发送数据包。

通常应该先拨号,ATD 电话号码,记得加“;”
然后就可以传输数据了,返回命令状态发命令“+++”
挂断用ATH
BreaKing 2005-12-03
  • 打赏
  • 举报
回复
你的那个串口类做得也太简单了...
你能保证writefile或者readfile的时候不会出错吗?
向modem发数据的方式估计要到modem厂商网站上查询资料了
huaboy2004 2005-11-29
  • 打赏
  • 举报
回复
我上面所说的都是基于一台PC加上一个modem,不是要两个modem之间的数据传送
huaboy2004 2005-11-29
  • 打赏
  • 举报
回复
现在就差另外一个问题了,如何向modem发送一个数据包,并且校验接收是否正确。
不知道需要对modem做什么设置,才能让其有这样的功能,大家提供一下思路啊,谢谢了!
huaboy2004 2005-11-29
  • 打赏
  • 举报
回复
发送AT command的问题解决了,大概就是沿用下面的思路,大家可以参考一下。


下面是打开、写入、读出串口数据的函数实现
#include "StdAfx.h"
#include ".\commanager.h"
#using <mscorlib.dll>

//#include "Windows.h"
//#include "Winbase.h"
//API Requirements
//Header: Declared in Winbase.h; include Windows.h.
//Library: Use Kernel32.lib.

comManager::comManager(void)
{
}

comManager::~comManager(void)
{
}

// 串口设置
void comManager::SetCommPort()
{
DCB dcb;

DWORD dwError;
BOOL fSuccess;

hCom=CreateFile("COM1",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,// non-overlapped
NULL
);
if(hCom == INVALID_HANDLE_VALUE)
{
//To get extended error information, call GetLastError
dwError = GetLastError();

MessageBox(NULL,"ERROR","OK",MB_OK);

return;
}

// 获取串口当前配置
fSuccess = GetCommState(hCom,&dcb);
if(!fSuccess)
{
MessageBox(NULL,"Get configuration port has problem","OK",MB_OK);
return;
}

// 设置串口参数
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = 19200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;

fSuccess = SetCommState(hCom,&dcb);
if(!fSuccess)
{
MessageBox(NULL,"Failed to open ComProt","OK",MB_OK);

return;
}
else
{
MessageBox(NULL,"ComPort Opened","OK",MB_OK);
}

// COMMTIMEOUTS对象,以毫秒为单位
COMMTIMEOUTS comTimeOut;
// 接收时,两字符间最大的时延
comTimeOut.ReadIntervalTimeout = MAXDWORD;//3;
// 读取每字节的超时.
comTimeOut.ReadTotalTimeoutMultiplier = 10;//3;
// 读串口数据的固定超时
// 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant
comTimeOut.ReadTotalTimeoutConstant = 10;//2;
// 写每字节的超时.
comTimeOut.WriteTotalTimeoutMultiplier = 20;//3;
// 写串口数据的固定超时
comTimeOut.WriteTotalTimeoutConstant = 50;//2;

// 将超时参数写入设备控制.
SetCommTimeouts(hCom,&comTimeOut);

// 设置输入/出缓冲
SetupComm(hCom,1024,512);

// 清空输入/出缓冲
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
}

// 读取串口
void comManager::ReadPort(char strReceive[], int length)
{
BOOL rf;
unsigned long nNum;

// 读取length字节到strReceive[]缓冲区
rf = ReadFile(hCom, strReceive, length, &nNum, ULL);

if(!rf)
{
MessageBox(NULL,"read failed","OK",MB_OK);
}
}

// 写入串口
void comManager::WritePort(char strSend)
{
BOOL wf;
unsigned long nNum;

// 写入一个字节
wf = WriteFile(hCom, &strSend, 1, &nNum, NULL);

if(!wf)
{
MessageBox(NULL,"write failed","OK",MB_OK);
}
}

// 关闭串口
BOOL comManager::Close()
{
if(hCom != INVALID_HANDLE_VALUE)
{
return CloseHandle(hCom);
}
return true;
}
////////////////////////////////////

这里是发送AT指令的源码,发送"AT"应该返回"OK"
// 发送AT指令
private: System::Void btnCmd_Click(System::Object * sender, System::EventArgs * e)
{
char strSend[] = {'A', 'T', '\r'};// '\r'
char strReceive[1024];
int length;

for(int i=0; i<3; i++)
{
this->m_comManager->WritePort(strSend[i]);// 写入串口
}

length = S"OK"->Length;
this->m_comManager->ReadPort(strReceive, length);// 读取串口
for(int j=0; j<length; j++)
{
textBoxReceive->Text = String::Concat(textBoxReceive->Text, strReceive[j].ToString());
}
}
Pipi0714 2005-11-23
  • 打赏
  • 举报
回复
只要有个控制串口的类即可。AT指令只要上网或者正规厂家的Modem在说明书中都有
yayaniuniu502 2005-11-20
  • 打赏
  • 举报
回复
帮顶一个,难!

2,644

社区成员

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

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