一:不知道大家是否使用过专业串口调试工具sscom,作者:丁丁,最新 版本下载地址:http://www.mcu51.com/download/sscom.rar
这个软件有个小功能小弟不知道如何用Delphi实现,就是在选择串口号的ComboBox里,它会自动罗列本地所有可用的串口号,而且,即使是正在被其他程序占用的串口号也罗列其中,如何实现,请各位大虾指点;二:我选用的串口控件是SPComm,目前我的理解是:发送数据是WriteCommData函数,接收数据是OnReceiveData的事件,那么,如何实现一种情况:串口每隔10秒发送一个数据,在接下来5秒内串口收到响应,否则提示出错。令小弟不解的是OnReceiveData是一个事件,如何确定这个事件里收到的响应内容能与发的内容相对应呢?PS:小弟初学Delphi,可能在很多大虾眼里所提问的问题非常简单,甚至是非常愚蠢,但是,请大虾们高抬贵手,指点一二,小弟不甚感激,祝愿给予小弟帮助的朋友,事业上步步高升,生活上美满幸福,身体健康,万事如意!

解决方案 »

  1.   

    procedure EnumComPorts(Ports: TStrings);
    //检测串口
    var
      KeyHandle: HKEY;
      ErrCode, Index: Integer;
      ValueName, Data: string;
      ValueLen, DataLen, ValueType: DWORD;
      TmpPorts: TStringList;
    begin
      ErrCode := RegOpenKeyEx(
        HKEY_LOCAL_MACHINE,
        'HARDWARE\DEVICEMAP\SERIALCOMM',
        0,
        KEY_READ,
        KeyHandle);  if ErrCode <> ERROR_SUCCESS then
        Exit; // raise EComPort.Create(CError_RegError, ErrCode);  TmpPorts := TStringList.Create;
      try
        Index := 0;
        repeat
          ValueLen := 256;
          DataLen := 256;
          SetLength(ValueName, ValueLen);
          SetLength(Data, DataLen);
          ErrCode := RegEnumValue(
            KeyHandle,
            Index,
            PChar(ValueName),
            Cardinal(ValueLen),
            nil,
            @ValueType,
            PByte(PChar(Data)),
            @DataLen);      if ErrCode = ERROR_SUCCESS then
          begin
            SetLength(Data, DataLen);
            TmpPorts.Add(Data);
            Inc(Index);
          end
          else
            if ErrCode <> ERROR_NO_MORE_ITEMS then
              exit; //raise EComPort.Create(CError_RegError, ErrCode);    until (ErrCode <> ERROR_SUCCESS);    TmpPorts.Sort;
        Ports.Assign(TmpPorts);
      finally
        RegCloseKey(KeyHandle);
        TmpPorts.Free;
      end;end;
      

  2.   

    可以用个定时器Timer来定时发送数据啊。
    接收的数据怎么对应?你总得有个通讯协议吧,按照协议来啊
      

  3.   

    第一个问题可以看看这个贴子,懒的复制了 http://topic.csdn.net/u/20110111/09/849d86eb-8a9f-4539-af65-e7212162a282.html  7楼(这个代码是从CPORT3中复制的)第二个问题:你可以在一个循环中,每500MS左右读下串口,看看串口缓冲中是否有数据了,是否你要的数据,如果是,刚退出循环;同时启动一个定时器,计时为5秒,如果定时到了还没正确读到串口数据就出错同时退出循环。
    “如何确定这个事件里收到的响应内容与发的内容相对应呢?”你发了命令后,就要等待串口响应(工控中的应用基本都是一应一答的),收到响应后,解释收到的内容,就知道是不是和发的相对应了吧。