我用delphi做串口通信,控件用的是mscomm.
现在出现的问题是mscomm在接收数据每接收8个字节就产生一次oncomm事件(我设置的MSComm1.RThreshold为1)。
初始化程序为:
if MSComm1.PortOpen then
MSComm1.PortOpen := false;//关闭端口
mscomm1.CommPort := 1;//指定端口
mscomm1.Settings := '9600,N,8,1';//其它参数
mscomm1.InBufferSize := 256; //接收缓冲区
mscomm1.OutBufferSize := 256; //发送缓冲区
mscomm1.InputMode := comInputModeBinary; //接收模式
mscomm1.InputLen := 0; //一次读取所有数据
mscomm1.SThreshold := 0; //一次发送所有数据
mscomm1.InBufferCount := 0; //清空读取缓冲区
mscomm1.OutBufferCount := 0; //清空发送缓冲区
MSComm1.RThreshold := 1; //设置接收多少字节开产生oncomm事件
mscomm1.PortOpen:=true; //打开端口
接收程序是:
procedure TForm1.MSComm1Comm(Sender: TObject);
var
xtemp:olevariant;
xscr:array of byte;
i,j:integer;
xRecData:string;
begin
i:=mscomm1.InBufferCount; //这个i的结果老出错
if i=0 then
exit;
if mscomm1.CommEvent=2 then
begin
xtemp:=mscomm1.Input;
setlength(xscr,i);
xscr:=xtemp;
for j:=0 to i-1 do
xRecData:=xRecData+inttohex((xscr[j]),2);
memo2.Text:=memo2.Text+xrecdata;
prodata(xrecdata);//针对接收到的数据进行处理
xrecdata:='';
end;
end;
接收到的字节个数显示不对。应该怎么办?我需要接收不同的字节个数,分别是1,9,10,23。
请各位帮帮忙,谢谢!
现在出现的问题是mscomm在接收数据每接收8个字节就产生一次oncomm事件(我设置的MSComm1.RThreshold为1)。
初始化程序为:
if MSComm1.PortOpen then
MSComm1.PortOpen := false;//关闭端口
mscomm1.CommPort := 1;//指定端口
mscomm1.Settings := '9600,N,8,1';//其它参数
mscomm1.InBufferSize := 256; //接收缓冲区
mscomm1.OutBufferSize := 256; //发送缓冲区
mscomm1.InputMode := comInputModeBinary; //接收模式
mscomm1.InputLen := 0; //一次读取所有数据
mscomm1.SThreshold := 0; //一次发送所有数据
mscomm1.InBufferCount := 0; //清空读取缓冲区
mscomm1.OutBufferCount := 0; //清空发送缓冲区
MSComm1.RThreshold := 1; //设置接收多少字节开产生oncomm事件
mscomm1.PortOpen:=true; //打开端口
接收程序是:
procedure TForm1.MSComm1Comm(Sender: TObject);
var
xtemp:olevariant;
xscr:array of byte;
i,j:integer;
xRecData:string;
begin
i:=mscomm1.InBufferCount; //这个i的结果老出错
if i=0 then
exit;
if mscomm1.CommEvent=2 then
begin
xtemp:=mscomm1.Input;
setlength(xscr,i);
xscr:=xtemp;
for j:=0 to i-1 do
xRecData:=xRecData+inttohex((xscr[j]),2);
memo2.Text:=memo2.Text+xrecdata;
prodata(xrecdata);//针对接收到的数据进行处理
xrecdata:='';
end;
end;
接收到的字节个数显示不对。应该怎么办?我需要接收不同的字节个数,分别是1,9,10,23。
请各位帮帮忙,谢谢!
解决方案 »
- 以管理员身份连接到oracle数据库
- 关于delphi里dll定义结构体和类的问题
- 这个就是我的主程序(问题在我今天发的第一个帖子中)
- 如何获取远程计算机的路径
- 新手想学习做一个Edit的组件,主要功能是设一属性CanAccept为真时,Edit则只能输入数字,请问怎样实现!
- 多表更新问题:两个表的字段不重复,由id关联,inner join 查询后,怎样使dbgrideh支持更新数据?
- 有谁见过kvLabel这个控件。
- Raptor(猛禽)的代码怎么使用
- 请问高手:我想用程序代码在PageControl中加入WebBrower控件(在程序的其它部位已用到了这个控件),我要如何写代码,具体要加到PageControl的哪个页内?
- 关于Delphi中的传输问题
- quickrep打印问题
- 有用过AutoUpgraderPro的看看
然后再接收的时候,发现是先收到前面的8个字节BA D1 05 01 02 03 04 05 ,
然后再收到最后一个字节0F
mscomm1.InputLen := 0; //一次读取所有数据
mscomm1.SThreshold := 0; //一次发送所有数据
为什么是零!?这个两个属性是干啥用的
改成你的1,9,10,23。
试试
mscomm一次只能接收8个字节吗?在MSComm1.RThreshold := 1时,其他条件不变!
有没有办法解决这个问题???
procedure TForm1.MSComm1Comm(Sender: TObject);
有点问题。
偶一直不用的。
偶一直这么用:
function serialsend(mscomm:TMSComm):Integer;
var
//errmessage:string;
recvlen:Integer;
i: integer;
reData:array of Variant;
restr: string;
StrSend: string;
TxBuff: OleVariant;
begin
if mscomm.PortOpen = false then mscomm.PortOpen := True;
try
StrSend := ''; //重置它的大小,为0~n,int为n的类型。 //varByte为TxBuff每一个元素的类型。
TxBuff := VarArrayCreate([0, 255],varByte);
//填充元素其中buff为你定义的一个固定数组,其中有你要发的数据
StrSend := '';
for i := 0 to XorLen do
begin
TxBuff[i] := ApduSendDataBuff[i];
StrSend := StrSend + IntToHex(ApduSendDataBuff[i], 2) + ' ';
end;
WriteLog('发送命令:' + StrSend);
mscomm.Output:=TxBuff;//发送数据 XorLen := 0;
FillChar(ApduRecvDataBuff, High(ApduRecvDataBuff) + 1, 0);
FillChar(ApduSendDataBuff, High(ApduSendDataBuff) + 1, 0);
Sleep(300); if mscomm.InBufferCount > 0 then
begin
redata := mscomm.Input; // 接收数据 for i := 0 to vararrayhighbound(redata,1) do
begin
ApduRecvDataBuff[i] := Integer(redata[i]);
restr := restr + IntToHex(Integer(redata[i]), 2) + ' ';
end;
WriteLog('接收数据:' + restr);
end else
begin
WriteLog('接收数据:' + restr);
Result := 0;
Exit;
end;