VC6.0中Mscomm控件收发数据

雪梨梨梨 2017-08-28 05:21:40
Mscomm控件中我需要先发送AT指令,等到返回ok即接收到OK,再发AT指令,直至完成sim900的初始化,这应该怎么实现呢?
...全文
202 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪梨梨梨 2017-08-31
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:

BOOL CHMI_manApp::SendCommand2Modem(char *command,char *ecko)
{
	return FALSE;
//
// ready to ask
	if(!m_pPpiManager) return FALSE; 
//
	ULONG ulBytesRead;
	ULONG ulBytesWritten;
	OVERLAPPED oReadOverlapped,oWriteOverlapped;
	DWORD dwWaitReadResult,dwWaitWriteResult;
//
	memset(&oReadOverlapped,0,sizeof(OVERLAPPED));
	oReadOverlapped.hEvent=m_PPIhReadEvent;
//
	memset(&oWriteOverlapped,0,sizeof(OVERLAPPED));
	oWriteOverlapped.hEvent=m_PPIhWriteEvent;

// reset Events
	ResetEvent(m_PPIhReadEvent);
	ResetEvent(m_PPIhWriteEvent);
	BOOL  bResult=0;
//	
	PurgeComm (m_PPIhComPort,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
// write "+++" make modem state changed from data mode to command mode 
	bResult=WriteFile(m_PPIhComPort,// handle to file
					  command,      // 
					  strlen(command),// number of bytes to write
					  &ulBytesWritten,   // number of bytes written
					  &oWriteOverlapped);// overlapped buffer
	if (!bResult)
	{// io_pending
		if (GetLastError()!=ERROR_IO_PENDING)
		{
			AfxMessageBox(IDS_COMTR_IO_ERR);
			return FALSE;
		}
	}	
//write command
	dwWaitWriteResult=WaitForSingleObject(m_PPIhWriteEvent,100);
	switch (dwWaitWriteResult)
	{
		case WAIT_FAILED://-1
			AfxMessageBox(IDS_COMTR_IO_ERR);
			return FALSE;
		break;
		case WAIT_TIMEOUT://0x0102
			AfxMessageBox(IDS_COMTR_IO_ERR);
			return FALSE;
		break;
	}
//get ulBytesWritten 
//	bResult=GetOverlappedResult(m_PPIhComPort,&oWriteOverlapped,&ulBytesWritten,FALSE); 
	Sleep(100);// wait answer chars
//read answer
	char  StateOK[MAX_PATH]={0};
	int jj;
	for (jj=0;jj<sizeof(StateOK);jj++)
	{// we don't know how many chars will be received !
		bResult=ReadFile(m_PPIhComPort,&StateOK[jj],1,&ulBytesRead,&oReadOverlapped);
		if (!bResult)
		{// io_pending
			if (GetLastError()!=ERROR_IO_PENDING)
			{
				AfxMessageBox(IDS_COMTR_IO_ERR);
				return FALSE;
			}
		}	
	//
		dwWaitReadResult=WaitForSingleObject(m_PPIhReadEvent,10);
		switch (dwWaitReadResult)
		{
			case WAIT_FAILED://-1
				AfxMessageBox(IDS_COMTR_IO_ERR);
				return FALSE;
			break;
			case WAIT_OBJECT_0:
				bResult=GetOverlappedResult(m_PPIhComPort,&oReadOverlapped,&ulBytesRead,FALSE); 
				if (bResult==0) return FALSE;
				if(ulBytesRead !=0 )
				{//"ATZ 0x0d 0x0d 0x0a OK 0x0d 0x0a" len=10
					oReadOverlapped.Offset+=ulBytesRead;
				 // for next
				}
				else
				{
					AfxMessageBox(IDS_COMTR_IO_ERR);
					return FALSE;
				}
			break;
			case WAIT_TIMEOUT://0x0102
				if(oReadOverlapped.Offset!=0)
				{
					if(ecko) strcpy(ecko,StateOK);
					return TRUE;
				}
				else
				{
					//AfxMessageBox("Time out");
					return FALSE;
				}
			break;
		}//end switch (dwWaitReadResult)
	}// end for 
	if(jj==sizeof(StateOK)) return FALSE;// string too long
//
	return TRUE;
}
SendCommand2Modem(char *command,char *ecko)
谢谢你。
schlafenhamster 2017-08-30
  • 打赏
  • 举报
回复

BOOL CHMI_manApp::SendCommand2Modem(char *command,char *ecko)
{
	return FALSE;
//
// ready to ask
	if(!m_pPpiManager) return FALSE; 
//
	ULONG ulBytesRead;
	ULONG ulBytesWritten;
	OVERLAPPED oReadOverlapped,oWriteOverlapped;
	DWORD dwWaitReadResult,dwWaitWriteResult;
//
	memset(&oReadOverlapped,0,sizeof(OVERLAPPED));
	oReadOverlapped.hEvent=m_PPIhReadEvent;
//
	memset(&oWriteOverlapped,0,sizeof(OVERLAPPED));
	oWriteOverlapped.hEvent=m_PPIhWriteEvent;

// reset Events
	ResetEvent(m_PPIhReadEvent);
	ResetEvent(m_PPIhWriteEvent);
	BOOL  bResult=0;
//	
	PurgeComm (m_PPIhComPort,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
// write "+++" make modem state changed from data mode to command mode 
	bResult=WriteFile(m_PPIhComPort,// handle to file
					  command,      // 
					  strlen(command),// number of bytes to write
					  &ulBytesWritten,   // number of bytes written
					  &oWriteOverlapped);// overlapped buffer
	if (!bResult)
	{// io_pending
		if (GetLastError()!=ERROR_IO_PENDING)
		{
			AfxMessageBox(IDS_COMTR_IO_ERR);
			return FALSE;
		}
	}	
//write command
	dwWaitWriteResult=WaitForSingleObject(m_PPIhWriteEvent,100);
	switch (dwWaitWriteResult)
	{
		case WAIT_FAILED://-1
			AfxMessageBox(IDS_COMTR_IO_ERR);
			return FALSE;
		break;
		case WAIT_TIMEOUT://0x0102
			AfxMessageBox(IDS_COMTR_IO_ERR);
			return FALSE;
		break;
	}
//get ulBytesWritten 
//	bResult=GetOverlappedResult(m_PPIhComPort,&oWriteOverlapped,&ulBytesWritten,FALSE); 
	Sleep(100);// wait answer chars
//read answer
	char  StateOK[MAX_PATH]={0};
	int jj;
	for (jj=0;jj<sizeof(StateOK);jj++)
	{// we don't know how many chars will be received !
		bResult=ReadFile(m_PPIhComPort,&StateOK[jj],1,&ulBytesRead,&oReadOverlapped);
		if (!bResult)
		{// io_pending
			if (GetLastError()!=ERROR_IO_PENDING)
			{
				AfxMessageBox(IDS_COMTR_IO_ERR);
				return FALSE;
			}
		}	
	//
		dwWaitReadResult=WaitForSingleObject(m_PPIhReadEvent,10);
		switch (dwWaitReadResult)
		{
			case WAIT_FAILED://-1
				AfxMessageBox(IDS_COMTR_IO_ERR);
				return FALSE;
			break;
			case WAIT_OBJECT_0:
				bResult=GetOverlappedResult(m_PPIhComPort,&oReadOverlapped,&ulBytesRead,FALSE); 
				if (bResult==0) return FALSE;
				if(ulBytesRead !=0 )
				{//"ATZ 0x0d 0x0d 0x0a OK 0x0d 0x0a" len=10
					oReadOverlapped.Offset+=ulBytesRead;
				 // for next
				}
				else
				{
					AfxMessageBox(IDS_COMTR_IO_ERR);
					return FALSE;
				}
			break;
			case WAIT_TIMEOUT://0x0102
				if(oReadOverlapped.Offset!=0)
				{
					if(ecko) strcpy(ecko,StateOK);
					return TRUE;
				}
				else
				{
					//AfxMessageBox("Time out");
					return FALSE;
				}
			break;
		}//end switch (dwWaitReadResult)
	}// end for 
	if(jj==sizeof(StateOK)) return FALSE;// string too long
//
	return TRUE;
}
SendCommand2Modem(char *command,char *ecko)
雪梨梨梨 2017-08-30
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
百度搜相关关键字。
没有这种又收又发的形式
雪梨梨梨 2017-08-30
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
// if(!m_ModemAT.IsEmpty()) // {// execute AT command // m_ModemAT+="\r"; // char ecko[MAX_PATH]={0}; // if(pApp->SendCommand2Modem((LPTSTR)(LPCTSTR)m_ModemAT,ecko)) // { // AfxMessageBox(ecko); // m_ModemAT=""; // UpdateData(FALSE); // } // return; // } void CConfigModem::OnSetDefault() { // TODO: Add your control notification handler code here m_baud = 4; //115200 m_port = 1; //com2 m_databits = 1; //8 m_parity = 2; //Even m_stopbits = 0; //1 m_modemAnalog=0;// analog m_Modem_InitStr="AT&FE0X3\r"; m_Modem_ESC="+++"; m_ModemHangUp="ATH0\r"; m_ModemAT=""; m_ModemOKstring="OK"; m_ModemConnect="CONNECT"; m_ModemNoCarrier="NO CARRIER"; m_ModemDialNum="ATD339\r"; // UpdateData(FALSE); }
这个可以实现什么功能?我现在要做的是发 AT\r ATE1\r AT+CMGF=0\r AT+CNMI=2,1,0,0,1\r //新短信提示设置 AT+CMGD=1\r //删除1~10信息 AT+CMGD=2\r AT+CMGD=3\r AT+CMGD=4\r AT+CMGD=5\r AT+CMGD=6\r AT+CMGD=7\r AT+CMGD=8\r AT+CMGD=9\r AT+CMGD=10\r AT+CMMSINIT\r AT+CMMSCURL=\"mmsc.monternet.com\"\r AT+CMMSCID=1\r AT+CMMSPROTO=\"10.0.0.172\",80\r AT+CMMSENDCFG=6,3,0,0,2,4\r AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r AT+SAPBR=3,1,\"APN\",\"CMWAP\"\r AT+SAPBR=1,1\r AT+SAPBR=2,1\r AT+CMMSEDIT=0\r 这些一条一条的发,收到OK才发下一条
schlafenhamster 2017-08-29
  • 打赏
  • 举报
回复
// if(!m_ModemAT.IsEmpty()) // {// execute AT command // m_ModemAT+="\r"; // char ecko[MAX_PATH]={0}; // if(pApp->SendCommand2Modem((LPTSTR)(LPCTSTR)m_ModemAT,ecko)) // { // AfxMessageBox(ecko); // m_ModemAT=""; // UpdateData(FALSE); // } // return; // } void CConfigModem::OnSetDefault() { // TODO: Add your control notification handler code here m_baud = 4; //115200 m_port = 1; //com2 m_databits = 1; //8 m_parity = 2; //Even m_stopbits = 0; //1 m_modemAnalog=0;// analog m_Modem_InitStr="AT&FE0X3\r"; m_Modem_ESC="+++"; m_ModemHangUp="ATH0\r"; m_ModemAT=""; m_ModemOKstring="OK"; m_ModemConnect="CONNECT"; m_ModemNoCarrier="NO CARRIER"; m_ModemDialNum="ATD339\r"; // UpdateData(FALSE); }
女神打Boss 2017-08-29
  • 打赏
  • 举报
回复
Mscomm控件有很多例子
赵4老师 2017-08-29
  • 打赏
  • 举报
回复
百度搜相关关键字。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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