小弟初学delphi,现在用道一个条码扫描设备通过com口联结,用delphi通过哪个东东可以读到com进来的数据,谢谢

解决方案 »

  1.   

    给个地址吧,google现在用不成了
      

  2.   

    借宝地一用
    楼上的各位哥哥,我的MSCOMM怎么老装不上呀,只好用SPCOM
      

  3.   

    查查资料,就用api写,可以在一个线程里处理,我写过一个,晚上回去找给你!
      

  4.   

    to sduzjw(幼儿园大班) 我刚才试了一下,在component->import activeX control中插入mscomm32.ocx就可以在面板ActiveX中找到了.
      

  5.   

    但是我的还不行,是这样的,我的串口上接了一个手持激光扫描设备,接com口的那种,现在接上了.可程序无法读出数据,基本这个控件的执行步骤也大概就是这个样子吧
    1.portopen=true
    2.然后就可以在oncom事件里key代码了吧,
    我在oncom事件里key了些代码,设置了中断,发现程序根本都没往这里运行,郁闷,谁知道这是怎么回事
      

  6.   

    虽然结贴了还是把我以前写的给你个参考吧。
    Unit CommThread;InterfaceUses
      Windows, Classes, SysUtils, Graphics, Controls, Forms,
      Dialogs, ComCtrls, ExtCtrls;
    Type
      TThreadParam = Record
        SusPended: Boolean;
        BaulSpeed: integer;
        Port: Byte;
        Parity: Boolean;
        StopBit: byte;
        StartBit: Byte;
        SB: TStatusBar;
        LEDs: Array[1..25] Of TShape;
      End;Type
      TReadThread = Class(TThread)
      Private
        { Private declarations }
        hComm: THandle;
        Port: integer;
        FErr: Boolean;
        FPortDescription: String;
        FShape: Array[1..25] Of TShape;
        FSB: TStatusBar;
        cc: TCOMMCONFIG;
        Data: String;
        Procedure ReadPort; //读取串行端口数据
        Procedure UpdateUI;
      Protected
        Procedure Execute; Override;
      Public
        Constructor Create(ThdPrm: TThreadParam);
      End;ImplementationConstructor TReadThread.Create(ThdPrm: TThreadParam);
    Var
      i: integer;
    Begin
      Port := thdprm.Port;
      FSB := thdprm.SB;
      For i := 1 To 25 Do
      Begin
        FShape[i] := thdPrm.LEDs[i];
      End;
      FreeOnTerminate := True;
      Inherited Create(ThdPrm.Suspended);
    End;Procedure TReadThread.Execute;
    Var
      PortToOpen: String;
    Begin
      PortToOpen := 'COM' + inttostr(Port); // 选择所要打开的COM
      hComm := CreateFile(PChar(PortToOpen), GENERIC_READ Or GENERIC_WRITE,
        0, Nil, OPEN_EXISTING, 0, 0); // 打开COM
      If (hComm = INVALID_HANDLE_VALUE) Then
      Begin //如果COM 未打开
        FErr := True;
        FPortDescription := '打开端口错误!';
      End
      Else
      Begin
        FErr := False;
        FPortDescription := '打开端口成功';
        GetCommState(hComm, cc.dcb); // 得知目前COM 的状态
        cc.dcb.BaudRate := CBR_9600; // 设置波特率为9600
        cc.dcb.ByteSize := 8; //字节为 8 bit
        cc.dcb.Parity := NOPARITY; // Parity 为 None
        cc.dcb.StopBits := ONESTOPBIT; // 1 个Stop bit
        If Not SetCommState(hComm, cc.dcb) Then
        Begin // 设置COM 的状态
          Ferr := True;
          FPortDescription := FPortDescription + ',设置错误!';
          CloseHandle(hComm); //关闭通信端口
        End
        Else
        Begin
          FErr := False;
          FPortDescription := FPortDescription + ',设置成功';
          While Not Terminated Do
          Begin
            Synchronize(ReadPort); //刚才所定义的读取数据函数
          End;
          Synchronize(UpdateUI);
        End;
      End;End;//读取串行端口的程序放在这里Procedure TReadThread.ReadPort;
    Var
      i: integer;
      inbuff: Array[0..29] Of Char;
      nBytesRead, dwEvent, dwError: LongWORD;
      cs: TCOMSTAT;
      Rights, Emptys, Errs: integer;
    Const
      RightColor = clBlue;
      ErrorColor = clRed;
      EmptyColor = clWhite;
    Begin
      Rights := 0;
      Emptys := 0;
      Errs := 0;
      If (hComm = INVALID_HANDLE_VALUE) Then
      Begin
        Fsb.Panels[3].Text := FPortDescription;
        Terminate; //先判断是否已打开通信端口
        Exit;
      End
      Else
      Begin
        Fsb.Panels[3].Text := FPortDescription;
        ClearCommError(hComm, dwError, @CS); //取得状态
        ReadFile(hComm, inbuff, cs.cbInQue, nBytesRead, Nil); // 接收COM 的数据
        //串行在读取数据后,会自动将缓冲区中已被读取的数据清除掉
        If cs.cbInQue = 0 Then exit;
        // 数据是否大于我们所准备的Buffer
        If cs.cbInQue <> sizeof(inbuff) Then
        Begin
          PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 数据
          exit;
        End;
        Data := Copy(inbuff, 1, cs.cbInQue); //取出数据
        For i := 1 To 25 Do
        Begin
          If (UpperCase(Data[i]) = 'Y') Then
          Begin
            FShape[i].Brush.Color := RightColor;
            Rights := Rights + 1;
          End
          Else
            If (UpperCase(Data[i]) = 'N') Then
            Begin
              FShape[i].Brush.Color := EmptyColor;
              Emptys := Emptys + 1;
            End
            Else
              If (UpperCase(Data[i]) = 'E') Then
              Begin
                FShape[i].Brush.Color := ErrorColor;
                Errs := Errs + 1;
              End;
        End;
        Fsb.Panels[0].Text := '正确:' + IntTostr(Rights);
        fsb.Panels[1].Text := '空槽:' + IntTostr(Emptys);
        fsb.Panels[2].Text := '错误:' + IntTostr(Errs);
        Fsb.Panels[3].Text := FPortDescription;
        Fsb.Panels[4].Text := '数据:' + Data;
      End;
    End;Procedure TReadThread.UpdateUI;
    Begin
      Fsb.Panels[0].Text := '正确:' + IntTostr(0);
      fsb.Panels[1].Text := '空槽:' + IntTostr(0);
      fsb.Panels[2].Text := '错误:' + IntTostr(0);
      Fsb.Panels[3].Text := '';
      Fsb.Panels[4].Text := '数据:' + Data;
    End;End.