所要实现的功能: 向手机号为13734608118中发送两条命令 一条是字符0000 一条是一个号码为01234567890 的手机号 并且设置短消息到达自动提示
出现的问题: 在ReadComm的时候机器就死了,我的写的代码有好多的地方是不完善的能否指点一下。
代码:
void CDlgInfo1::OnButton()
{
// TODO: Add your control notification handler code here BOOL ComB;
//打开串口
ComB=OpenSendComm(); if (!ComB)
{
return;
}
//初始MODERN并发送信息
if (!gsmInit())
{
return ;
}
CloseHandle(portID);}
BOOL CDlgInfo1::OpenSendComm()
{
char sIni[2000];
ComVcFunction::GetCurDir(sIni);
strcat(sIni,"\\setup.ini");
int SENDCOM=GetPrivateProfileInt("SYS","SENDCOM",2,sIni);
SENDCOM=(SENDCOM==0)?2:SENDCOM;
wsprintf( ComName, "COM%d", SENDCOM );
portID = CreateFile( ComName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , NULL ); if(portID == INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;}
BOOL CDlgInfo1::gsmInit()
{
char ans[128]; // 应答串 // 测试GSM-MODEM的存在性
WriteComm("AT\r", 3);
ReadComm(ans, 128);
if (strstr(ans, "OK") == NULL) return FALSE; // 关闭回显
WriteComm("ATE0\r", 5);
ReadComm(ans, 128); // TXT模式
WriteComm("AT+CMGF=1\r", 10);
ReadComm(ans, 128); // 设置对方号码
WriteComm("AT+CMGS=<13734608118>\r", 20); //要发送的内容
WriteComm("AT+IDNT=0000\r", 13);
WriteComm("AT+PHON=11111111111\r", 20); //设置短消息到达自动提示
WriteComm("AT+CNMI=1,1,0,0,1()\r", 13);
return TRUE;
}int CDlgInfoXiangbian::WriteComm(void* pData, int nLength)
{
DWORD dwNumWrite; // 串口发出的数据长度 WriteFile(portID, pData, (DWORD)nLength, &dwNumWrite, NULL); return (int)dwNumWrite;
}
// 读串口
// 输入: pData - 待读的数据缓冲区指针
// nLength - 待读的最大数据长度
// 返回: 实际读出的数据长度
int CDlgInfoXiangbian::ReadComm(void* pData, int nLength)
{
DWORD dwNumRead; // 串口收到的数据长度 ReadFile(portID, pData, (DWORD)nLength, &dwNumRead, NULL);
return (int)dwNumRead;
}
出现的问题: 在ReadComm的时候机器就死了,我的写的代码有好多的地方是不完善的能否指点一下。
代码:
void CDlgInfo1::OnButton()
{
// TODO: Add your control notification handler code here BOOL ComB;
//打开串口
ComB=OpenSendComm(); if (!ComB)
{
return;
}
//初始MODERN并发送信息
if (!gsmInit())
{
return ;
}
CloseHandle(portID);}
BOOL CDlgInfo1::OpenSendComm()
{
char sIni[2000];
ComVcFunction::GetCurDir(sIni);
strcat(sIni,"\\setup.ini");
int SENDCOM=GetPrivateProfileInt("SYS","SENDCOM",2,sIni);
SENDCOM=(SENDCOM==0)?2:SENDCOM;
wsprintf( ComName, "COM%d", SENDCOM );
portID = CreateFile( ComName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL , NULL ); if(portID == INVALID_HANDLE_VALUE)
{
return FALSE;
}
return TRUE;}
BOOL CDlgInfo1::gsmInit()
{
char ans[128]; // 应答串 // 测试GSM-MODEM的存在性
WriteComm("AT\r", 3);
ReadComm(ans, 128);
if (strstr(ans, "OK") == NULL) return FALSE; // 关闭回显
WriteComm("ATE0\r", 5);
ReadComm(ans, 128); // TXT模式
WriteComm("AT+CMGF=1\r", 10);
ReadComm(ans, 128); // 设置对方号码
WriteComm("AT+CMGS=<13734608118>\r", 20); //要发送的内容
WriteComm("AT+IDNT=0000\r", 13);
WriteComm("AT+PHON=11111111111\r", 20); //设置短消息到达自动提示
WriteComm("AT+CNMI=1,1,0,0,1()\r", 13);
return TRUE;
}int CDlgInfoXiangbian::WriteComm(void* pData, int nLength)
{
DWORD dwNumWrite; // 串口发出的数据长度 WriteFile(portID, pData, (DWORD)nLength, &dwNumWrite, NULL); return (int)dwNumWrite;
}
// 读串口
// 输入: pData - 待读的数据缓冲区指针
// nLength - 待读的最大数据长度
// 返回: 实际读出的数据长度
int CDlgInfoXiangbian::ReadComm(void* pData, int nLength)
{
DWORD dwNumRead; // 串口收到的数据长度 ReadFile(portID, pData, (DWORD)nLength, &dwNumRead, NULL);
return (int)dwNumRead;
}
解决方案 »
- 求助关于Sybase字符集, 十万火急!!!!!
- 在vs.net中怎样生成*.dll和*.lib文件。谢谢了哦。
- VC的帮助
- 关于vc调试器的问题
- 在vc7.0中如何添加左键单击事件?
- 汇编语言的编译器是用机器语言写的,但是没有现成的程序,怎么让计算机识别键盘的输入呢
- CString里的replace问题。
- 为什么toolbar的tips显示错误?
- 我在我的程序中使用了函数:QueryPerformanceFrequency(),添加了LARGE_INTEGER litmp变量,结果就出现了下面的错误......
- DLL的做法
- MFC+Opengl
- 【SDK】如何实现位图按钮啊?已经卡了一天半了。
或者看WriteComm里面数据是否写成功了?
串口超时设置的短一些。
int n;
unsigned long etat; n = 0; if (serial_handle!=INVALID_HANDLE_VALUE)
{
ClearCommError(serial_handle, &etat, &status);
n = status.cbInQue;
}其中n就是现在缓冲区的数据
为什么第一个参数以Void *传递而不以char *的方式?
DWORD dwError = GetLastError(); //看看是串口错误还是一直在等待。return (int)dwNumRead;
{ WriteComm("AT\r", 3); WriteComm("ATE0\r", 5); // TXT模式
WriteComm("AT+CMGF=1\r", 10); // 设置对方号码
WriteComm("AT+CMGS=<13734608118>\r", 22); Sleep(2000); //要发送的内容
WriteComm("AT+IDNT=0000", 12);
WriteComm("\26", 1);
WriteComm("\r", 1); //设置短消息到达自动提示
WriteComm("AT+CNMI=1,1,0,0,1()\r", 13);
return TRUE;
}
我把程序该成这样了 干脆就不等返回值了 但是还没发送成功 这是为什么呢 还有 我不会把超时设短 不好意思:)
ATE0
AT+CMGF=1
AT+CMGS=<13734608118>
AT+IDNT=0000
AT+CNMI=1,1,0这是我通过串口调试助手 得到的东西
就是第一个READCOMM的时候还是死机 但是当我用超级终端调试一次以后 程序就可以运行了,等到机器重启后又出现了那个问题 请大家指点一下
源代码在公司楼主用串口助手发AT命令给那个GSM的东西看看能不能成功
一步一步查。。