串口多线程
我开两个线程对一个串口进行读取数据,有时某个线程发送指令到串口,串口并没接收到数据,我想是不是串口在同时处理两个线程时,没有时间的等待啊???请问如何解决??
线程主要功能:发送指令(读取硬件信息)
串口功能:判断接收的数据,将对应的数据显示到相应的界面上
代码如下:
//----------------------------线程主要代码-----------------------
procedure SendCommand.Execute;
var
i,b:integer;
Curr_Powe:byte;
dwTick:DWORD;
begin
//FreeOnTerminate:=true; //用于设置线程终止时是否自动删除线程对象
i:=0;
while not terminated do
begin
if i<> RunTimes then
begin
//发送加电加指令
IF ControlsPanel=0 then SendString(HexStrToStr('AA 55 11 10 00 00 55 AA')) //启动电机 1
else SendString(HexStrToStr('AA 55 11 20 00 00 55 AA')); //启动电机 2
//加电延时
sleep(PowerContinueTime);
//发送刹车指令
if ControlsPanel=0 then SendString(HexStrToStr('AA 55 22 10 00 00 55 AA')) //停止电机 1
else SendString(HexStrToStr('AA 55 22 20 00 00 55 AA'));
sleep(100);
//发送读刹车指令
if ControlsPanel=0 then SendString(HexStrToStr('AA 55 33 10 00 00 55 AA')) //读取电机 1
else SendString(HexStrToStr('AA 55 33 20 00 00 55 AA'));
//停机时间
sleep(StopContinueTime);
I:=I+1;
if ControlsPanel=0 then FrmMain.LabelTitleA.Caption:=inttostr(i);
if ControlsPanel=1 then FrmMain.LabelTitleb.Caption:=inttostr(i);
end;
end;
end;
//----------------------------发送指令过程-------------------------------------
procedure SendCommand.SendString(const str: string);
begin
FrmMain.Comm.WriteCommData(Pchar(str),Length(str));
sleep(100);
end;
//串口接收事件
procedure TFrmMain.CommReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
str: string;
i:integer;
RevA:array [1..100] of byte;
RevB:array [1..100] of Integer;
Checksum:integer;//校验和
time:string; //刹车时间
current:string; //电流值
power:string; //功率
begin
Checksum:=0; //校验和清零
Move(buffer^,RevA,bufferLength);
if bufferLength=14 then
begin
for i:=1 to BufferLength do RevB[i] := RevA[i]; //将byte转成intger型
for i:=4 to 11 do Checksum:= Checksum+RevA[i];
Checksum:=Checksum mod 256; //计算校验和
if Checksum=RevB[12] then //判断校验和是否相等
begin
time :=IntToHex(RevB[4],2)+ IntToHex(RevB[5],2); //刹车时间
current:=IntToHex(RevB[6],2)+IntToHex(RevB[7],2); //电流
power :=IntToHex(RevB[8],2)+IntToHex(RevB[9],2)+ //功率
IntToHex(RevB[10],2)+IntToHex(RevB[11],2);
end;
if RevB[3]=16 then
FrmMain.ConfigValue(0,HexToDex(time),HexToDex(current),HexToDex(power)); //显示到对应的界面上
if RevB[3]=32 then
FrmMain.ConfigValue(1,HexToDex(time),HexToDex(current),HexToDex(power));
end;
end;