有关多机通讯(如三台PC),救小妹一命吧! HELP!!!(210分)

  • 主题发起人 主题发起人 blue-wang
  • 开始时间 开始时间
B

blue-wang

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用DELPHI实现三台PC机间的通讯,相互间收发不能冲突。
1.硬件该如何联接(最好是串口);
2.软件又如何实现?
我以前没学过WINDOWS下的编程语言,最近虽也看了一些有关DELPHI编程的书,但还是不入门。可事态紧急,恳请各位同胞相助。希望能回答的傻瓜一些,越详细越好,每个细节如何设置,源代码如何等等(注释越详越好!)
分也许不多,但已倾家荡产,刚入这里没有资本,可实在是诚心相赠,不要让小妹的分白流呀,否则以后没救了!
在此先谢了!解决了改日必重谢!
 
作什么用,工业控制吗

用串口?而且3台pc?那可太麻烦了,要做很多底层工作。

两台就好办,可以使用win95的直接电缆连接,通过硬盘交换数据。。。
有网卡也简单了,windows那么多的通讯协议。。

在描述一下 ,可不可以换个办法?
 
网卡吧,才50元一块,同轴电缆2块一米。成本用不了解情况200块。
>>2.软件又如何实现?
不用多虑了,win9x自带。
 
同意,组个小网就完全解决问题了,花费也不多。至少比自己写底层代码强多了,有那闲功夫您还不如去打工赚点外快
 
如果两台PC可以直接用网线连。如果超过两台可以买一个HUB把它们
连起来。一个小的HUB也很便宜的,2K左右吧。
软件就用WINDOWS的通讯协议就可以了。
如果你要用串口,那还没有见过。可以把你的需求说详细些吗?
 
用网卡比较简单,用串口很烦,实在不好意思,我也不大懂,帮不了你了.
 
怎么会这样?!是我讲的不够细吧?!
我不是为了联机呀!是做毕设,想用DELPHI编程,实现多主机的一种通讯方式,
一台机子发送信息,另两台监听,和自己的标识符比较,相同则是发给自己的,接收,不同则不收。三台机子都可发送,接收,不分主从。三台机子发送前都要监听总
线,总线空时才可送,有信息时则要比较,等待,接收或不收,然后才可发送自己的。说明白了吗?
 
再请教各位:
直接电缆相连,9针串口的地线是几脚?(5还是7)
9针和25针的口相连可以吗?怎么连?
 
>>9针和25针的口相连可以吗
可以

找一本I/O接口编程的书看看吧
 
我觉得该文主人提出的问题实在有些过时,任何一个想法都是有其实际需要的。我想你的毕业设计还是换个题目吧,这样的设计即使能实现,又有何作用?

从成本,从性能,从系统的可扩展性,从应用价值都不行。恕我直言,因为你毕竟是要走向社会的,只有社会需要的,才是你要研究的。




 
九针和二十五针的引脚连接一般如下:
  9-Pin 25-Pin
Carrier Detect 1 8
Receive Data 2 3
Transmit Data 3 2
Data Terminal Ready 4 20
System Ground 5 7
Data Set Ready 6 6
Request to Send 7 4
Clear to Send 8 5
Ring Indicator 9 22

用普通的rs232通讯好象不能同时直接接多个串口设备,
要接得加一些额外的电路,以使设备能被驱动起来。

用串口连三台计算机是还有点小问题,就是数据串音的问题,
就象普通总线网要加终结器一样,通过加50欧姆的电阻来尽可能地消掉反射信号。
在串口通讯中,很难算出要加多大的电阻,得自己去试。(反正我是不知道有什么公式可套)
同时,由于干扰,
需要你在自己定义的通讯协议中自己进行纠错。

软件方面就是需要你自己定义通讯协议,
以便知道是发出的数据还是命令,是主控机,还是从听机,
还有就是纠错处理了。

用串口通讯还是用网卡通讯有时是要分析具体问题来取舍的。
在工控领域,串口通讯应用很广,
如使用485进行串口通讯,通迅距离可达1.X公里。

 
不利用TCP/IP岂不是太......那个?
如果用TCP/IP,就要装网卡和WINDOWS的拨号网络了,这样编程简单.

如果一定要串口,试试直接电缆联接,这恐怕串口通讯上是最简单的了.
(也是WINDOWS自带的,所有机器一致地设置用串口还是并口)
然后通过机器名可以联系,互传文件,
你也可以使用IPX协议通讯,IPX协议具体没玩过.

