--编程通过串口连接MODEM对硬件操作,现在是接收不正确 (100分)

  • 主题发起人 主题发起人 shibaoping
  • 开始时间 开始时间
S

shibaoping

Unregistered / Unconfirmed
GUEST, unregistred user!
我通过串口COM1连接MODEM-a而后,此MODEM-a连接另一台MODEM-b,MODEM-b连接硬件(单片机)。
当我用串口调试助手调试:atd200<回车>,(此处200为MODEM-b的号码)
连接上之后,返回 CONNECT 9600 (9600为波特率),然后我发送与硬件进行握手的协议命令,XXXXXX,硬件返回确认信息。

问题就在:当我用Delphi通过MSCOMM组件编程实现时,前边的操作相同,但是到最后
单片机没有返回确认信息!!!
非常郁闷!!!
我保证发的命令完全正确,
于是我想,是不是我的哪些地方(比如MODEM,或MSCOMM上)没有设置好呢?
我设置的MSCOMM属性如下:
with MSComm1 do
begin
InBufferCount := 0;
InputLen := 1; // Input读取整个缓冲区内容一个字节
RThreshold := 1; // 每次接收到字符即产生OnComm事件
PortOpen := True;
end
其它属性为默认。
大虾们看看,咋回事哪?
 
好久以前弄过,忘了[:D]
 
你用AT命令來測試Modem,是一種很簡單的Ascii通訊啊, 我保證用mscomm絕對沒問題!!
檢查, 确保你其它的mscomm是默認參數, 然後,
在發送數據前,
MSComm1.RTSEnable:=True;
MSComm1.MSComm1.Output:= 'XXXXXX';
MSComm1.RTSEnable:=false;
試試這樣行嗎!!!
 
波特率一致,串口设置正确,握手协议一致,再也没什么了,你先只用a连单片机试试
 
Aiirii, 我的mscomm是默認參數,
在發送數據前, 设定
MSComm1.RTSEnable:=True;
MSComm1.MSComm1.Output:= 'XXXXXX';
MSComm1.RTSEnable:=false;
只是收到了硬件握手的一些信息“#0#0#0#4#0#0#1...”,说明是发出去了呀,
郁闷....

superrgf, 我通过a拨通b,b与硬件连接。
让a连接硬件的话,我是要通过a拨b.
你让a连硬件,我怎么拨呀...
 
现在的问题是:
计算机直接连接硬件,通讯正常。(硬件给计算机的的回应能收到)
通过MODEM连接,通讯不上(硬件给计算机的的回应不能收到)
^^^^
 
也许是时间上有所延迟,这也是常有的,你是怎么判断是否接收到数据的呢??
 
当我不使用程序接收,而使用“串口调试助手”实验时,能够接收到完全正确的数据
 
哦,这更能说明硬件设备是没问题的,你该检查自己的代码,你是用什么方法来接收数据的呢??
 
是通过MSComm1Comm接收的呀
procedure TForm1.MSComm1Comm(Sender: TObject);
var
receive_datas ,string_temp,string_: string;
i : integer;
array_use:array[1..36]of string;
begin
case MScomm1.CommEvent of
comEvSend:
MScomm1.OutBufferCount:=0;
comEvReceive:
begin
Receive_datas := self.MSComm1.Input;
{握手回应命令}
if Receive_datas = #88 then
begin
{提取回应命令}
end;

{判断为拨号回应}
if (Receive_datas = 'C') or (Receive_datas = 'B') or (Receive_datas = 'N') then
begin
for i := 1 to 36 do
begin
array_use := MSComm1.Input;
string_temp := string_temp + array_use;
end;
string_ := Receive_datas + copy(string_temp,0,3);
if string_ = 'BUSY' then
begin
{}
end;
if string_ = 'CONN' then
begin
//Connect_Flag := True;
{进行软握手操作}
Send_Handshaking;
end;
if string_ = 'NO D' then
MScomm1.InBufferCount:=0;
end;
end; {end of comEvReceive}
end; {end of case}
end;


我通过串口线连接自己的两个串口,一个用串口调试助手发数据,一个用程序接收,
这时串口调试助手发的任何数据,程序都能收到。

但是通过MODEM时就不行了
极度郁闷............
[:(]
 
持续郁闷中......
 
你的这个procedure TForm1.MSComm1Comm(Sender: TObject);
事件有触发过吗??你设断点调一下看?
 
使用“串口调试助手”实验时,能够接收到完全正确的数据
880C000101EF00000488 (十六进制)
而用程序时,接收到的数据是
?0110040

接收到数据时,当然事件有触发,但是接收到的数据不对
郁闷...
 
if (Receive_datas = 'C') or (Receive_datas = 'B') or (Receive_datas = 'N') then
你这样判断没有问题吗?要是回应数据中有CBN呢?应该判断CD状态
if string_ = 'BUSY' then
这样判断也不妥,应该if Pos('BUSY',string_)>0 then
 
多谢yitx, 代码严密性上不够好。

不过还是收不到正确的数据
 
我用这个控件时,一般不怎么用这个事件触发来判断是否有数据接收的,记得有资料上说这个地方有个Bug的,所以我判断是否有数据接收时,是用一个死循环来做的。你参考一下了,希望对你有用。
MSComm1.Output:=s;
while length(s)>0 and ... do //这个地方可以做成死循环,也可以用时间判断,在若干时间内做这个事情
begin
APPLICATION.PROCESSMESSAGES;
If (MSComm1.InBufferCount =0) Then
begin
while (MSComm1.InBufferCount = 0) and (IDopen) do //只要接收为空且IDopen为真就一直循环等待
begin
APPLICATION.PROCESSMESSAGES;
....
end;
end
else
If MSComm1.InBufferCount >= 252 Then //如果接收到的数据长度相符则做
begin
...
end;
end;
 
收到?0110040而不是880C000101EF00000488 (十六进制)
的原因:我的InputMode属性设成了comInputModeText,
于是大于128的16进制便显示不了了.
现在InputMode属性设成comInputModeBinary,接收完全正确。

谢谢几位的关注。


 
后退
顶部