spcomm控件通过串口发送文本文件内容(100分)

  • 主题发起人 主题发起人 qiujianben
  • 开始时间 开始时间
Q

qiujianben

Unregistered / Unconfirmed
GUEST, unregistred user!
协议:
头:D5C8D5C8
指令:FF
内容:信息<1000
尾:13AB13AB
现在发现:数据发送不出去,com.WriteCommData(send_txt,length(strHyData)) 返回值始终是false;
这是什么问题啊?头痛死了。

代码:
unit CommConvert;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, RzCmboBx, ExtCtrls, RzPanel, RzButton, SPComm, RzLabel,
  Mask, RzEdit, RzShellDialogs;

type
  TfrmMain = class(TForm)
    Com: TComm;
    RzButtonHelp: TRzButton;
    RzButtonBrowse: TRzButton;
    RzGroupBoxInit: TRzGroupBox;
    RzComboBoxComNo: TRzComboBox;
    RzBtnOpenCom: TRzButton;
    RzLabComSelect: TRzLabel;
    RzLabBand: TRzLabel;
    RzComboBoxBand: TRzComboBox;
    RzLabelData: TRzLabel;
    RzLabelCheck: TRzLabel;
    RzLabelStop: TRzLabel;
    RzComboBoxData: TRzComboBox;
    RzComboBoxStop: TRzComboBox;
    RzComboBoxCheck: TRzComboBox;
    RzLabelFolder: TRzLabel;
    RzEditFolder: TRzEdit;
    RzButtonSend: TRzButton;
    RzLabelShow: TRzLabel;
    RzMemo: TRzMemo;
    RzLabelComStates: TRzLabel;
    RzOpenDialog: TRzOpenDialog;
    procedure RzButtonBrowseClick(Sender: TObject);
    procedure RzBtnOpenComClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure RzButtonSendClick(Sender: TObject);
  private
    { Private declarations }
    IsOpen: boolean;
    procedure InitConfig;
    function ReadFiles(aFileName:String):String;
    function strToPchar(str:string):pchar;
  public
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

//获得数据文件路径以及名称
procedure TfrmMain.RzButtonBrowseClick(Sender: TObject);
begin
    if (RzOpenDialog.Execute) then
       RzEditFolder.Text := RzOpenDialog.FileName;
end;

//打开串口和关闭串口
procedure TfrmMain.RzBtnOpenComClick(Sender: TObject);
begin
  if not IsOpen then
  begin
    InitConfig;
    Com.StartComm;
    RzBtnOpenCom.Caption := '关闭串口';
    RzLabelComStates.Caption := 'OK';
    IsOpen := True;
  end
  else
  begin
    com.StopComm;
    RzBtnOpenCom.Caption := '打开串口';
    RzLabelComStates.Caption := '';
    IsOpen := false;
  end;
end;

//程序开始时候执行基本参数设置
procedure TfrmMain.FormCreate(Sender: TObject);
begin
  IsOpen:= False;
end;

//初始化串口基本参数
procedure TfrmMain.InitConfig;
begin
  Com.CommName := RzComboBoxComNo.Text;  //串口号
  Com.BaudRate := StrToInt(RzComboBoxBand.Text); //波特率
  case RzComboBoxData.ItemIndex of   //数据位
    0: Com.ByteSize := _5;
    1: Com.ByteSize := _6;
    2: Com.ByteSize := _7;
    3: Com.ByteSize := _8;
  end;
  case RzComboBoxStop.ItemIndex of  //停止位
    0: com.StopBits := _1;
    1: com.StopBits := _1_5;
    2: com.StopBits := _2;
  end;
  case RzComboBoxCheck.ItemIndex of  //校验位
    0: com.Parity := None;
    1: com.Parity := Odd;
    2: com.Parity := Even;
    3: com.Parity := Mark;
    4: com.Parity := Space;
  end;
end;

//数据资料发送
procedure TfrmMain.RzButtonSendClick(Sender: TObject);
var
  strHyData :String;
  send_txt :PChar;
begin
  if (RzEditFolder.Text ='') then
     begin
        ShowMessage('请选择资料存放目录');
     end
  else
    begin
      RzMemo.Lines.Text := ReadFiles(RzEditFolder.Text);
      strHyData := 'D5C8D5C8'+ReadFiles(RzEditFolder.Text)+'13AB13AB';
      send_txt:= strToPchar(strHyData);
      if com.WriteCommData(send_txt,length(strHyData)) then
        ShowMessage('数据发送成功!')
      else
        ShowMessage('数据发送失败!');
        FreeMem(send_txt);
    end

end;


//读取海洋数据监测资料函数
function TfrmMain.ReadFiles(aFileName: String): String;
var
  HyData : TStringList;
begin
    try
      HyData := TStringList.Create;
      HyData.LoadFromFile(aFileName);
      Result := HyData.Text;
    finally
      HyData.Free;
    end
end;


function TfrmMain.strToPchar(str: string): pchar;
var
  p:pchar;
begin
  p:=AllocMem(Length(str)+1);
  strpcopy(p,str);
  result:=p;
end;
end.
 
com.WriteCommData(send_txt,length(strHyData)) 有错。
用com.WriteCommData(send_txt[1],length(strHyData))
就好了,WriteCommData第一个参数要求传入一个地址的。
 
不一定正确,我的send_txt是Pchar类型的。
昨天发现我用的spcomm控件的源代码是被修改过的。
这么也创建不了写线程,被人家在startcomm中写了else EXIT;
换了个spcomm就好了问题解决。
 
我给你一端代码把;
下面是我写的一段向串口超市的客户显示牌发送数据的例子:
if Length(Content)<12 then
begin
Comm1:=TComm.Create(Application);
Comm1.StopComm;
Comm1.CommName:=Com;
Comm1.StartComm;
Comm1.BaudRate:=9600;
Comm1.Parity:=None;
Comm1.ByteSize:=_8;
Comm1.StopBits:=_1;
ShowStr:=chr(27)+chr(81)+chr(65)+Content+chr(13);
Sleep(5);
Send:=Comm1.WriteCommData(Pchar(ShowStr),Length(ShowStr));
if Send=false then
begin
Application.MessageBox('显示时出现错误,请检查','错误',MB_OK or MB_ICONERROR);
Comm1.StopComm;
Result:=false;
end;
end
else
begin
Application.MessageBox('您输入的字符长度超过11位','错误',MB_OK or MB_ICONERROR);
Result:=false;
end;
Comm1.StopComm;
Result:=true;
 
怪不得,昨晚我琢磨半天也没发现啥问题。谁这么有意思,偷偷来一下?
 
后退
顶部