晚上给你发一个,用SPCOMM做的,通过USB口转换成串口后不行,建议直接用API编,例子我也有

解决方案 »

  1.   

    ljmanage(过客)
    昨天你发了吗?怎么我没有收到,劳烦你发个给我,小弟感激不尽!同时能留个QQ号吗?想和你交流一下!
      

  2.   

    我给你一个吧:
    线程文件:unit Unit2;interfaceuses
      Windows,Classes, SysUtils;type
      TReadThread = class(TThread)
      private
        { Private declarations }
          procedure ReadPort;   //读取串行端口数据
      protected
          procedure Execute; override;
      end;implementation
    uses Unit1; // 声明引用Unit1,必须放在implementation区段procedure TReadThread.Execute;
    begin
        { Place thread code here }
        While not Terminated do
        begin
            Synchronize(ReadPort);//刚才所定义的读取数据函数
        end;
    end;//读取串行端口的程序放在这里
    procedure TReadThread.ReadPort;
    var
        Temp : string;
        inbuff: array[0..65534] of Char;
        nBytesRead, dwEvent, dwError:LongWORD ;
        cs:TCOMSTAT;
    begin
        if (hComm=0) then exit;//先判断是否已打开通信端口
        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;
        Temp:=Copy(inbuff,1,cs.cbInQue);//取出数据
        Form1.mReceive.Text :=Form1.mReceive.Text + Temp;   // 将数据显示于Memo1 上
        Form1.mReceive.SetFocus ;
        Form1.mReceive.SelStart  :=Length(Form1.mReceive.Text);
        Form1.mReceive.SelLength :=0;  //移到最下端
    end;
    end.
      

  3.   

    主程序:(我直接用的API写的哈,这样更灵活哦)  




    private
        { Private declarations }
        ReadThread:TReadThread;//声明读取数据的线程
      end;var
      Form1: TForm1;
      hComm: THandle;implementation{$R *.DFM}procedure TForm1.btnSendClick(Sender: TObject);
    var
      Temp:string;
      lrc:LongWord;
    begin
        if (hComm=0) then exit;//若尚未打开通信端口,则跳出
        Temp:=mSend.Text ;//欲送出的数据
        //执行送出的函数
        WriteFile(hComm,Pointer(Temp)^,Length(Temp), lrc, nil); //送出数据
    end;//以下是清除显示数据按钮按下时的执行程序代码
    procedure TForm1.btnClearClick(Sender: TObject);
    begin
     mReceive.Clear;   //将接收区清除
    end;//以下是打开通信端口的函数
    procedure TForm1.btnOpenPortClick(Sender: TObject);
    beginend;
    //结束系统的按钮
    procedure TForm1.btnEndClick(Sender: TObject);
    begin
       CloseHandle(hComm);//关闭通信端口
    end;
    //当于Memo对象中按下按钮后,执行以下的程序
    //窗体建立时执行以下的程序
    procedure TForm1.FormCreate(Sender: TObject);
    begin
       //建立线程对象,并且激活执行
       ReadThread:=TReadThread.Create(False);
    end;//窗体关闭时执行以下的程序
    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
       ReadThread.Free; //释放对象
    end;
    procedure TForm1.btnOKClick(Sender: TObject);
    var
      cc:TCOMMCONFIG;
      Temp:string;
    begin
      Temp:=trim(Combobox1.Text) ; // 选择所要打开的COM
      hComm:=CreateFile(PChar(Temp), GENERIC_READ or GENERIC_WRITE,
           0, nil, OPEN_EXISTING, 0, 0);// 打开COM
      if (hComm = INVALID_HANDLE_VALUE) then
      begin//如果COM 未打开
          MessageBox (0, '打开通信端口错误!!','',MB_OK);
          exit;
      end;  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 的状态
          MessageBox (0, '通信端口设置错误!!!','',MB_OK);
          CloseHandle(hComm);//关闭通信端口
          exit;
      end;  end;procedure TForm1.Button6Click(Sender: TObject);
    var
        Temp:string;
        lrc:LongWord;
    begin
        if (hComm=0) then exit;//若尚未打开通信端口,则跳出
        Temp:=mSend.Lines.Text ;//欲送出的数据
        //执行送出的函数
        WriteFile(hComm,Pointer(Temp)^,Length(Temp), lrc, nil); //送出数据
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
         if OpenDialog1.Execute then
         begin
              mSend.Lines.LoadFromFile(OpenDialog1.FileName);
         end;end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
         close
    end;procedure TForm1.FormShow(Sender: TObject);
    begin
         btnOKClick(Sender);
         btnok.Enabled:=false;
    end;procedure TForm1.ComboBox1Change(Sender: TObject);
    begin
              CloseHandle(hComm);//关闭通信端口
              btnok.Enabled:=true;
    end;procedure TForm1.ComboBox2Change(Sender: TObject);
    begin
             CloseHandle(hComm);//关闭通信端口
             btnok.Enabled:=true;
    end;end.
      

  4.   

    大家注意了  这个楼主提的问题从来就不结贴  以下是他曾经发过至今未结的帖子 这样的家伙有问题就让他憋着吧!
    http://community.csdn.net/Expert/topic/3247/3247907.xml?temp=.3752863
    http://community.csdn.net/Expert/topic/3223/3223622.xml?temp=.6042902
    http://community.csdn.net/Expert/topic/3134/3134468.xml?temp=.5532648 
    http://community.csdn.net/Expert/topic/3123/3123147.xml?temp=.5250055
    http://community.csdn.net/Expert/topic/3082/3082779.xml?temp=9.208316E-02
    这位楼主,别人的一点心得告知于你,希望你能尊重别人的劳动成果!
      

  5.   

    suuare(督察)  信誉:96 <>1000
    ??????????????????????????????????