求DELPHI编写串口通讯程序的简单例子 用MSComm控件的 要详细的刚学delphi的就能看懂的那种
发布网友
发布时间:2022-04-30 04:36
我来回答
共3个回答
热心网友
时间:2023-10-13 05:15
这里MSComm控件的属性Rthreshold设置为0,采用查询的方法读取串口数据。
Function readFromPLC(ReadChar:Array of char;ReadAddress:Array of Byte;ReadBytes:Integer):Booleam;
Var
ReadDataSum:integer;
DataSumCheck:integer;
tmpStr:String;
tmpchr,chr,chr2:char;
tmpVar:Variant;
Input:Variant;
InputLen,i,tmpInt:Integer;
tmpVar[1]:=$02;//STX 起始标志
tmpVar[2]:=$30;//CMD0 读命令
DataSumCheck:=DataSumCheck+$30
DataSumCheck:=0;//和校验位初始化
tmpVar:=VarArrayCreate([1,11]),
//创建数组,用来存放待发送的命令格式数据流
tmpVar[3]:=ReadAddress[0];
//读位元件4位起始地址:0~3
DataSumCheck:=DataSumCheck+ReadAddress[0];
tmpVar[4]:=ReadAddress[1];
DataSumCheck:=DataSumCheck+ReadAddress[1];
tmpVar[5]:=ReadAddress[2];
DataSumCheck:=DataSumCheck+ReadAddress[2];
tmpVar[6]:=ReadAddress[3];
DataSumCheck:=DataSumCheck+ReadAddress[3];
tmpStr:=IntToHex(ReadBygtes,2);
//读位元件个数转化为2位16进制
tmpChr:=tmpStr[1];//取16进制的低位
tmpVar[7]:=Ord(tmpChr);//转化为ASCII形式
DataSumCheck:=DataSumCheck+Ord(tmpChr);
mpChr:=tmpStr[2];// 取16进制的高位
tmpVar[8]:=Ord(tmpChr);//转化为ASCII形式
DataSumCheck:=DataSumCheck+Ord(tmpChr);
tmpVar[9]:=$03;//ETX 停止位标志
DataSumCheck:= DataSumCheck+$03;
tmpStr:=IntToHex(DataSumCheck,2);
//和校验位转化为2位16进制
tmpChr:=tmpStr[1];
tmpVar[10]:=Ord(tmpStr);
tmpChr:=tmpStr[2];
tmpVar[11]:=Ord(tmpStr);
MainForm.MSComm.Outupt:=tmpVar;
//向发送缓冲区写数据流
Sleep(1000);//延时
InputLen:=MaiForm.MSComm.InBufferCount;
//返回输入缓冲区内的等待读取的字节个数
Input:=MaiForm.MSComm.Input;
//读取接收缓冲区中的数据
If InputLen>0 then//待读取的字节个数大于0
Begin
If Input[0]=$02 then//STX返回数据的起始志
Begin //读取返回数据
ReadDataSum:=0;//返回值求和初始化
For i:=1 to ReadBytes do
Begin
tmpInt:=Input[i];
ReadChar[i-1]:=chr(tmpInt);
//将返回的ASCⅡ值转换为字符型
ReadDataSum:=ReadDataSum+Input[1];
End;
Inc(i);
If Input[i]=$03 then //ETX,停止位标志
Begin
ReadDataSum:= ReadDataSum+$03;
tmpStr:=InttoHex(ReadDataSum,2);
chr1:=tmpStr[1];//求校验位
chr2:=tmpStr[2];
if (Ord(chr1)=Input[i+1]) and
(Ord(ch2)=Input[i+2]) then//校验成功
Begin //数据取成功
Result:=True;
ShowMessage(‘DataRead succeed’);
end
else begin //校验错
Result:=False;
ShowMessage(‘DataRead Check fail’);
end;
end; //ETX
end //STX
else // If Input[0]<>$02
Result:=False;
end
else // If InputLen=0
Result:=False;
End;
热心网友
时间:2023-10-13 05:16
email 给 homewaygd@gmail.com
Good luck
热心网友
时间:2023-10-13 05:16
说点,可能你觉得是废话。以前这个问题纠结我很久。有本专门讲delphi串口通信的书,讲得很细。在图书馆或者书市找找。不好意思,书名忘了。这本书很管用,比当面问人还有用。记得我当时还请那位学长吃了顿饭。结果还没弄明白。其实有的事情必须靠自己的。后来我才后悔在图书馆搜书的时候看得不细。像你这样在百度砸分学东西就更不现实了。呵呵~~~~