如果一定要从底层自己做起,,,,,KAO,I 服了 U
 
直接电缆相连,9针串口的地线是几脚?(5还是7)
^^^^^是5
从串口直接联接三台电脑是可行的,Diablo有一个Battle Net就可以从串口联接四台电脑,不过,具体怎么做我就不清楚了。
 
按照 adminis 说的做
 
看来个位给出的硬件案已很多了,不过我还想多说一句,就是三机互连用一条
线是不行的,一般的连接都是一对一的,如何可以一对二呢?
但以前用过一个叫共享器的可心作到这一点。
再就的程序了吧。

Delphi中串行通信的实现

  随着现代信息技术的发展以及计算机网络的广泛使用,计算机通信技术已经日臻成熟,但串行通信作为一种灵活方便可靠的通信方式,仍不失为有效的通信手段,被广泛应用于工业控制中。在工业生产实践中,用PC机对工程实现实时监控,通常要求PC机能在用户界面上具有数据采集、数据处理以及控制信号的产生与传输等功能。在这种特定的环境下,PC机要与过程控制的实时信号相联系,就要求能实现对PC机的串行端口直接操作。Borland公司推出的Delphi是一种功能强大的高级编程语言,其具有的可视化面向对象的特性,特别适于在Windows环境下图形界面和用户程序的编制。本文就是介绍基于Windows95/NT操作系统用Delphi来实现PC机与下层PLC控制器之间的串口通信方法。

基于WIN95/NT的串行通信机制
  Windows操作系统的机制禁止应用程序直接访问计算机硬件,但它为程序员提供了一系列的标准API函数,使得应用程序的编制更加方便并且免除了对有关硬件的调试麻烦。在Windows95/NT中,原来Windows3.X的WM_COMMNOTIFY消息已被取消,操作系统为每个通信设备开辟了用户可定义大小的读/写缓冲区,数据进出通信口均由操作系统后台完成,应用程序只需对读/写缓冲区操作即可。WIN95/NT中几个常用的串行通信操作函数如下:

   CreatFile  : 打开串行口
   CloseHandle : 关闭串行口
   SetupComm  : 设置通信缓冲区的大小
   ReadFile   : 读串口操作
   WriteFile  : 写串口操作
   SetCommState : 设置通信参数
   GetCommState : 获取默认通信参数
   ClearCommErro: r清除串口错误并获取当前状态
   除上述几个函数外,还要经常用到一个重要的记录DCB(设备控制块)。DCB中记录有可定义的串行口参数,设置串行口参数时必须先用GetCommState函数将系统默认值填入DCB控制块,然后才可把用户想改变的自定义值设定。在WIN95/NT中进行串行通信除了解基本的通信操作函数外,还要掌握多线程编程。线程是进程内部执行的路径,是操作系统分配CPU时间的基本实体。每个进程都由单线程开始完成应用程序的执行。串行通信需要利用多线程技术实现,其主要的处理逻辑可以表述如下:进程一开始先由主线程做一些必要的初始化工作,然后主线程根据需要在适当时候建立通信监视线程监视通信口,当指定的串行口事件发生时,向主线程发送WM_COMMNOTIFY消息(由于WIN95取消了WM_COMMNOTIFY消息,因此必须自己创建),主线程对其进行处理。若不需要WM_COMMNOTIFY消息,则主线程终止通信监视线程。多线程同时执行,将会引起对共享资源的冲突。为避免冲突,就要用同步多线程对共享资源进行访问。WIN95提供了许多保持线程同步的方法,笔者采用创建事件对象来保持线程同步。通过CraeteEvent()创建事件对象,使用SetEvent() 或PulseEvent()函数将事件对象设置成信号同步。在应用程序中,利用WaitSingleObject() 函数等待同步的触发,等到指定的事件被其它线程设置为有信号时,才继续向下执行程序。

Delphi下的具体实现方法
  Delphi的强大功能和支持多线程的面向对象编程技术,使得实现串行通信非常简单方便。它通过调用外部的API函数来实现,主要步骤如下:首先,利用CreateFile函数打开串行口,以确定本应用程序对此串行口的占有权,并封锁其它应用程序对此串口的操作;其次,通过GetCommState函数填充设备控制块DCB,再通过调用SetCommState函数配置串行口的波特率、数据位、校验位和停止位。然后,创建串行口监视线程监视串行口事件。在此基础上就可以在相应的串口上操作数据的传输;最后,用CloseHandle函数关闭串行口。具体的程序如下,本程序用Delphi3.0编制在Win95环t境下调试通过,已投入实际应用中,供广大读者参考。
