485串口通信问题 急啊,在线等!! ( 积分: 50 )

  • 主题发起人 主题发起人 jindgu
  • 开始时间 开始时间
J

jindgu

Unregistered / Unconfirmed
GUEST, unregistred user!
485串口通信问题,用MSComm做的,在MsComm1的OnComm事件中的代码如下:
procedure TForm1.MSComm1Comm(Sender: TObject);
var
data:string;
begin
if not MSComm1.PortOpen then
MSComm1.PortOpen:=True;
MSComm1.InBufferCount:=0;
data:=MSComm1.Input;
Edit2.Text:=data;
MSComm1.PortOpen:=False;
end;

但是接收时接收不到数据,单步执行时发现根本没有触发该事件。
发送是正常的。
MSComm中有哪些特别的属性要设置吗?
原因是什么呢?
用过的朋友因该很简单。
先谢过大家了!!
急啊,在线等!!
 
485串口通信问题,用MSComm做的,在MsComm1的OnComm事件中的代码如下:
procedure TForm1.MSComm1Comm(Sender: TObject);
var
data:string;
begin
if not MSComm1.PortOpen then
MSComm1.PortOpen:=True;
MSComm1.InBufferCount:=0;
data:=MSComm1.Input;
Edit2.Text:=data;
MSComm1.PortOpen:=False;
end;

但是接收时接收不到数据,单步执行时发现根本没有触发该事件。
发送是正常的。
MSComm中有哪些特别的属性要设置吗?
原因是什么呢?
用过的朋友因该很简单。
先谢过大家了!!
急啊,在线等!!
 
你下载一个串口调试工具试试看能不能收到数据!
 
就是用调试工具试验才知道不能收到数据啊!
 
这个问题应该很简单啊,用过的人肯定知道怎么搞,大家都没用过吗?
 
如果你说的是MSCOM32.OCX的话,你要认真看微软的帮助,就该发现到它自己也承认这个事件是有BUG的,不是那么灵的,一般采用MSCOMM的话,我都是用个死循环来不停的读串口来取数的。
 
建议用SPcomm控件,我经常使用。很不错[:D]
 
to app2001:
用什么函数来读取串口的值呢?望赐教!
 
to ccwwdd:
我没有这个空间啊,哪里可以下?
或者你发给我,jindgu@tom.com
谢先!
 
已经发出去了。安装完后在system栏
 
mscomm控件中有一个RThreshold属性,如果你想在收到一个数据时触发oncomm事件,应该把它设成1。你可以参考一下vb中mscomm控件的一些用法,因为mscomm控件本来就是vb中用的。
 
Function TForm_MainForm.Start_CommPort(Commx: TComm; const strCOmm: String; const bps: Integer): Integer;
begin
Result := -1;
Commx.StopComm;
Commx.CommName := strCOmm;
Commx.BaudRate := bps;
Commx.ByteSize := _8;
Commx.StopBits := _1;
Commx.Parity := None;
Commx.Inx_XonXoffFlow := false;
Commx.Outx_XonXoffFlow := false;
try
Commx.StartComm;
Result := 1;
except
ShowMessage('Open COM Port Error!');
end;
end;
 
procedure TForm_MainForm.Comm_TxReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word);
var
buf: Array[0..2049] of Char;
i, len: Integer;
str0: String;
pt: PChar;
begin
if BufferLength < 1 then Exit;
len := BufferLength;
if len > 2048 then len := 2048;
pt := Buffer;
for i:=0 to len - 1 do buf := pt;
buf[len] := #0;
str0 := StrPas(buf);

WriteData_To_Memo(Data_From_Tx_ReceData, str0);
end;
 
to ccwwdd:
以收到但是怎么安装啊,就一个pas文件没有package什么的啊!
 
菜单【Component】->【Install Component】上面的【Browse】,选择SPcomm.pas所在文件文件夹,然后自动打开dclusr.dpk。点击【install】,就安装到dclusr.dpk中了。
 
to wwq_80:
试过了但是好像不是你说的那样,还是没反应。vb没用过。
 
已经装好了,但是还要摸索一下。MSComm就是摸了半天才搞出来的。没想到还是有问题。
 
这个控件更惨,连发送都不行啊!
 
不会吧。485于232没有什么本质的区别。
Function TForm_MainForm.Uart_Send_Data(Commx: TComm; sendstr: String): Integer;
var
n, len: Integer;
buf: Array[0..1025] of Char;
begin
Result := -1;
len := Length(sendstr);
if len < 1 then Exit;
if len > 1024 then len := 1024;
for n:=0 to len - 1 do buf[n] := sendstr[n + 1];
buf[len] := #0;
try
Commx.WriteCommData(buf, len);
Result := len;
except
ShowMessage('Uart Send Data ERROR !!');
end;
end;
 
你的RS485转换电路是不是有需要控制的引脚。即切换Tx和Rx状态。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
632
import
I
后退
顶部