📄 comm.c
字号:
HANDLE hComPortEvent = (HANDLE) args[3];
DWORD success, err;
trace("toggle_ctlLine timeout %ld clt 0x%08lx handle 0x%08lx\n",
args[0], args[1], args[2]);
Sleep(timeout);
ok(EscapeCommFunction(hcom, ctl),"EscapeCommFunction 0x%08lx failed\n", ctl);
trace("toggle_ctline done\n");
success = WaitForSingleObjectEx(hComPortEvent, TIMEOUT, TRUE);
err = GetLastError();
trace("toggle_ctline WaitForSingleObjectEx res 0x%08lx err 0x%08lx\n",
success, err);
return 0;
}
/*
* Wait for a change in CTS
* Needs Loopback from DTR to CTS
*/
static void test_WaitCts(HANDLE hcom)
{
DCB dcb;
OVERLAPPED overlapped;
HANDLE hComPortEvent;
HANDLE alarmThread;
DWORD args[4], defaultStat;
DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0;
ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
dcb.fRtsControl=RTS_CONTROL_ENABLE;
dcb.fDtrControl=DTR_CONTROL_ENABLE;
ok(SetCommState(hcom, &dcb), "SetCommState failed\n");
if (dcb.fDtrControl == RTS_CONTROL_DISABLE)
{
trace("RTS_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
return;
}
args[0]= TIMEOUT >>1;
ok(GetCommModemStatus(hcom, &defaultStat), "GetCommModemStatus failed\n");
if(defaultStat & MS_CTS_ON)
args[1] = CLRRTS;
else
args[1] = SETRTS;
args[2]=(DWORD) hcom;
trace("test_WaitCts timeout %ld clt 0x%08lx handle 0x%08lx\n",args[0], args[1], args[2]);
ok(SetCommMask(hcom, EV_CTS), "SetCommMask failed\n");
hComPortEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
ok(hComPortEvent != 0, "CreateEvent failed\n");
args[3] = (DWORD) hComPortEvent;
alarmThread = CreateThread(NULL, 0, toggle_ctlLine, (void *) &args, 0, &alarmThreadId);
/* Wait a minimum to let the thread start up */
Sleep(10);
trace("Thread created\n");
ok(alarmThread !=0 , "CreateThread Failed\n");
ZeroMemory( &overlapped, sizeof(overlapped));
overlapped.hEvent = hComPortEvent;
before = GetTickCount();
success = WaitCommEvent(hcom, &evtmask, &overlapped);
err = GetLastError();
after = GetTickCount();
trace("Success 0x%08lx err 0x%08lx evtmask 0x%08lx\n", success, err, evtmask);
ok(success || err == ERROR_IO_PENDING, "overlapped WaitCommEvent failed\n");
trace("overlapped WriteCommEvent returned.\n");
if (!success && (err == ERROR_IO_PENDING))
ok(WaitForSingleObjectEx(hComPortEvent, TIMEOUT, TRUE) == 0,
"WaitCts hComPortEvent failed\n");
success = GetOverlappedResult(hcom, &overlapped, &written, FALSE);
err = GetLastError();
after1 = GetTickCount();
trace("Success 0x%08lx err 0x%08lx evtmask 0x%08lx diff1 %ld, diff2 %ld\n",
success, err, evtmask, after-before, after1-before);
ok(evtmask & EV_CTS, "Failed to detect EV_CTS: 0x%08lx, expected 0x%08x\n",
evtmask, EV_CTS);
ok(GetCommModemStatus(hcom, &evtmask), "GetCommModemStatus failed\n");
if(defaultStat & MS_CTS_ON)
ok((evtmask & MS_CTS_ON) == 0,"CTS didn't change state!\n");
else
ok((evtmask & MS_CTS_ON), "CTS didn't change state!\n");
diff = after1 - before;
ok ((diff > (TIMEOUT>>1) -TIMEDELTA) && (diff < (TIMEOUT>>1) + TIMEDELTA),
"Unexpected time %ld, expected around %d\n", diff, TIMEOUT>>1);
/*restore RTS Settings*/
if(defaultStat & MS_CTS_ON)
args[1] = SETRTS;
else
args[1] = CLRRTS;
}
/* Change the Comm Mask while a Wait is going on
WaitCommevent should return with a EVTMASK set to zero
*/
static DWORD CALLBACK reset_CommMask(LPVOID arg)
{
DWORD *args = (DWORD *) arg;
DWORD timeout = args[0];
HANDLE hcom = (HANDLE) args[1];
trace(" Changing CommMask on the fly for handle %p after timeout %ld\n",
hcom, timeout);
Sleep(timeout);
ok(SetCommMask(hcom, 0),"SetCommMask %p failed\n", hcom);
trace("SetCommMask changed\n");
return 0;
}
/* Set up a Wait for a change on CTS. We don't toggle any line, but we
reset the CommMask and expect the wait to return with a mask of 0
No special port connections needed
*/
static void test_AbortWaitCts(HANDLE hcom)
{
DCB dcb;
OVERLAPPED overlapped;
HANDLE hComPortEvent;
HANDLE alarmThread;
DWORD args[2];
DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0;
ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
if (dcb.fDtrControl == RTS_CONTROL_DISABLE)
{
trace("RTS_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
return;
}
args[0]= TIMEOUT >>1;
args[1]=(DWORD) hcom;
trace("test_AbortWaitCts timeout %ld handle 0x%08lx\n",args[0], args[1]);
ok(SetCommMask(hcom, EV_CTS), "SetCommMask failed\n");
hComPortEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
ok(hComPortEvent != 0, "CreateEvent failed\n");
alarmThread = CreateThread(NULL, 0, reset_CommMask, (void *) &args, 0, &alarmThreadId);
/* Wait a minimum to let the thread start up */
Sleep(10);
trace("Thread created\n");
ok(alarmThread !=0 , "CreateThread Failed\n");
ZeroMemory( &overlapped, sizeof(overlapped));
overlapped.hEvent = hComPortEvent;
before = GetTickCount();
success = WaitCommEvent(hcom, &evtmask, &overlapped);
err = GetLastError();
after = GetTickCount();
trace("Success 0x%08lx err 0x%08lx evtmask 0x%08lx\n", success, err, evtmask);
ok(success || err == ERROR_IO_PENDING, "overlapped WaitCommEvent failed\n");
trace("overlapped WriteCommEvent returned.\n");
if (!success && (err == ERROR_IO_PENDING))
ok(WaitForSingleObjectEx(hComPortEvent, TIMEOUT, TRUE) == 0,
"AbortWaitCts hComPortEvent failed\n");
success = GetOverlappedResult(hcom, &overlapped, &written, FALSE);
err = GetLastError();
after1 = GetTickCount();
trace("Success 0x%08lx err 0x%08lx evtmask 0x%08lx diff1 %ld, diff2 %ld\n",
success, err, evtmask, after-before, after1-before);
ok(evtmask == 0, "Incorect EventMask 0x%08lx returned on Wait aborted bu SetCommMask, expected 0x%08x\n",
evtmask, 0);
ok(GetCommModemStatus(hcom, &evtmask), "GetCommModemStatus failed\n");
diff = after1 - before;
ok ((diff > (TIMEOUT>>1) -TIMEDELTA) && (diff < (TIMEOUT>>1) + TIMEDELTA),
"Unexpected time %ld, expected around %d\n", diff, TIMEOUT>>1);
}
/*
* Wait for a change in DSR
* Needs Loopback from DTR to DSR
*/
static void test_WaitDsr(HANDLE hcom)
{
DCB dcb;
OVERLAPPED overlapped;
HANDLE hComPortEvent;
HANDLE alarmThread;
DWORD args[3], defaultStat;
DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0;
ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
if (dcb.fDtrControl == DTR_CONTROL_DISABLE)
{
trace("DTR_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
return;
}
args[0]= TIMEOUT >>1;
ok(GetCommModemStatus(hcom, &defaultStat), "GetCommModemStatus failed\n");
if(defaultStat & MS_DSR_ON)
args[1] = CLRDTR;
else
args[1] = SETDTR;
args[2]=(DWORD) hcom;
trace("test_WaitDsr timeout %ld clt 0x%08lx handle 0x%08lx\n",args[0], args[1], args[2]);
ok(SetCommMask(hcom, EV_DSR), "SetCommMask failed\n");
hComPortEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
ok(hComPortEvent != 0, "CreateEvent failed\n");
alarmThread = CreateThread(NULL, 0, toggle_ctlLine, (void *) &args, 0, &alarmThreadId);
ok(alarmThread !=0 , "CreateThread Failed\n");
ZeroMemory( &overlapped, sizeof(overlapped));
overlapped.hEvent = hComPortEvent;
before = GetTickCount();
success = WaitCommEvent(hcom, &evtmask, &overlapped);
err = GetLastError();
after = GetTickCount();
trace("Success 0x%08lx err 0x%08lx evtmask 0x%08lx\n", success, err, evtmask);
ok(success || err == ERROR_IO_PENDING, "overlapped WaitCommEvent failed\n");
trace("overlapped WriteCommEvent returned.\n");
if (!success && (err == ERROR_IO_PENDING))
ok(WaitForSingleObjectEx(hComPortEvent, TIMEOUT, TRUE) == 0,
"wait hComPortEvent failed\n");
success = GetOverlappedResult(hcom, &overlapped, &written, FALSE);
err = GetLastError();
after1 = GetTickCount();
trace("Success 0x%08lx err 0x%08lx evtmask 0x%08lx diff1 %ld, diff2 %ld\n",
success, err, evtmask, after-before, after1-before);
ok(evtmask & EV_DSR, "Failed to detect EV_DSR: 0x%08lx, expected 0x%08x\n",
evtmask, EV_DSR);
ok(GetCommModemStatus(hcom, &evtmask), "GetCommModemStatus failed\n");
if(defaultStat & MS_DSR_ON)
ok((evtmask & MS_DSR_ON) == 0,"DTR didn't change state!\n");
else
ok((evtmask & MS_DSR_ON), "DTR didn't change state!\n");
diff = after1 - before;
ok ((diff > (TIMEOUT>>1) -TIMEDELTA) && (diff < (TIMEOUT>>1) + TIMEDELTA),
"Unexpected time %ld, expected around %d\n", diff, TIMEOUT>>1);
/*restore RTS Settings*/
if(defaultStat & MS_DSR_ON)
args[1] = SETDTR;
else
args[1] = CLRDTR;
}
/*
* Wait for a Ring
* Needs Loopback from DTR to RING
*/
static void test_WaitRing(HANDLE hcom)
{
DCB dcb;
OVERLAPPED overlapped;
HANDLE hComPortEvent;
HANDLE alarmThread;
DWORD args[3], defaultStat;
DWORD alarmThreadId, before, after, after1, diff, success, err, written, evtmask=0;
ok(GetCommState(hcom, &dcb), "GetCommState failed\n");
if (dcb.fDtrControl == DTR_CONTROL_DISABLE)
{
trace("DTR_CONTROL_HANDSHAKE is set, so don't manipulate DTR\n");
return;
}
args[0]= TIMEOUT >>1;
ok(GetCommModemStatus(hcom, &defaultStat), "GetCommModemStatus failed\n");
if(defaultStat & MS_RING_ON)
args[1] = CLRDTR;
else
args[1] = SETDTR;
args[2]=(DWORD) hcom;
trace("test_WaitRing timeout %ld clt 0x%08lx handle 0x%08lx\n",args[0], args[1], args[2]);
ok(SetCommMask(hcom, EV_RING), "SetCommMask failed\n");
hComPortEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
ok(hComPortEvent != 0, "CreateEvent failed\n");
alarmThread = CreateThread(NULL, 0, toggle_ctlLine, (void *) &args, 0, &alarmThreadId);
ok(alarmThread !=0 , "CreateThread Failed\n");
ZeroMemory( &overlapped, sizeof(overlapped));
overlapped.hEvent = hComPortEvent;
before = GetTickCount();
success = WaitCommEvent(hcom, &evtmask, &overlapped);
err = GetLastError();
after = GetTickCount();
trace("Success 0x%08lx err 0x%08lx evtmask 0x%08lx\n", success, err, evtmask);
ok(success || err == ERROR_IO_PENDING, "overlapped WaitCommEvent failed\n");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -