ITAPI3发送和接收数据

时间:2011-06-14 14:40:07

标签: c# .net modem tapi

我正在尝试创建一个应用程序来调用远程调制解调器并进行一些数据传输(字节数组形式的自定义数据)。

我正在使用JulMar的ITapi3包装器和在Windows 7 64Bit OS上运行的c#4.0(编译为x86)。

我让应用程序拨打电话并断开连接,但我实际上在线路上发送数据时遇到了问题。目前,当呼叫状态已连接时,我在CallStateChanged事件中有以下代码

  var handleArray = callForData.GetID("comm/datamodem");

        var byteContents = BitConverter.ToInt64(handleArray, 0);
        ////temporary Handle array
        IntPtr myPointer =new IntPtr(byteContents);


        ////var pinnedArray = GCHandle.Alloc(handleArray, GCHandleType.Pinned);
        ////var pointer = pinnedArray.AddrOfPinnedObject();
        var commHandle = new SafeFileHandle(myPointer, true);
        try
        {
           //now init filestream
            _dataTransferOutFileStream = new FileStream(commHandle, FileAccess.ReadWrite, 2048, true);

            //start by writing the login message to the modem
            var buffer = CreatePasswordMessage();

       IAsyncResult result= _dataTransferOutFileStream.BeginWrite(buffer, 0, buffer.Length,null,null);

        while (!result.IsCompleted)
            {
            //wait for completion of sending login message.
            Thread.Sleep(10);
            }

            //now we are done with sending login message 
       _dataTransferOutFileStream.EndWrite(result);

            //wait 5 seconds 
            Thread.Sleep(5000);
            //do the same type of thing for the read or whether it was sucessful.
        var readBuffer = new byte[2048];
        IAsyncResult readResult = _dataTransferOutFileStream.BeginRead(readBuffer, 0, 2048,null,null);
        while (!readResult.IsCompleted)
            {
            Thread.Sleep(10);
            }

            //read is complete.

       int readCount = _dataTransferOutFileStream.EndRead(readResult);

            Debug.WriteLine("Read Complete Count of Bytes Read: {0} Content of First Byte: {1} ",new object[]{readCount,readBuffer[0]});
        }

        catch (Exception ex)
        {
            Debug.WriteLine(ex.ToString());
            return false;
        }
        finally
        {

            commHandle.Close();

        }




        return true;

这似乎并不是实际发送数据或从远程站点接收任何有效数据。有什么我想念的吗?有没有办法检查正在使用的SafeFileHandle是否实际上是对调制解调器端口的引用?

我连接后尝试使用.NET内置的SerialPort类但是我得到一个错误,有问题的端口正在被另一个进程使用(我假设TAPI已锁定它。)

我愿意接受所有建议。

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题所在。显然我正在格式化我发送到远程调制解调器的数据不正确,而不是远程站点告诉我它完全忽略了我的消息。

因此上面的代码将用于通过C#中的调制解调器线异步发送和接收数据。