串口发送数据问题(35分)

  • 主题发起人 主题发起人 sun100
  • 开始时间 开始时间
S

sun100

Unregistered / Unconfirmed
GUEST, unregistred user!
我用的是SPCOMM,设计的目的是,:把现在所统计得的数量,发送到顾客显示屏幕上去.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SPComm;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Comm1: TComm;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
Comm1.StartComm;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
strsend:string;
begin
if trim(edit1.Text)<>'' then
begin
strsend:=trim(edit1.Text);
comm1.WriteCommData(pchar(strsend),length(strsend));
end;
end;
怎么我在测试的时候,顾客显示屏上没有响应呢,(他们的频率,数据位,停止位,和校验位一致了),是什么原因呢
 
串口通讯的程序一般分这么几步调试:
1、首先确认你自己的程序能够发送出数据。方法:将所用的串口的2,3脚短接,就可以自己接收到自己发送的数据,如果你的程序没问题,则能够接收到自己发送的数据;依次调试发送部分,和硬件的完好性。
2、测试接收部分硬件和程序的完好性;在连接好通讯线的情况下,用上面调试好的发送部分,给你的接收部分发送数据,如果硬件连接、通讯参数都没有问题,那一定是接收部分有问题。(检查硬件连线的连通性可以用万用表逐个脚的测量。)

象上面你提到的情况,发送部分可能有问题。不过我没有测试。我这里有个类似的例子可以参考一下。
//////////////////////////////////////////////////////////////////////////////////
// first change string of hex to array of byte and then transmit it through comm
//////////////////////////////////////////////////////////////////////////////////
procedure TfmMain.SendDate(var TmpTxString:String);
var Ret :Boolean;
i :Integer;
aChar :String;
StrLen:Integer;
tmpStr:String;
TxLen :WORD;
begin
tmpStr:=Trim(TmpTxString);
StrLen:=Length(tmpStr);
TxLen:=WORD(StrLen div 2);
for i:=1 to TxLen do begin
aChar:=Copy(tmpStr,i*2-1,2);
TxBuf:=Byte(StrToInt('$'+aChar));
end;
//
Ret:=fmMain.MyComm32.WriteCommData(@TxBuf,i-1);
end;

这是一个串口测试程序的发送部分,参数为十六进制字符串。没有检错部分。
 
先保证你的串口连线正确,使用串口调试助手先测一下
 
很多单片机需按字节接收数据,不知道显示屏是不是这样.
 
你试试,这是我刚做好的代码

procedure TfrmMainF.SendData(data,stat:String);
Var
Allss:String;
i,j:Integer; //其中i是字节数;j表示循环变量
si:String;
commflg:Boolean;
begin
Exit;

For j:=1 To 16 Do
sbuf[j]:=0;
//将数字的字符串转化成十六进制数
j:=1;
For j:=1 To Length(data) Do
Begin
If Copy(data,j,1)='.' Then
Begin
Allss:=Allss+'2E ';
Continue;
End;
Allss:=Allss+'3'+Copy(data,j,1)+' ';
Next;
End;
Allss:='1B 51 41 '+Trim(Allss)+' 0D';
//十六进制数
//allss:=data;
i:=1;j:=1;
While j<Length(Allss) Do
Begin
si:=Trim(Copy(Allss,j,2));
If si='' Then Exit;
SBuf:=Byte(strtoint('$'+si));
i:=i+1;
j:=j+3;
End;
//状态
If (stat='全暗') Or (stat='单价') Or (stat='应收') Or (stat='实收') Or (stat='找回') Then
Begin
If stat='全暗' Then Allss:='1B 73 30';
If stat='单价' Then Allss:='1B 73 31';
If stat='应收' Then Allss:='1B 73 32';
If stat='实收' Then Allss:='1B 73 33';
If stat='找回' Then Allss:='1B 73 34';
j:=1;
While j<Length(Allss) Do
Begin
si:=Trim(Copy(Allss,j,2));
If si='' Then Exit;
SBuf:=Byte(strtoint('$'+si));
i:=i+1;
j:=j+3;
End;
End;
//发送
commflg:=True;
For j:=1 To i Do
Begin
If Not RS232.writecommdata(@sbuf[j],1) Then
Begin
commflg:=false;
Break;
End;
End;
end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
763
import
I
I
回复
0
查看
778
import
I
I
回复
0
查看
709
import
I
后退
顶部