16,472
社区成员
发帖
与我相关
我的任务
分享
void CDemoDlg::OnOK()
{
BOOL OpenState;
DWORD NowTickCount;
DWORD SaveTickCount;
char * SendText;
// 这里很关键,因为 Send 是通过 GlobalSize 来取得指针大小的,所以需要这样分配控件大小
SendText = (char *)GlobalAlloc(GMEM_ZEROINIT, 4);
ReturnValue = 0; //设置默认返回为失败
Approach = 0; //设置接收步骤参数
COMM1.EventRead = OnComm; //设置处理函数
COMM1.ObjClassAddress = (DWORD)this; //设置类地址,确保在OnComm过程中可以调用本类中的一些过程或变量
COMM1.Port = 1; //设置端口
COMM1.BaudRate = CBR_57600; //设置波特率
COMM1.ByteSize = 8; //设置数据位
COMM1.Parity = 0; //设置校检
COMM1.StopBits = 1; //设置停止位
OpenState = COMM1.Open(); //打开串口,这时候便开始了 OnComm 事件的侦听
if(OpenState==TRUE){
sprintf(SendText,"AT\r\n"); //设置要发送的文本内容(当然也可以发送字节流)
COMM1.Send((BYTE*)SendText); //发送文本到串口
//=========== 以下做超时处理 ===========
//超时处理总共有两个全局变量控制
//ExecOver 和 ReturnValue
ExecOver = FALSE;
SaveTickCount = GetTickCount();
while(ExecOver==FALSE){
Sleep(5);
NowTickCount = GetTickCount();
if(NowTickCount-SaveTickCount>=1000){
//超过1秒钟还未正常返回结果就自动退出循环
ReturnValue = 0;
ExecOver=TRUE;
}
}
COMM1.Close();
}
if(ReturnValue==1){
MessageBox("串口1接入的设备支持AT命令。","执行结果",64);
}else{
MessageBox("没有检测到串口1接入支持AT命令的设备。","执行结果",64);
}
}
void CDemoDlg::OnComm(DWORD pClassAddress, BYTE *ReadBuffers, DWORD ReadCount)
{
// pClassAddress 类地址,由用户自行设置 ObjClassAddress 而来
// ReadBuffers 从串口缓冲区读到的数据指针
// ReadCount 从川口缓冲区读到的数据大小
//=============== 还原类的方法,以下是范例 ===============
//CDemoDlg * DlgObj;
//DlgObj = (CDemoDlg *)pClassAddress;
//DlgObj->COMM1.Send((BYTE *)"AAA");
//========================================================
// 下面做个简单的信息识别处理
// 还原类事例对象,因为要用到类中的变量
CDemoDlg * DlgObj;
DlgObj = (CDemoDlg *)pClassAddress;
DWORD i;
if(ReadCount>0){
for(i=0;i<ReadCount;i++){
switch(DlgObj->Approach){
case 0:
if((BYTE)ReadBuffers[i]==0x0D||(BYTE)ReadBuffers[i]==0x0A){ //有可能先发换行符号
DlgObj->Approach = 1;
}else if((BYTE)ReadBuffers[i]==0x4F||(BYTE)ReadBuffers[i]==0x62){ //有可能直接发 OK 信息
DlgObj->Approach = 2;
}
break;
case 1:
if((BYTE)ReadBuffers[i]==0x4F||(BYTE)ReadBuffers[i]==0x6F){
DlgObj->Approach = 2;
}else if((BYTE)ReadBuffers[i]==0x0D||(BYTE)ReadBuffers[i]==0x0A){
DlgObj->Approach = 1;
}else{
DlgObj->Approach = 0;
}
break;
case 2:
if((BYTE)ReadBuffers[i]==0x4B||(BYTE)ReadBuffers[i]==0x6B){
DlgObj->Approach = 3;
}else{
DlgObj->Approach = 0;
}
break;
case 3:
if((BYTE)ReadBuffers[i]==0x0D||(BYTE)ReadBuffers[i]==0x0A){
DlgObj->ReturnValue = 1;
DlgObj->ExecOver = TRUE;
}
DlgObj->Approach = 0;
break;
}
}
}
}