MOXA多串口卡,4个串口的,如何实现串口监听?

Description of your first forum.

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子bacycle » 星期日, 2004年12月12日 00:14


   遇到个棘手问题:
   MOXA多串口卡:com5:~com8:,使用spcomm控件编程,但是发现无论发送数据还是接收数据,spcomm使用的是相同的缓冲区(还是我用的不对),导致只用一个串口时一切正常,但是当有多个串口打开时,无论发送还是接收都不能正常进行,能够看到有数据发出,但是端口接收不到PLC回复的数据。
   希望有经验的大侠多多指教。
   我正在做项目,明天就要用,今天用了一天还没有搞定,急等回音!!
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子道长 » 星期日, 2004年12月12日 01:02


没看明白你的问题
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子xuegaoyili » 星期日, 2004年12月12日 08:48


你的意思是指你用了几个spcomm控件同时打开几个串口吗?我想这样用相同的缓冲区也有可能.不过没试过.我想你还是用程序轮询比较好...moxa卡我也用过,不过当时只用了一个口
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子bacycle » 星期日, 2004年12月12日 09:26


   的确用的是几个spcomm控件,每个控件对应不同的com口,如果轮询进行数据交互,当然可以,但是对CPU消耗比较大。
   难道真的没有使用几个spcomm同时和多个串口通讯的办法?
procedure TForm1.plccommReceiveData(Sender: TObject; Buffer: Pointer;
 BufferLength: Word);
var
 i:integer;
 Buf:array of byte;
 viewhexcode:string;
 viewstring:string;
 sbyte:byte;
 tbytestr,tempstr:string;
begin
 viewstring:='';
 setlength(buf,BufferLength);
 CopyMemory(@Buf[0], Buffer, BufferLength);
(*=====转换16进制到ASCII码=====*)
 for i:=0 to bufferlength-1 do
 begin
   viewhexcode:=viewhexcode+inttohex(buf[i],2);
   viewstring:=viewstring+chr(buf[i]);
 end;
(*=====显示收到的字符=====*)
 plcMemo.Font.Color:=clGreen;
 plcMemo.lines.add('收到:'+viewstring);
 plcMemo.Lines.Add('RX:'+viewhexcode);
 plcMemo.lines.add('____________________ ');
(*=====检查校验和=====*)
 sbyte:=$0;
 for i:=1 to bufferlength-2 do sbyte:=sbyte+buf[i];
 tbytestr:=chr(buf[bufferlength-1])+chr(buf[bufferlength]);
 tempstr:=inttostr(sbyte);
 if IntToStr (ord(sbyte))<>tempstr then
   plcMemo.Lines.add('校验和发生错误!!')
 else plcMemo.Lines.Add('校验和正确!!');
 beep;beep;
end;
 除了这个办法:CopyMemory(@Buf[0], Buffer, BufferLength),是否还有可以读取串口接收到的数据缓冲区内容的办法,我只会这一种,我想就是这里出的问题,内存缓冲区相互覆盖造成的。
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子李艾 » 星期日, 2004年12月12日 16:07


你用了"MOXA多串口卡"为什么不用它自带的pcomm软件,这样你就不用多个spcomm控件,只要使用"MOXA多串口卡"自带的单元文件.
一般情况下"MOXA多串口卡"都自带有缓冲,不会有同一个缓冲接收或发送的可能,以前我也是用"MOXA多串口卡"型是320C的,并且带126个comm口,不知你用的是什么型号.
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子bacycle » 星期日, 2004年12月12日 23:30


   我已经搞定了,早上头脑清醒,没想到只用了不到15分钟,还是用spcomm,同时接收3个串口的数据,CPU消耗不到5%。
   方法:建立3个窗体,每个窗体上只能有一个spcomm控件,超过1个就会不工作。
   然后定时同步3个窗体上对应的变量即可。
新问题又出来了,对于同一个spcomm控件,用批处理的方式,向PLC发送数据。
   预先写了个senddata(ordstr:string)函数,利用此函数向串口那边的PLC发送命令。
