串口通讯中writefile报错(100分)

  • 主题发起人 主题发起人 男生111
  • 开始时间 开始时间

男生111

Unregistered / Unconfirmed
GUEST, unregistred user!
大家好:
我刚才写了一个用COM1口自发自收的程序,但是测试的时候发现FILEWRITE报错,用SysErrorMessage(GetLastError())获取错误代码,发现报的是"重叠I/O正在操作"希望能够解释一下,我的代码是BCB6下写的,如下:
HANDLE hcom;
//定义句柄
DCB dcb;
OVERLAPPED e;
//定义重叠结构
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
char successflag=0;
///////// listen sql
listensql=new MyThread(true);
listensql->FreeOnTerminate=true ;
listensql->Resume();
////////////
hcom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
//打开通讯口
if(hcom==INVALID_HANDLE_VALUE)
exit;
successflag=SetupComm(hcom,512,512);

if(successflag==0){
exit;
}
successflag=GetCommState(hcom, &dcb ) ;
if(successflag==0){
exit;
}
dcb.BaudRate =9600;
dcb.ByteSize =8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;
successflag=SetCommState(hcom, &dcb ) ;
if(successflag==0){
exit;
}
e.hEvent=CreateEvent(NULL,true,false,NULL);
if(e.hEvent==NULL){
exit;
}
successflag=SetCommMask(hcom,EV_RXCHAR|EV_TXEMPTY) ;
if(successflag==0){
exit;
}
PurgeComm( hcom,PURGE_TXCLEAR| PURGE_RXCLEAR );
/*SetCommMask(hcom,EV_RXCHAR|EV_TXEMPTY);
SetupComm(hcom,512,512);
PurgeComm( hcom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR| PURGE_RXCLEAR );
COMMTIMEOUTS CommTimeOuts ;
CommTimeOuts.ReadIntervalTimeout=20;
CommTimeOuts.ReadTotalTimeoutMultiplier=20;
CommTimeOuts.ReadTotalTimeoutConstant=20;
CommTimeOuts.WriteTotalTimeoutMultiplier=20;
CommTimeOuts.WriteTotalTimeoutConstant=20;
SetCommTimeouts( hcom, &CommTimeOuts ) ;
GetCommState(hcom, &dcb ) ;
dcb.BaudRate =9600;
dcb.ByteSize =8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE;
SetCommState(hcom, &dcb ) ;*/
/*BuildCommDCB("9600,0,8,1",&dcb);
//第一个字符串参数实际使用时由图1选择后组合,这里仅简单说明其格式
SetCommState(hcom,&dcb);
SetupComm(hcom,512,512);//设置读写缓冲区
e.hEvent=CreateEvent(NULL,false,false,NULL);
//设置事件
SetCommMask(hcom,EV_RXCHAR|EV_TXEMPTY);
//设置事件掩码
*/
//e.hEvent=CreateEvent(NULL,false,false,NULL);
//设置事件
//SetCommMask(hcom,EV_RXCHAR|EV_TXEMPTY);
//设置事件掩码
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD wCount = 0;
char successflag;
AnsiString lll;
int sult;
char *buf="uuu";
DWORD length=4;
successflag=WriteFile(hcom, buf, length, &length, &e);
if(successflag==0){
//sult=GetLastError();
lll=SysErrorMessage(GetLastError());
}
}
 
版主,你在哪里,这个简单的问题,难道连你也不会吗?
 
因为 你使用了 FILE_FLAG_OVERLAPPED 打开文件,在异步操作中,这个返回码很正常,
并不意味着一定出错。
如果GetLastError函数返回ERROR_IO_PENDING,则说明重叠操作还为完成,线程可以
等待操作完成。有两种等待办法:一种办法是用象WaitForSingleObject这样的等待函
数来等待OVERLAPPED结构的hEvent成员,可以规定等待的时间,在等待函数返回后,
调用GetOverlappedResult。另一种办法是调用GetOverlappedResult函数等待,如果
指定该函数的bWait参数为TRUE,那么该函数将等待OVERLAPPED结构的hEvent 事件。GetOverlappedResult可以返回一个OVERLAPPED结构来报告包括实际传输字节在内的
重叠操作结果。
 
终于有人回答我的问题了,首先谢谢您哦,
你说的让我加WaitForSingleObject函数,是在线程中readfile后加吗?我把我的线程函数给您发过去,您帮助我看看,感谢呀
void __fastcall MyThread::Execute()
{
//---- Place thread code here ----
char str[101];
DWORD wCount;
//
while(1)
{
ReadFile(hcom,str,100,&wCount,NULL);
WaitForSingleObject(hcom,INFINITE);
if(wCount > 0) //
{
str[wCount] = '/0';
PostMessage(Form1->Handle, WM_MYWANQUANPORT, (unsigned int) str,wCount);
//
}
}
}
 
您的解释提醒了我,虽然并没有完全解答我的问题,我已经解决了,是线程中的问题,谢谢您的参与
 
后退
顶部