我初次接触串口开发。
用的spcomm,为什么我发某个指令后,第一次都接收不到数据呢,以后每次有正常的呢?
下面是我的源代码:
procedure TmainForm.btnSendDataClick(Sender: TObject);
begin
    if not (comm1.WriteCommData(PChar(trim(edtCommand.Text)),length(trim(edtCommand.Text)))) then
        showMessage('send data faild');
end;procedure TmainForm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
    strTemp,strDateTime: String;
begin
    //showMessage('data received. ' + intToStr(bufferLength));
    setLength(strTemp,bufferLength);
    move(buffer^,PChar(strTemp)^,bufferLength);
    strDateTime := formatDateTime('yyyy-mm-dd hh:nn:ss:zzz',now);
    mmReceivedData.Lines.Add('[' + strDateTime + ']    ' + strTemp);
end;procedure TmainForm.btnCloseComClick(Sender: TObject);
begin
    comm1.StopComm;
end;procedure TmainForm.Comm1ReceiveError(Sender: TObject; EventMask: Cardinal);
begin
    showMessage('An error occured');
end;procedure TmainForm.btnOpenComClick(Sender: TObject);
begin
    if length(trim(cmbxSerialPort.Text)) < 1 then
    begin
        showMessage('Please select a serial port');
        exit;
    end;
    comm1.StartComm(cmbxSerialPort.text,strToInt(edtBaudRate.Text));
    comm1.Outx_XonXoffFlow := false;
    comm1.Parity := None;
    comm1.StopBits := _1;
    comm1.ByteSize := _8;
end;

解决方案 »

  1.   

    串口操作慢,在连续发送接收时请延时,如加sleep(100)。水平有限,此建议仅供参考。
      

  2.   

    begin
        if length(trim(cmbxSerialPort.Text)) < 1 then
        begin
            showMessage('Please select a serial port');
            exit;
        end;    comm1.Outx_XonXoffFlow := false;
        comm1.Parity := None;
        comm1.StopBits := _1;
        comm1.ByteSize := _8;    comm1.StartComm(cmbxSerialPort.text,strToInt(edtBaudRate.Text));
    end;