串口通信中,WaitCommEvent函数为什么总是返回false,而不检测EV_RXCHAR事件?

zhangjie9u 2009-11-28 10:12:51
最近在做串口通信方面的东西,属于刚刚学习的阶段,作为练习,在写一个串口助手。同步的已经实现,现在要做异步的,思路如下:
CreateFile函数打开串口;
SetCommMask函数设置事件掩码,这里只设置一个事件EV_RXCHAR,表示串口接收缓冲区接收到一个字节。
在Timer中用WaitCommEvent监测并等待事件的发生,事件发生时则做相应的处理;

问题:
WaitCommEvent函数始终无法检测到接收缓冲区中有数据传入,可是我在程序中利用ClearCommError函数明明看到接收缓冲区中有数据传入的,请教高手,这是为什么,我想了好几天了,一直不明白原因,希望做过这方面的朋友帮帮忙,谢谢了!


程序源代码如下(开发环境:C++ Builder):


//文件Unit1.h

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <Menus.hpp>
#include <Shellapi.h>
#include <ExtCtrls.hpp>
#include <syncobjs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TGroupBox *GroupBox1;
TGroupBox *GroupBox2;
TGroupBox *GroupBox3;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
TLabel *Label5;
TButton *Button1;
TEdit *Edit1;
TComboBox *ComboBox1;
TComboBox *ComboBox2;
TComboBox *ComboBox3;
TComboBox *ComboBox4;
TComboBox *ComboBox5;
TLabel *Label6;
TMemo *Memo1;
TButton *Button2;
TButton *Button3;
TCheckBox *CheckBox1;
TCheckBox *CheckBox2;
TMemo *Memo2;
TCheckBox *CheckBox3;
TButton *Button4;
TLabel *Label7;
TLabel *Label8;
TEdit *Edit2;
TCheckBox *CheckBox4;
TButton *Button5;
TTimer *Timer1;
TShape *Shape1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall Button4Click(TObject *Sender);
void __fastcall Timer2Timer(TObject *Sender);
void __fastcall CheckBox3Click(TObject *Sender);
private: // User declarations
public: // User declarations
void __fastcall FasongShuju();
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


//文件Unit1.cpp

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE hComm;
OVERLAPPED OL;
void __fastcall SetEvent();
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
ComboBox1->ItemIndex=0;
ComboBox2->ItemIndex=0;
ComboBox3->ItemIndex=0;
ComboBox4->ItemIndex=3;
ComboBox5->ItemIndex=0;
OL.hEvent=CreateEvent(NULL,true,false,"");
Memo1->Text="";
Memo2->Text="";
Timer1->Enabled=false;
Timer1->Interval=1000;
}
//串口开关函数-------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
DCB dcb;
if(Button1->Caption=="打开串口")
{
if(StrToInt(ComboBox1->Text.SubString(4,ComboBox1->Text.Length()))>=10)
{
hComm=CreateFile(("\\\\.\\"+ComboBox1->Text).c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
}
else
{
hComm=CreateFile(ComboBox1->Text.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0);
}
if(hComm==INVALID_HANDLE_VALUE)
{
Edit1->Text="通信端口"+ComboBox1->Text+"无法打开!";
}
else
{
Shape1->Brush->Color=clRed;
Edit1->Text="打开通信端口"+ComboBox1->Text+"成功打开!";
Button1->Caption="关闭串口";
//取得串口设置参数:
GetCommState(hComm,&dcb);
//设置波特率:
switch(StrToInt(ComboBox2->Text))
{
case 300:
dcb.BaudRate=CBR_300;
break;
case 600:
dcb.BaudRate=CBR_600;
break;
case 1200:
dcb.BaudRate=CBR_1200;
break;
case 2400:
dcb.BaudRate=CBR_2400;
break;
case 4800:
dcb.BaudRate=CBR_4800;
break;
case 9600:
dcb.BaudRate=CBR_9600;
break;
case 19200:
dcb.BaudRate=CBR_19200;
break;
case 38400:
dcb.BaudRate=CBR_38400;
break;
case 56000:
dcb.BaudRate=CBR_56000;
break;
case 57600:
dcb.BaudRate=CBR_57600;
break;
case 115200:
dcb.BaudRate=CBR_115200;
break;
}
//设置校验方式:
switch(ComboBox3->ItemIndex)
{
case 0:
dcb.Parity=NOPARITY;
break;
case 1:
dcb.Parity=ODDPARITY;
break;
case 2:
dcb.Parity=EVENPARITY;
break;
case 3:
dcb.Parity=MARKPARITY;
break;
case 4:
dcb.Parity=SPACEPARITY;
break;

}
//设置数据位数:
switch(StrToInt(ComboBox4->Text))
{
case 5:
dcb.ByteSize=5;
break;
case 6:
dcb.ByteSize=6;
break;
case 7:
dcb.ByteSize=7;
break;
case 8:
dcb.ByteSize=8;
break;
}
// dcb.StopBits=TWOSTOPBITS;
//设置停止位数:
if(ComboBox5->Text=="1")
{
dcb.StopBits=ONESTOPBIT;
}
if(ComboBox5->Text=="2")
{
dcb.StopBits=TWOSTOPBITS;
}
//重新设置串口参数:
if(!SetCommState(hComm,&dcb))
{
MessageBox(0,"通信端口设置错误","设置错误",MB_OK);
}
//调用SetEvent设置事件掩码:
SetEvent();
}
}
else
{
if(hComm!=INVALID_HANDLE_VALUE)
{
Form1->Timer1->Enabled=false;
CloseHandle(hComm);
Shape1->Brush->Color=clWhite;
Edit1->Text="打开通信端口"+ComboBox1->Text+"成功关闭!";
Button1->Caption="打开串口";
}
}
}
//定时器timer用来等待串口事件(Ev_RXCHAR)发生--------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
HANDLE hHand;
unsigned long EvWait;
if(hComm==INVALID_HANDLE_VALUE)
{
return;
}
hHand=CreateEvent(NULL,true,false,"");
OL.hEvent=hHand;
if(WaitCommEvent(hComm,&EvWait,&OL))
{
//do something
Memo1->Lines->Add("等到了!");//可惜,这句始终没有被执行到,郁闷!
}
}
//向串口发送数据----------------------------------------------------------------

void __fastcall TForm1::FasongShuju()
{
String SendData;
unsigned long BS,lrc;
if(hComm==0)
{
return;
}
SendData=Memo2->Text;
BS=SendData.Length();
WriteFile(hComm,SendData.c_str(),BS,&lrc,&OL);
}
//发送数据按钮--------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
FasongShuju();
}
//设置串口事件掩码--------------------------------------------------------
void __fastcall SetEvent()
{
long EvWait;
if(hComm==0)
{
return;
}
EvWait=EV_RXCHAR;
if(!SetCommMask(hComm,EvWait))
{
MessageBox(0,"safasdf","",MB_OK);
}
Form1->Timer1->Enabled=true;
}
...全文
129 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangjie9u 2009-12-04
  • 打赏
  • 举报
回复
真无奈,难道我没分给就没人回答了吗?算了,结贴吧。

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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