基于TAPI的MODEM通讯应用上遇到的问题!请教众位高手

min 2000-02-24 03:23:00
加精
我在PWIN98上用TAPI作MODEM通讯应用,
其原理是呼叫方拨通被呼叫方后进行数据交换,
现遇到的问题如下:
呼叫方已经拨通被叫方,并被叫方已应答
(已收到LINECALLSTATE_ACCEPTED消息),
这时用WriteFile(hModem,....)和
ReadFile(hModem,....)进行数据交换失败,
WriteFile()返回值是0。
请问高手或“过来人”指教!
Email:byzhong@21cn.com 欢迎交流,谢谢!
...全文
571 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
luoming 2001-02-18
  • 打赏
  • 举报
回复
能用VB写吗?
hejunyan 2000-02-25
  • 打赏
  • 举报
回复
看了下面的程序是否有启发?

#include <windows.h>

#include <tapi.h>

#include <stdio.h>

volatile BOOL bConnected = FALSE;

VOID FAR PASCAL lineCallback(DWORD hDevice, DWORD dwMsg,

DWORD dwCallbackInstance, DWORD dwParam1,

DWORD dwParam2, DWORD dwParam3)

{

if (dwMsg == LINE_CALLSTATE &&

dwParam1 == LINECALLSTATE_CONNECTED)

bConnected = TRUE;

}

LINEDEVCAPS *GetDevCaps(HLINEAPP hLineApp, DWORD dwDeviceID,

LPDWORD lpdwAPIVersion)

{

LINEDEVCAPS *pLineDevCaps;

LINEEXTENSIONID extensionID;

lineNegotiateAPIVersion(hLineApp, dwDeviceID, 0x10004, 0x10004,

lpdwAPIVersion, &extensionID);

pLineDevCaps = malloc(sizeof(LINEDEVCAPS));

pLineDevCaps->dwTotalSize = sizeof(LINEDEVCAPS);

lineGetDevCaps(hLineApp, dwDeviceID, *lpdwAPIVersion, 0,

pLineDevCaps);

if (pLineDevCaps->dwNeededSize > pLineDevCaps->dwTotalSize)

{

pLineDevCaps =

realloc(pLineDevCaps, pLineDevCaps->dwNeededSize);

pLineDevCaps->dwTotalSize = pLineDevCaps->dwNeededSize;

lineGetDevCaps(hLineApp, dwDeviceID, *lpdwAPIVersion, 0,

pLineDevCaps);

}

return pLineDevCaps;

}

HANDLE SelectTAPIDevice(HLINEAPP hLineApp, DWORD dwNumDevs,

LPHLINE lphLine, LPHCALL lphCall)

{

LINEDEVCAPS *pLineDevCaps;

DWORD dwDeviceID;

DWORD dwAPIVersion;

DWORD i;

LINECALLPARAMS lineCallParams;

LPVARSTRING lpDeviceID;

MSG msg;

char szNumber[81];

for (i = 0; i < dwNumDevs; i++)

{

pLineDevCaps = GetDevCaps(hLineApp, i, &dwAPIVersion);

if (pLineDevCaps->dwMediaModes & LINEMEDIAMODE_DATAMODEM)

printf("%d: %s\n", i,

(char*)pLineDevCaps + pLineDevCaps->dwLineNameOffset);

free(pLineDevCaps);

}

dwDeviceID = -1;

while (dwDeviceID < 0 and and dwDeviceID >= dwNumDevs)

{

printf("Select device: ");

scanf("%d", &dwDeviceID);

if (dwDeviceID < 0 and and dwDeviceID >= dwNumDevs) continue;

pLineDevCaps =

GetDevCaps(hLineApp, dwDeviceID, &dwAPIVersion);

if(!(pLineDevCaps->dwMediaModes & LINEMEDIAMODE_DATAMODEM))

{

dwDeviceID = -1;

free(pLineDevCaps);

}

}

printf("Enter telephone number: ");

scanf("%s", szNumber);

printf("Dialing %s on %s...", szNumber,

(char *)pLineDevCaps + pLineDevCaps->dwLineNameOffset);

free(pLineDevCaps);

lineOpen(hLineApp, dwDeviceID, lphLine, dwAPIVersion, 0, 0,

LINECALLPRIVILEGE_NONE, LINEMEDIAMODE_DATAMODEM, NULL);

memset(&lineCallParams, 0, sizeof(LINECALLPARAMS));

lineCallParams.dwTotalSize = sizeof(LINECALLPARAMS);

lineCallParams.dwMinRate = 2400;

lineCallParams.dwMaxRate = 57600;

lineCallParams.dwMediaMode = LINEMEDIAMODE_DATAMODEM;

lineMakeCall(*lphLine, lphCall, szNumber, 0, &lineCallParams);

while (!bConnected)

if (GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg);

putchar('\n');

lpDeviceID = malloc(sizeof(VARSTRING));

lpDeviceID->dwTotalSize = sizeof(VARSTRING);

lineGetID(0, 0, *lphCall, LINECALLSELECT_CALL, lpDeviceID,

"comm/datamodem");

if (lpDeviceID->dwNeededSize > lpDeviceID->dwTotalSize)

{

lpDeviceID = realloc(lpDeviceID, lpDeviceID->dwNeededSize);

lpDeviceID->dwTotalSize = lpDeviceID->dwNeededSize;

lineGetID(0, 0, *lphCall, LINECALLSELECT_CALL, lpDeviceID,

"comm/datamodem");

}

return *((LPHANDLE)((char *)lpDeviceID + sizeof(VARSTRING)));

}

