串口多线程

qlonsh 2010-01-12 10:18:49
我开两个线程对一个串口进行读取数据,有时某个线程发送指令到串口,串口并没接收到数据,我想是不是串口在同时处理两个线程时,没有时间的等待啊???请问如何解决??
线程主要功能:发送指令(读取硬件信息)
串口功能:判断接收的数据,将对应的数据显示到相应的界面上
代码如下:

//----------------------------线程主要代码-----------------------
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;
...全文
303 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdx001 2010-02-04
  • 打赏
  • 举报
回复
我现在做了两个线程!!一个串口的读写线程、一个显示和键盘的线程,在主函数里做了个死循环,程序运行一段时间后会自动跳出来!!请高手们帮忙分析一下什么原因!!
zxf52 2010-01-14
  • 打赏
  • 举报
回复
qlonsh,你所谓的临界区方法 ,建议你别用,因为你完全可以用程序来避免的。如果你前面有错误,那只能说明你的程序有问题。。。

对于竞争性的资源。。。。要学会用一个主题来对付它。如果A,B2个函数都用到收发,那为什么不考虑用一个单独的C,也就是C来操纵竞争资源,就它一个人操作竞争资源,A,B的请求化为一个请求队列,然后让C一个个处理呢?

语言服从思想。代码服从结构。软件服从简单。
qlonsh 2010-01-12
  • 打赏
  • 举报
回复
我想用一个指令队列实现,就是把线程发送的指令形成一个队列,然后这个队列就每隔一段时间,就发送相应的数据,但不知如何着手啊???
yangyugw 2010-01-12
  • 打赏
  • 举报
回复
485总线---半双功的,也就是主从模式,所以你想让下面2个设备同时给你pc发数据是不可能的

建议使用多串口卡吧,给每个设备一条通道,你在用多线程操作不同串口就没问题了
wliaoc 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qlonsh 的回复:]
有两个工位啊,这两个工位是独立的,互不影响
[/Quote]

楼主是要两个操作用一个串口处理,没要求两个操作同时处理串口吧?
接收一般只用一个线程收,接收后的处理程序可以发往两个地方,这是我们可以控制的,启动发送的话,不同操作都触发同一发送机制就好了,要提高稳定性的话,加锁吧
yangyugw 2010-01-12
  • 打赏
  • 举报
回复
你这种方式本身是有问题的,你pc端如果同时给两个工位发数据,两个工位同时相应回来的数据,在串口上是不行的,你是接收不到数据的
qlonsh 2010-01-12
  • 打赏
  • 举报
回复
有两个工位啊,这两个工位是独立的,互不影响
ZyxIp 2010-01-12
  • 打赏
  • 举报
回复
读取串口一个线程就可以了,读取后放在一个缓冲区,其它的线程来读取缓冲区的内容处理业务
lhy 2010-01-12
  • 打赏
  • 举报
回复
串口是Overlapped的吗?
yangyugw 2010-01-12
  • 打赏
  • 举报
回复
串口上面用2个线程为什么要这样做,没有理由啊

异步收发就可以了

多线程处理一个串口的话,从多线程理论来说
按你上面线程内的代码,那么可能会同时发送不同的buffer到你的串口中,
这本身可能会导致你设备端无法正常接收到数据吧
你现在首先查,单线程是否设备会给与相应
另外,我看你线程内代码应该是有逻辑的,比如停车,开车什么的,那么两个线程业务逻辑一定会混乱的啊
所以应该无法使用多线程完成你的业务,并且看不出来使用多线程的必要和理由
qlonsh 2010-01-12
  • 打赏
  • 举报
回复
办法总是有的吧!
dd_zhouqian 2010-01-12
  • 打赏
  • 举报
回复
一个串口处理不了两个线程的
qlonsh 2010-01-12
  • 打赏
  • 举报
回复
终于都搞定了,谢谢各位的帮助,虽然最终我没有采纳你们的方法,但还是谢谢了,原来可以用临界区来实现的,1. 临界区
临界区是一种最直接的线程同步方式。所谓临界区,就是一次只能由一个线程来执行的一段代码。如果把初始化数组的代码放在临界区内,另一个线程在第一个线程处理完之前是不会被执行的。在使用临界区之前,必须使用InitializeCriticalSection()过程来初始化它。
在第一个线程调用了EnterCriticalSection()之后,所有别的线程就不能再进入代码块。下一个线程要等第一个线程调用 LeaveCriticalSection()后才能被唤醒。

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