使用usb转串口的设备,用spcomm控件直接向串口发送、接收数据。
打开串口时出现错误“File handle is not a comm handle”;
我将spcomm源代码中的以下语句封掉    
if GetFileType( hNewCommFile ) <> FILE_TYPE_CHAR then
     begin
          CloseHandle( hNewCommFile );
          raise ECommsError.Create( 'File handle is not a comm handle ' )
     end;此后,startcomm可以通过,使用WriteCommData发送数据也没有报错,但是却无法接收到数据。
请问是什么问题呀!

解决方案 »

  1.   

    我也是用同样设备,将USB口多插拔几次就好了。另外看看USB设备属性对应的是COM几
      

  2.   

    我用的就没有任何问题
    U口的COM,其实一样使用的
      

  3.   

    转的com口和自带的com口是一样的。
    我觉得是你设备的问题
      

  4.   

    spcomm支持usb to com以及多串口卡的修改
    procedure TComm.StartComm;
    var
      hNewCommFile: THandle;
    begin
         // Are we already doing comm?
      if (hCommFile <> 0) then
        raise ECommsError.Create('This serial port already opened');  hNewCommFile :=
       CreateFile(PChar('\\.\' +FCommName),
        GENERIC_READ or GENERIC_WRITE,
        0, {not shared}
        nil, {no security ??}
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
        0 {template});procedure TReadThread.Execute;
    var
      szInputBuffer: array[0..INPUTBUFFERSIZE - 1] of Char;
      nNumberOfBytesRead: DWORD;  HandlesToWaitFor: array[0..1] of THandle;
      dwHandleSignaled: DWORD;
       // Needed for overlapped I/O (ReadFile)
      overlappedRead: TOverlapped;label
      EndReadThread;
    begin
      FillChar(overlappedRead, Sizeof(overlappedRead), 0);     // Lets put an event in the Read overlapped structure.
      overlappedRead.hEvent := CreateEvent(nil, True, True, nil);
      if overlappedRead.hEvent = 0 then
      begin
        PostHangupCall;
        goto EndReadThread
      end;
         // We will be waiting on these objects.
      HandlesToWaitFor[0] := hCloseEvent;
      HandlesToWaitFor[1] := overlappedRead.hEvent;     // Setup CommEvent handling.     // Set the comm mask so we receive error signals.
      if not SetCommMask(hCommFile, EV_ERR or EV_RLSD or EV_RING) then
      begin
        PostHangupCall;
        goto EndReadThread
      end;     // Start waiting for Read events.
      if not SetupReadEvent(@overlappedRead,
        szInputBuffer, INPUTBUFFERSIZE,
        nNumberOfBytesRead) then
        goto EndReadThread;     // Keep looping until we break out.
      while True do
      begin
              // Wait until some event occurs (data to read; error; stopping).
        dwHandleSignaled := WaitForMultipleObjects(2, @HandlesToWaitFor,
          False, INFINITE);          // Which event occured?
        case dwHandleSignaled of
          WAIT_OBJECT_0: // Signal to end the thread.
            begin
                        // Time to exit.
              goto EndReadThread
            end;      WAIT_OBJECT_0 + 1: // CommEvent signaled.
            begin
                        // Get the new data!
              if not HandleReadEvent(@overlappedRead,
                szInputBuffer,
                INPUTBUFFERSIZE,
                nNumberOfBytesRead) then
                goto EndReadThread;                    // Wait for more new data.
              if not SetupReadEvent(@overlappedRead,
                szInputBuffer, INPUTBUFFERSIZE,
                nNumberOfBytesRead) then
                goto EndReadThread
                        {break;}        end;      WAIT_FAILED: // Wait failed.  Shouldn't happen.
            begin
              PostHangupCall;
              goto EndReadThread
            end
        else // This case should never occur.
          begin
            PostHangupCall;
            goto EndReadThread
          end
        end {case dwHandleSignaled}
      end; {while True}        // Time to clean up Read Thread.
      EndReadThread:  PurgeComm(hCommFile, PURGE_RXABORT + PURGE_RXCLEAR);
      CloseHandle(overlappedRead.hEvent);
    end; {TReadThread.Execute}
      

  5.   

    我可以很负责任的告诉你,市场上的USB转串口只有一家能用,95%以上全是假的,根本就不是USB转串口,所以才会出现你说的这种提示,我曾经为了买一个能用的,拿的电脑在电脑市场买了两天,把我系统给搞崩了(这就是中国特色的电脑配件,全是不负责任的人开发的程序,所谓自己驱动首先占用了端口,那别的应用程序如何进行通讯,这也能叫驱动程序吗?),才买到一个真的,之前我曾在2001年左右用过一个真的,现在的很难买到真的,仔细找一找,如果想知道是什么牌子,请楼主UP一下
      

  6.   

    我也出现过FFwin的情况,最后终于找到一种是一个台湾生产的USB转串口线,但现在用户买的都是普通的,所以一直在寻找软件解决办法,我试过,普通USB能发出命令,且对方能收到,就是收不到对方发回的信号,可能是信号太弱。
     不知谁解决没,aiirii的方法确认能接收到吗?
      

  7.   

    aiirii,能说说你那样改的原理吗?为什么要把第二个挂起事件的所有代码去掉?我看源程序里有两个TOverlapped变量,谢谢!
      

  8.   

    我试了下aiirii的代码,还是通不上啊
      

  9.   

    其实,我也试过,部分老式的 usb2com 存在 ffwin说的情况, 所有,如果还不行,估计就是有问题了,你可以先用  超级终端 试下
      

  10.   

    我正调试串口程序
    我用的是台湾的USB->COM
    没有问题