1.根據USB的VID/PID得到端口號(COMx)
2.16進制命令的通信(byte[] buffer ={ 0x24, 0x02, 0x02, 0x22, 0x22 })
通讯参数
波特率:9600  校验位:无NONE  数据位:8位 停止位:1位
DEMO我看過,可以收發16進制嗎?

解决方案 »

  1.   

    解決后來這裡,還有100分
    http://topic.csdn.net/u/20100324/11/3c26314c-3671-4cb1-ae10-49f9af9dd50e.html
    http://topic.csdn.net/u/20100324/13/c2fac56f-c365-4d8f-9614-adadc8310f28.html
    再加也行
      

  2.   

    ASYNC32很简单的,我一直用它.首先设好Comm1的参数,然后
    BYTE buffer[] ={ 0x24, 0x02, 0x02, 0x22, 0x22 };
    BYTE readbuf[100];
    Comm1->Write(buffer,sizeof(buffer));  //发送
    Sleep(100);     //等设备回应
    int len=Comm1->Read(readbuf,10); //最多读10个byte,返回实际读到的
    但如果是USB转成com的,可能会不可靠
      

  3.   

    我搞错了,上面是BCB的,你试试以下代码:rocedure TForm1.Button1Click(Sender: TObject);
    const
      sendbyte:array[0..4] of byte=( $24, $02, $02, $22, $22 );
    var
       buffer:array [0..100] of BYTE;
       readbuf: array[00..100] of BYTE ;
       len:integer;
    begin
      copymemory(@buffer[0],@sendbyte[0],4);
      //如果数据不是很多,可直接赋值buffer[0]:=$24;buffer[1]:=$02;
      Comm1.Write(buffer,4); //发送
      Sleep(100); //等设备回应
      len:=Comm1.Read(readbuf,10);  //接收10个end;
      

  4.   

    報錯:Write error(Error 6)。。
      

  5.   

    額,我沒打開COMM,我再試試。
    PS:看到你的頭像我就想起某部位,邪惡啊邪惡
      

  6.   

    可以留個郵箱嗎?我這裡有完整的C#代碼,發給你,看能不能幫忙轉成DELPHI的。
      

  7.   

    完全可以!可以使用MSCOMM来打开相应的COM端口,再通过OutPut语句将Buffer发出去。具体的楼主请看:http://download.csdn.net/source/1523158
      

  8.   

    TO KEIY:
    我用網上的一個軟件AcessPort可以得到正確的結果,比如我輸入 $24, $02, $02, $22, $22就可以得到00 2A 55,可是用那段代碼看到readbuf里的是(0,0,1,247,18),幫偶解釋下
      

  9.   

    延时不够?
    将Sleep(100)改大点如Sleep(500);试试
      

  10.   

    謝謝LS,第二個問題搞定了。
    沒有人回答俺第一個問題嗎?
    1.根據USB的VID/PID得到端口號(COMx),相當於寫個函數
    function GetPortNameFormVidPid(vid,pid:string)
      

  11.   

    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;是这一段获取串口的代码,也许对你有用
      

  12.   

    http://blog.csdn.net/jadeluo/archive/2009/12/31/5111481.aspx
    謝謝LS,可以看這裡,從另外一個帖子看來的
    這是另外一種思路了,不過是可以達到目的的