spcomm接收并处理数据的问题,在线等(100分)

  • 主题发起人 主题发起人 cyfflying
  • 开始时间 开始时间
C

cyfflying

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟第一次涉及串口通信,使用SPCOMM控件接收信息,现遇到问题如下,望各位大虾HELP一把。
接收的数据有汉字有数据,凡是汉字,在前面都会有个标志符,结尾也会有一个标志符,然后给内码加上一个数值,就是汉字原来的内码,不在标志符范围内的,不需换算,小弟现在能够顺利接收到数据,就是不会把数据转换成明文,望各位大虾帮助,最好给出示例代码,谢谢
 
兄台,说清一点,如果能接收到,你可以在文本中再处理啊,我们这做条形码的,相信能解决
 
接收没问题,都是十六进制数据,需要进行相应的加法运算后,才是明文,我不知道怎么运算,第一次做,太菜了
 
就比如说,凡是EE——FF之间的数据,都需要-80才是原码,该如何处理啊,如果不在这之间,就都不需要处理,汉字内码还原成汉字
 
strtoint('$'+你的十六进制值)
 
楼上的大大,稍微多写几句吧,照顾照顾,我是第一次接触这个
 
各位大虾麻烦一下,简单的写个接收到输出到MEMO的过程吧
 
unit Unitwrite;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, SPComm, StdCtrls, Buttons;