奇怪的是每次只有第一条命令能够被PLC正确执行,且正确应答,而且是PLC完全接收到3个命令以后,每条命令都发送成功,但是PLC只应答第一条命令。而且是所有数据发送完成后(多条语句发送多个命令),用F7跟踪,发现每条语句都执行了,可以排除语法错误,而这些命令需要在一个按钮事件内完成。
   搞了一天没有搞定。求救!
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子bacycle » 星期日, 2004年12月12日 23:54


   忘记说了,我用C104P,PCI的4口多串口卡,一个口接条码扫描(收听),一个接称重机(收发都有),一个接PLC(收发最频繁)。
   监听问题解决了,现在是发送到PLC多条命令,监听只能反馈第一条命令的应答,而且PLC确实只执行了第一条命令,好怪,看来spcomm不能应付复杂应用。
   那位知道不换spcomm的解决办法?更换控件时间不足,需要重新调整程序的。
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子maxim88 » 星期一, 2004年12月13日 09:08


放一个SPCOMM控件,然后动态创建4个控件。这4个控件可以用同一个接收事件处理。
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子yeaihua » 星期一, 2004年12月13日 10:44


为什么不用PCOMM!
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子rjiajia » 星期一, 2004年12月13日 10:53


我最近也做了个测试硬件用的软件,使用Adpcomport 可以同时打开4个串口。一切都很正常。接收事件处理是分开的,但用的同一个处理过程函数,没问题的
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子shangchao » 星期一, 2004年12月13日 11:29


我用的串口控件不是SPCOMM
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子bacycle » 星期二, 2004年12月14日 00:25


   接收缓冲区问题解决了,发送缓冲区问题我自己也解决了,看来SPCOMM确实不太完善,不能适应负责的、高通讯量的场合,建议大家以后遇到了复杂和高效的环境,不要图省事用这个控件了。
   我已经开始准备换Pcomm了,但是发现Pcomm.dll不能正确导入Delphi7,报高不正确的dll文件,这是我不用他的原因,看来有新技术需要钻研了。
   结论:
   1、接收缓冲区冲突,使用一个接收过程,导致多个串口同时接收数据时,哪个也收不到,所以可以用不同窗体解决,然后收回各个窗体的数据;
   2、发送缓冲区冲突,导致批命令只有第一个被执行,后面的都被忽略,所以用多个控件,在不同时间发送命令,多个控件结合1的方法,都可以独立接收到数据,这样可以实现类似多会话的功能。
   希望大家不要走我的弯路!
   同时希望大家多多修炼自己,关键时刻,尤其是紧急时刻,真的只有自己才能救自己,我的项目已经完成,测试也完成,明天移交用户,可以喘口气了。
   项目情况:
   开发软件:Delphi7;
   操作系统:XP-home,SP2;
   硬件:MOXAC104P-PCI的4串口卡:一个接条码扫描;一个接电子称重;一个接PLC控制输送机分支,功能是通过条码识别货物,然后判断货物是送往合格区还是退出口;
   注意:我的BCR能够一次读取超过2个条码:卷筒、线轴、产品、生产设备号,不好对付偶,这个设备就值快18万了。而且卷筒是圆的,这个是全向扫描的。
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子labelsoft » 星期二, 2004年12月14日 10:54


这样做比较好:
每串口生成一个读写线程,每线程内包含一个spcomm(或其他控件)
及其MyOnRecvCommData过程,在线程创建时
spcomm.OnCommReceiveData := MyOnRecvCommData;
这样就不存在缓冲区问题.
我曾经这么做,可以,而且也是用MOXA的CP104
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子Castle » 星期六, 2005年1月1日 21:21


听高手一席话胜读十年书
 
 
 

MOXA多串口卡,4个串口的,如何实现串口监听?

帖子summax » 星期一, 2005年1月3日 00:30


对于多串口操作还用API比效稳定和方便!!