程序:
unit comdemou;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
const
Wm_commNotify=Wm_User+12;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
Procedure comminitialize;
Procedure MsgcommProcess(Var Message:Tmessage); Message Wm_commnotify;
{ Private declarations }
public
{ Public declarations }
end;
// 线 程 声 明
TComm=Class(TThread)
protected
procedure Execute;override;
end;
var
Form1: TForm1;
hcom,Post_Event:Thandle;
lpol:Poverlapped;
implementation
{$R *.DFM}
Procedure TComm.Execute; // 线 程 执 行 过 程
var
dwEvtMask:Dword;
Wait:Boolean;
Begin
fillchar(lpol,sizeof(toverlapped),0);
While True do Begin
dwEvtMask:=0;
Wait:=WaitCommEvent(hcom,dwevtmask,lpol); // 等 待 串 行 口 事 件;
if Wait Then Begin
waitforsingleobject(post_event,infinite); // 等 待 同 步 事 件 置 位;
resetevent(post_event); // 同 步 事 件 复 位;
PostMessage(Form1.Handle,WM_COMMNOTIFY,0,0);// 发 送 消 息;
end;
end;
end;

procedure Tform1.comminitialize; // 串 行 口 初 始 化
var
lpdcb:Tdcb;
Begin
hcom:=createfile('com2',generic_read or generic_write,0,nil,open_existing,
file_attribute_normal or file_flag_overlapped,0);// 打 开 串 行 口
if hcom=invalid_handle_value then
else
setupcomm(hcom,4096,4096); // 设 置 输 入, 输 出 缓 冲 区 皆 为4096 字 节
getcommstate(hcom,lpdcb); // 获 取 串 行 口 当 前 默 认 设 置
lpdcb.baudrate:=2400;
lpdcb.StopBits:=1;
lpdcb.ByteSize:=8;
lpdcb.Parity:=EvenParity; // 偶 校 验
Setcommstate(hcom,lpdcb);
setcommMask(hcom,ev_rxchar);
// 指 定 串 行 口 事 件 为 接 收 到 字 符;
end;
Procedure TForm1.MsgcommProcess(Var Message:Tmessage);
var
Clear:Boolean;
Coms:Tcomstat;
cbNum,ReadNumber,lpErrors:Integer;
Read_Buffer:array[1..100]of char;
Begin
Clear:=Clearcommerror(hcom,lpErrors,@Coms);
if Clear Then Begin
cbNum:=Coms.cbInQue;
ReadFile(hCom,Read_Buffer,cbNum,ReadNumber,lpol);
// 处 理 接 收 数 据
SetEvent(Post_Event); // 同 步 事 件 置 位
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
comminitialize;
post_event:=CreateEvent(nil,true,true,nil); // 创 建 同 步 事 件;
Tcomm.Create(False); // 创 建 串 行 口 监 视 线 程;
end;
end.
 
你的毕设比我的还。。。嘿嘿
 
要是想往复杂了做, 可以采用每台机器连两个串口, 自己做串口间的数据转发.
等价于自己实现一个简单的TCP+RIP协议.
 
一、在室内,距离不远的情况下,多机硬件连接的最佳方案是网卡+HUB。
如果一定要用串口,就需要用485协议,该协议为3线半双工。
PC的串口是232的,所以还需要有接口转换,其实电路很简单的,
电子专业的都会,如果不愿意自己设计,可以用现成的模块,
研华那里就有,大约500一个。
二、485似乎比较适合你,但编程是必不可少的,不过象你这样的课题,
实在很简单,如果需要,我可以给你一个样本。不过我用的是D3,对
你来说老了点吧:)
 
捣乱的多?
这样: pc1 ---com1--- host ---com2--- pc2
然后读取com port信息,就ok了.

等价于星型c/s网络.
p.s. comport的控件似乎很多可以用
 
支持zhxia
作者是指一台主机
用主机的两个com口分别于两子机的1个com口相连即可
去村里买两条串口线(告诉他是由来对接计算机的)花不了20rmb
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部