type
TForm1 = class(TForm)
Label3: TLabel;
Edit1: TEdit;
BitBtn1: TBitBtn;
Label4: TLabel;
Edit5: TEdit;
BitBtn2: TBitBtn;
Button1: TButton;
Comm1: TComm;
ComboBox1: TComboBox;
Label1: TLabel;
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure FormDestroy(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure Edit5KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
function ReadData: Boolean;
function WriteCard(sText: string): Boolean;
function ResetComm: Boolean;
public
{ Public declarations }
end;

var
Form1: TForm1;

Rubf: array[1..32] of byte;
implementation

{$R *.dfm}

function TForm1.WriteCard(sText: String): Boolean;
var
sBuffer: String;
I: Integer;
begin
sBuffer := sText;
Result := Comm1.WriteCommData(PChar(sBuffer), Length(sBuffer));
if Result then
begin
Result := False;
Rubf[1] := Byte($1B);
Rubf[2] := Byte($74);
Rubf[3] := Byte($1D);
Rubf[4] := Byte($1B);
Rubf[5] := Byte($5C);
//开始写指令
for I := 1 to 2 do
begin
if not comm1.WriteCommData(@Rubf,1) then
begin
Result := False;
break;
end;
//发送时字节间的延时
sleep(2);
end;
Comm1.WriteCommData(PChar(sBuffer), Length(sBuffer));
for I := 3 to 5 do
begin
if not comm1.WriteCommData(@Rubf,1) then
begin
Result := False;
break;
end;
sleep(2);
end;
end
else
begin
MessageBox(Handle,'发送写数据失败!!! ','',16);
end;
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
Buf: PChar;
Vstring: String;
I,Index: Integer;
begin
GetMem(Buf,BufferLength);
try
Move(Buffer^,Buf^,BufferLength);
for I := 1 to BufferLength do
Vstring := Vstring + Buf;
if Vstring = ('rq'+#0) then
begin
MessageBox(Handle,'读数据错误!!! ','',16);
Exit;
end;
//if Copy(Vstring,Length(Vstring)-1,1) = 'q' then
if Vstring = ('rq'+#0) then
begin
MessageBox(Handle,'写数据错误!!! ','',16);
Exit;
end;
Index := POS('s',Vstring);
Vstring := Copy(Vstring,Index+1,Length(Vstring)-1);
Index := POS('?',Vstring);
vstring := Copy(Vstring,1,Index-1);
Edit5.Text := Vstring;

{Rubf[1] := Byte($1B);
Rubf[2] := Byte($5D);
for I:= 1 to 32 do
begin
if not comm1.writecommdata(@Rubf,1) then
begin
break;
end;
//发送时字节间的延时
sleep(2);
end;}
finally
FreeMem(Buf);
end;
end;

function TForm1.ReadData: Boolean;
var
I: Integer;
begin
try
for I := 0 to 32 do
begin
Rubf := 0;
end;
Rubf[1] := Byte($1B);
Rubf[2] := Byte($5D);
Result := True;
for I := 1 to 32 do
begin
if not comm1.writecommdata(@Rubf,1) then
begin
Result := False;
Break;
end;
//发送时字节间的延时
Sleep(2);
end;
Result := True;
except
Result := False;
end;
end;

function TForm1.ResetComm: Boolean;
var
I: Integer;
begin
Exit;
try
for I := 0 to 32 do
begin
Rubf := 0;
end;
Rubf[1] := Byte($1B);
Rubf[2] := Byte($61);
Result := True;
for I := 1 to 32 do
begin
if not comm1.writecommdata(@Rubf,1) then
begin
Result := False;
Break;
end;
//发送时字节间的延时
Sleep(2);
end;
Result := True;
except
Result := False;
end;

end;


procedure TForm1.FormDestroy(Sender: TObject);
begin
if Comm1 <> nil then
begin
ResetComm;
Comm1.StopComm;
Comm1.Destroy;
end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
if Trim(Edit1.Text) <> '' then
begin
WriteCard(Trim(Edit1.Text));
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Comm1.CommName := ComboBox1.Items[ComboBox1.ItemIndex];
Comm1.StartComm;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ReadData;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ResetComm;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
Comm1.StopComm;
Comm1.CommName := ComboBox1.Items[ComboBox1.ItemIndex];
Comm1.StartComm;
end;

procedure TForm1.Edit5KeyPress(Sender: TObject; var Key: Char);
begin
if (Key = ';') or (Key = '?') then
Key := #0;
end;

end.
 
谢谢楼上的贴出这么长一段代码,我刚接触这方面,研究研究,散分时一定记得给一份,哪位大大能够给段接收数据,并进行加法运算,将内码还原成汉字的代码啊
 
请问楼主用串口发送汉字的是用在什么项目上?
 
to lycpxm: 可能是用于LED显示屏之类的
 
信息不是我发送的,我只是接收,对方发给我的信息就是这样,为了起到一点加密作用,他把每个汉字的内码,都减去了相应的值,我得转回成汉字啊,凡是需要减的部份,前面后面都有特定字符做标志,第一次写,不会啦,请各位大虾不吝赐教。
举例子:凡是EE——FF之间接收到的十六进制数据,都需要加上50才是原码,汉字转成汉字,数据转成数字,显示到MEMO里,怎么处理?
 
说得不清不楚的。
是不是说对方发送汉字时
有一前导字符 EE
然后是 汉字内码 -50H
最后有一个 FF 表示结束?

你接收到字符时,一个一个判断不就行了,这和串口的关系不大。
var
buf : array[0..255] of char;
cBuf:array of char; // 把串口接收到的字符读到这个 Buffer 里。
Pos :Longint;
i:Longint;
s:Longint;
.....

for i:= 0 to Length(cBuf);
begin
if cBuf= $EE then
begin
s:= i;
break;
end;
end;

Inc(s);
Pos := 0;
while cBuf<> $FF do
begin
Buf[Pos]:= cBuf;
Inc(s);
end;

for i:= 0 to Length(Buf) do
begin
Buf:= Char(Integer(Buf)- $50);
end;

Memo1.text := String(Buf);

大约这样。
我随手写的。肯定有错,你再试试!
 
接收信息
var
i:integer;
recstr: array[0..500] of byte;
begin
move(buffer^,pchar(@recstr)^,BufferLength);
for i:=0 to bufferlength-1 do
begin
Redt_Test.Lines.Strings[0]:=Redt_Test.Lines.Strings[0]+chr(recstr);
end;
end;
 
程序我修改了一下,但转出来的都是乱码啊
 
已经解决了,谢谢大家
 
后退
顶部