关于MSCOMM串口编程的问题(100分)

  • 主题发起人 qiuqiu133
  • 开始时间
Q

qiuqiu133

Unregistered / Unconfirmed
GUEST, unregistred user!
公司有一硬件产品,通过串口对其进行控制。以前用SPCOMM编写了一套程序,可行。但是我现在用MSCOMM编写程序去控制它,却老是无响应。通过超级终端监视串口,发现命令确实已经下发。请各位指点。我的代码是:
if mscomm1.PortOpen then
mscomm1.PortOpen:=False;
mscomm1.CommPort:=1;
mscomm1.OutBufferCount:= 0

mscomm1.InBufferCount := 0

mscomm1.InputLen := 0

mscomm1.RThreshold := 1

mscomm1.InputMode := 1

mscomm1.Settings := '2400,N,8,1';
mscomm1.RThreshold:=1;
mscomm1.PortOpen := True;
mscomm1.DTREnable := True

mscomm1.RTSEnable := True

mscomm1.Output:='#22401000D'+chr(205)+'!';
 
若该硬件不需要硬件流控制那么
mscomm1.DTREnable := False

mscomm1.RTSEnable := False

建议先用串口调试助手之类的软件与你的软件互通一下,确认问题出在发送还是接收
 
可以确定命令已经下发,我用超级终端监控过串口发送的数据。但是硬件无响应。我用vb做的一例子硬件有响应,代码是:
For j = 1 To N
Comm1.OutPut = "#&quot
& "22401000&quot
& "D"
Comm1.OutPut = cmdParity(i)//cmdParity即为Delphi例子中的chr(205)
Comm1.OutPut = "!"
Next j
 
若硬件无反应,则说明发送有问题
用串口调试软件看一下VB下发的命令到底是什么,感觉是ASC和HEX混乱了
 
能留个联系更加直接的联系方式吗?这么交流太慢了。
我的qq:16278305
我用超级终端监控2个软件下发的数据,都是一样。
由于在delphi中chr(205)没有对应的字符,所以用超级终端监控时,超级终端显示不出来,每次chr(205)+'!'被解释成“?”或者解释成“!”。而vb下发时中都被解释成"?"。这一点我不明白是怎么回事
 
delphi支持16进制的数,你不妨把chr(205)改成2个16进制的数
 
用串口调试查看(选16进制方式查看),看看和VB是否一样的数据
 
把chr(205)改成chr($CD)我试过了,不行
至于“用串口调试查看(选16进制方式查看),看看和VB是否一样的数据”,这个我没理解是什么意思
 
另帖出我在delphi中的代码:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, OleCtrls, MSCommLib_TLB;

type
TForm1 = class(TForm)
Button1: TButton;
MSComm1: TMSComm;
Button2: TButton;
procedure Button1Click(Sender: TObject);
function ParityCheck(command:string):Integer;
procedure InitialCom;
procedure MSComm1Comm(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation


{$R *.dfm}

function TForm1.ParityCheck(command:string):Integer;
var
i:integer;
begin
Result:=0;
for i:=1 to length(Command) do
Result:=Result+Ord(Command);
Result:=(128+Result mod 128);
end;

procedure TForm1.InitialCom;
begin
if mscomm1.PortOpen then
mscomm1.PortOpen:=False;

mscomm1.CommPort:=1;
mscomm1.OutBufferCount:= 0
// 清除传输缓冲区
mscomm1.InBufferCount := 0
//清空接收缓冲区
mscomm1.InputLen := 0
//每次从接收缓冲区读取的字符数。0 :读取缓存区的全部内容 返回值:INTEGER X型变量
mscomm1.RThreshold := 1
//接收数据时产生Oncomm 事件的字符数 1:收到每一个字符都会产生ONCOMM 事件
mscomm1.InputMode := 1

mscomm1.Settings := '2400,N,8,1';
mscomm1.RThreshold:=1;

mscomm1.PortOpen := True;
mscomm1.DTREnable := False

mscomm1.RTSEnable := False;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
SParity:String;
IParity:array[1 .. 1] of byte;
i:Integer;
ParityBit:String;
begin
SParity:='22401000'+'D';
IParity[1]:=ParityCheck(SParity);
ParityBit:=chr(IParity[1]);
InitialCom;
MSComm1.InBufferCount:= 0;
For i:=0 to 2 do
begin
sleep(50);
mscomm1.Output:='#'+'22401000D';
mscomm1.Output:=ParityBit;
mscomm1.Output:='!';
end
end;

procedure TForm1.MSComm1Comm(Sender: TObject);
var
iReceived:array[0..8096] of integer;
revCount:Integer;
recbin:OleVariant;
recint:Variant;
i:Integer;
BInput:byte;
begin
if Mscomm1.CommEvent=2 then
begin
revCount:=mscomm1.InBufferCount
// 返回接收缓冲区内等待读取的字节数,可通过设置该属性为0来清空接收缓冲区
recbin:=Mscomm1.Input;
recint:=VarArrayCreate([0,2048], varByte);
recint:=recbin;
For i:=0 to revCount-1 do
begin
bInput:=recint;
iReceived:=Integer(bInput);
end;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
application.Terminate;
end;

end.
 
你能确定的硬件接收模块没有问题吗?
 
你去下载一个名为“串口调试助手”或“SSCOM32”的串口调试软件,不要用超级终端
然后把机器的两个串口用交叉线连起来
一个串口做为VB程序的发送口,另一个做为串口调试软件的接收口,选择16进制显示接收的数据
先看VB程序发送的数据到底是什么
再看MSCOMM发送的数据是什么
 
To andd_chen:
我可以确定硬件接收模块没有问题
TO maxim88:
你说的这个我也试过,用vb做的和用delphi做的发送的数据一样。但是其中有一个问题是,chr(205)解码出来后都变成了“?”。不知道这个地方会不会有问题
 
我觉得可能还是205超出了范围,导致下位机不能识别,我们公司定义的都是128以下了,这个还没遇到过
 
你是否没有用16进制的方式查看接收数据?
可以把VB和MSCOMM编写的程序发给我看一下
maxim88@tom.com
 
你的代码一看就知道有错误,MSCOMM控件发送有两种方式一种以文本,一种以字节,你去看看MSComm1.InputMode这个属性的设置。这个东东的设置直接影响你的通讯
 
to:maxim88

用超级终端怎么处理?
 
有些字符用超级终端是无法显示的,不知道接收的到底是什么,所以不建议你用超级终端
 
MSCOMM控件发送有两种方式一种以文本,一种以字节,你去看看MSComm1.InputMode这个属性的设置
MSComm1.InputMode=1 表示字节方式
MSComm1.InputMode=0 表示文本方式
 
MSComm1.InputMode=1
MSComm1.InputMode=0
这两种方式我都试过了,都不行
我都快疯了,不知道是什么地方出了问题
目前只能用spcomm了
 
qiuqiu133能否给我一点帮助.
我现在需用SPCOMM控件对一个硬件进行控件.
能否给我一些指点.最好是有代码和设计思路.
注:新手上路,同时请各位仁兄多多包涵.在此感激不尽.
可用QQ联系:58750666在此谢谢
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
586
import
I
I
回复
0
查看
695
import
I
顶部