我用的是mscomm,进入发送块的时候会报错port already open,
function Tmainfrm.SendFrameBuffer(Sendframe:Framebyte):String;
var
  k: integer;
  ReceFrame: String;
  starttime, endtime: Longint;
  ssss: array of byte;
  TempStr, commstr: string;
  
begin
  MSComm1.CommPort := 1;
  MSComm1.Settings :='19200,n,8,1';
  MSComm1.InBufferCount:=0 ;
  ReceFrame:='';
  MSComm1.OutBufferCount:=0;
  if MSComm1.PortOpen =false then
  begin
    MSComm1.PortOpen:=true ;   //打开串口,等待接收数据
  end;
  mscomm1.Output:=Sendframe;
  starttime:=gettickcount();        //时间控制起始时间
  while true do                                     //等待接收数据
  begin
    if mscomm1.InBufferCount>0 then
    begin
      starttime:=gettickcount();
      break;
    end;
    if  gettickcount()-starttime>10000 then    //判断是否大于10000毫
    begin
      showmessage('通讯超时!请判断是否连接!');   //通讯超时!请判断是否连接!
      break ;
    end;
    Sleep (10);
    application.ProcessMessages ;
  end;  while true do                                     //等待接收数据
  begin
    if gettickcount()-starttime>300 then        //字节间延时300毫秒
    begin
      if MSComm1.PortOpen=true then
      begin
        MSComm1.PortOpen:=false;  //关闭串口
      end;
      result:=ReceFrame;
      break;
    end;
    if mscomm1.InBufferCount>0 then
    begin
      setlength(ssss,mscomm1.InBufferCount);
      ssss:=mscomm1.Input;              //接收数据
      if tempstr='' then
      begin
        tempstr:=' ';
      end;
      k:=0;
      while k<length(ssss) do
      begin
        commstr:=inttohex(ssss[k],2);
        ReceFrame:=ReceFrame+commstr;
        k:=k+1;
      end;
      starttime:=gettickcount();
    end ;
    Sleep(10);
    application.ProcessMessages ;
  end;
end;
这个模块放在另外程序里都不会有问题
谁遇到过这样的错误?

解决方案 »

  1.   

    UP一下,CSDN的高手都哪里去了,睡觉了?
      

  2.   

    com1已经被打开占用,换一个串口
      

  3.   

    发送和接收都是一个串口,打开一次就可以了。接收完再释放也不迟
    按你的代码是:打开->发送->关闭->打开->接收->关闭;烦不烦?
    直接:打开->发送->接收->关闭;
      

  4.   

    真麻烦!只是接收和发送判断是否超时为什么要写那么麻烦的代码?如果用spcomm的话,设置一个全局时间变量,在发送时设置时间,接收时判断时间差在做相应处理,应该不难吧!