void main(void)

{

HLINEAPP hLineApp;

HLINE hLine;

HCALL hCall;

DWORD dwNumDevs;

HANDLE hConIn, hConOut, hCommPort;

HANDLE hEvents[2];

DWORD dwCount;

DWORD dwWait;

COMMTIMEOUTS ctmoCommPort;

DCB dcbCommPort;

OVERLAPPED ov;

INPUT_RECORD irBuffer;

BOOL fInRead;

char c;

int i;

lineInitialize(&hLineApp, GetModuleHandle(NULL), lineCallback,

"Test TAPI Application", &dwNumDevs);

hCommPort =

SelectTAPIDevice(hLineApp, dwNumDevs, &hLine, &hCall);

hConIn = CreateFile("CONIN$", GENERIC_READ and GENERIC_WRITE,

FILE_SHARE_READ, NULL, OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL, 0);

SetConsoleMode(hConIn, 0);

hConOut = CreateFile("CONOUT$", GENERIC_WRITE,

FILE_SHARE_WRITE, NULL, OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL, 0);

ctmoCommPort.ReadIntervalTimeout = MAXDWORD;

ctmoCommPort.ReadTotalTimeoutMultiplier = MAXDWORD;

ctmoCommPort.ReadTotalTimeoutConstant = MAXDWORD;

ctmoCommPort.WriteTotalTimeoutMultiplier = 0;

ctmoCommPort.WriteTotalTimeoutConstant = 0;

SetCommTimeouts(hCommPort, &ctmoCommPort);

dcbCommPort.DCBlength = sizeof(DCB);

GetCommState(hCommPort, &dcbCommPort);

SetCommState(hCommPort, &dcbCommPort);

SetCommMask(hCommPort, EV_RXCHAR);

ov.Offset = 0;

ov.OffsetHigh = 0;

ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

hEvents[0] = ov.hEvent;

hEvents[1] = hConIn;

fInRead = FALSE;

while (1)

{

if (!fInRead)

while (ReadFile(hCommPort, &c, 1, &dwCount, &ov))

if (dwCount == 1)

WriteFile(hConOut, &c, 1, &dwCount, NULL);

fInRead = TRUE;

dwWait =

WaitForMultipleObjects(2, hEvents, FALSE, INFINITE);

switch (dwWait)

{

case WAIT_OBJECT_0:

if (GetOverlappedResult(hCommPort, &ov, &dwCount,

FALSE))

if (dwCount == 1)

WriteFile(hConOut, &c, 1, &dwCount, NULL);

fInRead = FALSE;

break;

case WAIT_OBJECT_0 + 1:

ReadConsoleInput(hConIn, &irBuffer, 1, &dwCount);

if (dwCount == 1 &&

irBuffer.EventType == KEY_EVENT &&

irBuffer.Event.KeyEvent.bKeyDown)

for (i = 0;

i < irBuffer.Event.KeyEvent.wRepeatCount; i++)

{

if (irBuffer.Event.KeyEvent.uChar.AsciiChar)

{

WriteFile(hCommPort,

&irBuffer.Event.KeyEvent.uChar.AsciiChar,

1, &dwCount, NULL);

if (irBuffer.Event.KeyEvent.uChar.AsciiChar

== 24) goto EndLoop;

}

}

}

}

EndLoop:

CloseHandle(ov.hEvent);

CloseHandle(hConIn);

CloseHandle(hConOut);

CloseHandle(hCommPort);

lineDrop(hCall, NULL, 0);

lineClose(hLine);

lineShutdown(hLineApp);

}

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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