Memo2.Text里的内容都是16进制如下:
24 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 44 00 00 00 00 00 00 00 42 00 00 00 00 00 00 00 42 00 00 00 00 00 00 00 E7 00 ...现在我要把这些16进制通过MSCOMM控件发送到串口,但问题来了,就是如果碰到大于127的16进制(比如E7),就不会发送出去,怎么办,要发送前判断E7是否大于127吗,然后怎么处理才能发送出去呢? s := Memo2.Text;
while s<>'' do
begin
t:=t+chr(strtoint('$'+copy(s,1,2)));
delete(s,1,3);
end;
MSComm1.output:= t;
24 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 44 00 00 00 00 00 00 00 42 00 00 00 00 00 00 00 42 00 00 00 00 00 00 00 E7 00 ...现在我要把这些16进制通过MSCOMM控件发送到串口,但问题来了,就是如果碰到大于127的16进制(比如E7),就不会发送出去,怎么办,要发送前判断E7是否大于127吗,然后怎么处理才能发送出去呢? s := Memo2.Text;
while s<>'' do
begin
t:=t+chr(strtoint('$'+copy(s,1,2)));
delete(s,1,3);
end;
MSComm1.output:= t;
检查一下你的接收程序 ?
你发送不出去大于127的字符,是因为你在发送时候的数据类型不正确,即t的数据类型不正确。
MSComm控件本身可以发送大于127的十六进制值,但要求其数据类型必须是Variant类型才可以。
http://download.csdn.net/source/1441583
会不会是你的串口协议是7个数据位?
这种问题可能用法是这样的:
var s:byte;
begin
s:=171;
mscomm1.output:=char(s); //通过串口按件发送数据
end;
这种用法对于MSComm来说是错误的,因为你的S定义的是Byte类型,这样的话只能发送小于127的字节。
请各位仔细看一下MSComm的Output类型定义,它定义的是OleVariant类型,你将其它类型的数据赋值给OleVariant类型,中间编译程序会代你进行转换,但隐式转换是会出错的!这也是为什么不能发送大于127值的原因。
应该这样: procedure TForm1.SendButtonClick(Sender: TObject);
var
Data:OleVariant;
Bytes:Array [0..255] of Byte;
i:integer;
begin
//创建Variant类型的数组,数组元素为字节类型,个数256个
Data:=VarArrayCreate([0,255],varByte);
//为每个数组元素赋值
for i:=0 to 255 do
begin
Data[i]:=i;
end;
//发送这256个字节
MSComm1.Output:=Data;
end;
发送结果可用其它的串口调试器接收,发现其值是从00到FF的值,中间任何一个值都不缺,也就是说发送是成功的
Procedure Form1.Button1Click(Sender:TObject)
var
t:OleVariant;
i:Integer;
s:String;
begin
s:=Memo2.Text;
t:=VarArrayCreate([0,Length(s)/3],varByte);
i:=0;
while s <>'' do
begin
t[i]:=Byte(strtoint('$'+copy(s,1,2)));
delete(s,1,3);
inc(i);
end;
MSComm1.output:= t;
end;
http://topic.csdn.net/t/20030725/09/2069612.html
用你提供的程序,可以正确发送用下面的程序,也可能接收到并显示
procedure TForm1.MSComm1Comm(Sender: TObject);
var
vtmp, ovTmp: variant;
i, iReceived: Integer;
bTmp: Byte;
s: string;
begin
case MSComm1.commEvent of
comEvSend:
begin end;
comEvReceive:
begin
mscomm1.InputMode := comInputModeBinary; iReceived := mscomm1.InBufferCount;
ovtmp := mscomm1.Input;
vtmp := VarArrayCreate([0, iReceived], varbyte);
vtmp := ovtmp;
s := '';
for i := 0 to iReceived - 1 do
begin
btmp := vtmp[i];
// s := s + chr(bTmp) //字符接收 else
s := s + ' '+ inttohex(ord(chr(bTmp)), 2); //16进制接收
end;
form1.RichEdit1.Text := form1.RichEdit1.Text + s;
memo2.Lines.Add(s);
end;
end;
end;但是我将串口的2.3脚短接的时候,程序就出错了,不知道原因,能否帮忙找找原因?以前调试程序一直就是将2.3脚短接,这样可以省一个串口或者电脑
MSComm1.InputLen
MSComm1.SThreshold
MSComm1.RThreshold iReceived 总是返回大于248以上的数,返回一堆00的数据,或者下标溢出,这种情况只要是不短接2,3pin时就不会出现
初始化串口的时候需要加上
Mscomm1.InputLen :=0; // Input读取整个缓冲区内容
0~0xff都可以发送