串口传输byte型数据的问题 在线等待答案(50分)

  • 主题发起人 主题发起人 lizhi79
  • 开始时间 开始时间
L

lizhi79

Unregistered / Unconfirmed
GUEST, unregistred user!
单片机要接受命令字 01H 00H 00H 00H 0FH
我向串口发送的数据到底应该是string型的还是byte型的
如果我发'010000000F'的字符串是不是不对
如果我按照byte型发送,0F应该用十进制还是十六进制发送
var
arrSend[0..4] of byte;

arrSend[0]:=1;
arrSend[1]:=0;
arrSend[2]:=0;
arrSend[3]:=0;
arrSend[4]:=15;

如果我按照上面的赋值把arrSend发送过去,单片机接收的结果是否正确呢?
我用的是writefile这个API函数向串口写数据的,已字符串的方式传送已经实现,但是就是不知道我传送过去的字符串单片机是否能识别。

另外从如果发送字符 0F 和发送字节 0F 到单片机,那边接收的是不是 00 0F 和 0F
如果发送的是字符 255 和字节 255 ,单片机接收后又是什么东西呢?
不好意思初次涉及这方面的编程,问题多多,得到答案就给分
 
接收方应该是BYTE,要不你就转换,(在网上找个SPComm控件)
源码如下!
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, SPComm, ExtCtrls, Buttons, Registry, Printers;

type
TForm1 = class(TForm)
Comm1: TComm;
Memo1: TMemo;
Memo2: TMemo;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Button1: TButton;
Button2: TButton;
PrintDialog1: TPrintDialog;
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
procedure SpeedButton2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Viewstring:string;
i:integer;
rbuf,sbuf:array[1..7] of byte;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
begin
comm1.StartComm;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
comm1.StopComm;
end;

procedure senddata;
var
i:integer;
commflg:boolean;
begin
viewstring:='';
commflg:=true;
for i:=1 to 7 do
begin
if not form1.Comm1.writecommdata(@sbuf,1) then
begin
commflg:=false;
break;
end;
sleep(2); {发送时字节间的延时}
viewstring:=viewstring+inttohex(sbuf,2)+' ';
end;
viewstring:='发送'+viewstring;
form1.memo1.lines.add(viewstring);
form1.memo1.lines.add('');
if not commflg then messagedlg('发送失败!',mterror,[mbyes],0);
end;

procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);
var
i:integer;
begin
viewstring:='';
move(buffer^,pchar(@rbuf)^,BufferLength);
for i:=1 to bufferlength do
viewstring:=viewstring+inttohex(rbuf,2)+' ';
viewstring:='接受'+viewstring;
memo1.lines.add(viewstring);
memo1.lines.add('');
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
begin

sbuf[1]:=byte($f5); {帧头}
sbuf[2]:=byte($10); {命令号}
sbuf[3]:=byte($04);
sbuf[4]:=byte($c3);
sbuf[5]:=byte($60);
sbuf[6]:=byte($50);
sbuf[7]:=byte($12);
//sbuf[6]:=byte($45); {帧尾}
senddata;{调用发送函数}
end;

procedure TForm1.Button1Click(Sender: TObject);
var
reg : TRegistry;
ts : TStrings;
i : integer;
begin
reg := TRegistry.Create;
try
reg.RootKey := HKEY_LOCAL_MACHINE;
reg.OpenKey('hardware/devicemap/serialcomm',false);
ts := TStringList.Create;
try
reg.GetValueNames(ts); //获得子键下的所有项
for i := 0 to ts.Count -1 do
begin //把每一项下的串值显示在Memo1中
Memo1.Lines.Add(reg.ReadString(ts.Strings));
end;
finally
ts.Free;
end;
finally
reg.CloseKey;
reg.free;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
var

pDevice : pChar;

pDriver : pChar;

pPort : pChar;

hDMode : THandle;

begin

if PrintDialog1.Execute then begin

GetMem(pDevice, cchDeviceName);

GetMem(pDriver, MAX_PATH);

GetMem(pPort, MAX_PATH);

Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);

if lStrLen(pDriver) = 0 then begin

GetProfileString('Devices', pDevice, '', pDriver, MAX_PATH);

pDriver[pos(',', pDriver) - 1] := #0;

end;

if lStrLen(pPort) = 0 then begin

GetProfileString('Devices', pDevice, '', pPort, MAX_PATH);

lStrCpy(pPort, @pPort[lStrLen(pPort)+2]);

end;

Memo1.Lines.Add('Device := ' + StrPas(pDevice));

Memo1.Lines.Add('Driver := ' + StrPas(pDriver));

Memo1.Lines.Add('Port := ' + StrPas(pPort));

FreeMem(pDevice, cchDeviceName);

FreeMem(pDriver, MAX_PATH);

FreeMem(pPort, MAX_PATH);

end;


end;

end.
 
应该用byte行变量,如果按照字符发送,mcu接收的是发送字符的asic。
0F应该用十进制还是十六进制发送,一样的不过是显示的不同。也就事用十进制还是十六进制显示,没有用十进制还是十六进制发送的说法。
如果发送的是字符 255 和字节 255 ,单片机接收后又是什么东西呢?:32 35 35 和FF.

你问的太多了,需要给留E_mail,给你例子程序。

 
多人接受答案了。
 
后退
顶部