delphi中使用cport控件编写上位机接收蓝牙串口数据问题
delphi吧
全部回复
仅看楼主
level 3
逸小飞🔥 楼主
最近在使用cport控件做一个上位机,要实事采集下位机发来的数据,使用USB转串口采集后在memo上显示没问题,同样的数据处理使用蓝牙串口就会出现数据卡顿问题,把count值实时显示在edit上发现数据处理的速度没有接收的快,且最大为8092。常规来讲有线串口应该比无线串口快呀,为什么反而用无线的反倒处理不过来呢。请大神帮忙解决,代码如下:
procedure TForm_Main.ComPortRxChar(Sender: TObject; Count: Integer);
var
Str:ansistring;
Temp:ansistring;
i:integer;
begin
Edit_SendData.text:=inttostr(count);
if(AdvanceReceiveFlag)then
begin
if not ReadStatu then
begin
i:=0;
repeat
ComPort.ReadStr(temp,1);
i:=i+1;
ReceiveCount:=ReceiveCount+1;
until (Ord(temp[1])=$88)or(i=count) ;
if(Ord(temp[1])=$88)then
begin
Str:=temp;
ReadStatu:=true;
end;
end
else
begin
i:=0;
repeat
ComPort.ReadStr(temp,1);
str:=str+temp;
i:=i+1;
ReceiveCount:=ReceiveCount+1;
until (i=23)or(i=count) ;
if(i=23)then
begin
ReadStatu:=false;
if(DataShowFlag)then
begin
str:=StrToHex(str);
Memo_AdvanceReceive.Lines.add(str);
end;
end;
end;
end;
2014年09月05日 07点09分 1
level 10
不清楚什么问题,但是我把我做的蓝牙串口通讯的关键代码给你发一下。我的通讯不卡顿,且无丢失。
procedure TForm1.FormCreate(Sender: TObject);
begin
form1.MSComm1.CommPort:=5;
try
form1.MSComm1.PortOpen:=true;
a:=form1.MSComm1.PortOpen;
except
end;
form1.Timer1.Enabled:=true;
end;
这上面是打开端口,并设置接收间隔,,timer1的间隔按你的需求去添加。
procedure TForm1.Timer1Timer(Sender: TObject);
var
s,s1,s2:string;
begin
s:=form1.MSComm1.Input;
//每包含一次MSComm1.Input函数,就会自动清空缓冲区。
if length(s)>0 then
begin
你的代码放这里;
end;
end;
2014年09月15日 14点09分 2
你用的是MSCOM控件,我用的是CPort,不过我的问题已解决,谢谢
2014年09月18日 13点09分
level 10
能贴一下关键代码吗,大家一起分享,一起学习,DELPHI才能更好的发展
2014年09月18日 15点09分 3
现在出了另外一个问题,还想请教下,我用tchart控件显示波形过一段时间后会出现错误,如果直接显示数据在memo里是没问题的,只要打开波形显示就会出现这个问题,还请赐教。上次提到的源码见4楼。
2014年09月22日 03点09分
回复 深蓝逸飞 :access violation at address 0058e081
2014年09月22日 03点09分
level 3
逸小飞🔥 楼主
if(UncodeFlag)then
begin
//AppendStr(ReceiveStrBuf,str);
ReceiveStrBuf:=ReceiveStrBuf+str; //保存数据
while(length(ReceiveStrBuf)>0) do //循环读数
begin
TotalLen:=length(ReceiveStrBuf); //计算长度
LeaveLen:=TotalLen;
if(not ReadReady)then
begin
for i := 1 to TotalLen do
begin
Temp:= Ord(ReceiveStrBuf[1]);
if Temp = FrameIndex_Receive then break; //如果不等于0xAA,则删除,否则跳出循环
delete(ReceiveStrBuf,1,1);
LeaveLen:=LeaveLen-1;
end;
// ReceiveCount:=ReceiveCount+i;
if(LeaveLen=1) then exit; //如果数据为空,则退出
ReadReady:=true;
end
else
begin
if(LeaveLen<FrameLength_Receive)then exit; //如果长度不足则退出继续读数
str:=**;
str:=copy(ReceiveStrBuf,1,FrameLength_Receive);
delete(ReceiveStrBuf,1,FrameLength_Receive);
// LeaveLen:=LeaveLen-FrameLength;
// ReceiveCount:=ReceiveCount+FrameLength;
ReadReady:=false;
DataProcess(str);
end;
end;
end
2014年09月22日 03点09分 4
level 10
估计是有在范围外的数据,你试试同时把数据同步到memo里面和tchar,然后看出错的时候memo接收的这一行是什么数据,看看是不是这个问题。
2014年09月22日 04点09分 5
同时开两个比较慢,但是不会出现那个问题。估计是存取速度太快的原因,网上貌似也有一个同样的问题,也是存取太快,但是还是不知如何解决,我当然要越快越好,慢下来就跟不上发送的速度了
2014年09月22日 06点09分
回复 深蓝逸飞 :我的意思不是说同时开两个程序。而是在一个程序里面边在memo里面显示数据,边输入到这个窗体的tchar里面。或者你这样做把临时数据存取在一个变量里面,然后添加这个变量到tchar和memo里面,这样就不用二次读取串口。
2014年09月22日 15点09分
回复 凄惨二进制 :恩,其实就是那样的,没有读两次串口
2014年09月23日 01点09分
回复 深蓝逸飞 :那不对啊,多添加一个字符串处理对速度根本没有影响啊。就像是多加一个电子的质量对原子核也没多大影响一样。
2014年09月23日 09点09分
1