高難問題:怎樣主動去抓取對方機器的串口信號呢?時刻監聽它的串口有無信號,有就獲取。 (50分)

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

joshua_jia

Unregistered / Unconfirmed
GUEST, unregistred user!
我現在要接收對方機器串口的數據,但是不需要對方去發送,本機直接主動去抓取信號過來 ;我要怎樣實現這樣直接接收呢?就是不停監聽信號.
 
所有的串口输入数据都是串口主动去读取的,通过WinAPI,ReadFile函数.
当然,首先必须通过CreateFile来 打开COM,
一般来说你打开串口以后必须建立一个线程来监视串口,是否有数据(ReadFile)
你可以下载SPCOMM来分析一下,那是个比较著名的串口通讯组件!
 
to neutrondelphi:
你好,可能我沒說明白,我改了一下題,謝謝賜教.
 
如果我發送一個信號(即字母)過去,然後得到對應的值,該怎麼寫呢?
 
发送的信号应该属于先定好的协议,如,发一个‘R’,则对方作出相应的回复,只要对方回应,就会发送回来一个数据,不需要對方發送应该是不可能的,只是不主动发送而已。
至于不停监听信号,像CPort控件,它有一个OnRxChar事件,只要有信号过来,它就能响应这个事件接收到信号。
 
to pingpingniu:
謝謝,你說的沒錯,但我不知道該怎樣寫這段,要本機去主動獲取數據,請賜教!
 
你用的是什么控件,如果是Cport,我可以提供一段原码
 
我用的是spcomm,
能不能把你的代碼給我參考一下,tks!
 
发一个MSComm的例子给你吧,不知道能不能对你有所帮助
procedure TForm1.Button2Click(Sender: TObject);
begin
if ComboBox1.Text = 'COM1' then
MSComm1.CommPort := 1
else
MSComm1.CommPort := 2;
Mscomm1.PortOpen :=true; // 打开串口
Mscomm1.DTREnable :=true; // 数据终端准备好
Mscomm1.RTSEnable :=true; // 请求发送
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MSComm1.Output := Edit1.Text; //此处为你要发送的字符,如'R'
end;

procedure TForm1.MSComm1Comm(Sender: TObject);
var
recstr:Olevariant;
begin
if Mscomm1.CommEvent = 2 then
begin
recstr := Mscomm1.Input ; //根据你发出的信息,对方返回的数据
Memo1.text := Memo1.Text + recstr;
end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
Mscomm1.InBufferCount :=0; // 清空接收缓冲区
Mscomm1.InputLen :=0; // Input读取整个缓冲区内容
Mscomm1.RThreshold :=1; // 每次接收到字符即产生OnComm事件

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if Mscomm1.PortOpen then Mscomm1.PortOpen :=false; // 关闭串口
Mscomm1.DTREnable :=false;
Mscomm1.RTSEnable :=false;

end;
 
to pingpingniu:
謝謝你,但是我試了怎麼沒有返回值呀?
 
對方機器串口程序是你编写的吗?
你要检测如:串口号、波特率、奇偶校验等属性是否一一对应。
对了,你可以在一台机器上把这个例子程序打开两个,把两个端口连上,然后一个选择COM1,一个选择COM2,测试是否能收到数据!
我刚刚又试过了,没问题!
 
这样吧,把邮箱地址给我,我把这个测试程序发给你!
 
我試了,傳送接收都沒有問題,你那個不是可以返回值嗎?我想要它返回一個值
mail: xy_shi@email.geniusnet.com.tw
 
那很好办呀,写两个程序,发送端的程序就用上边这个程序不变,接受端的程序在OnComm事件中根据不同的发送来的信息再发回相应的信息就可以了!

procedure TForm1.MSComm1Comm(Sender: TObject);
var
recstr:Olevariant;
begin
if Mscomm1.CommEvent = 2 then
begin
recstr := Mscomm1.Input ; //根据你发出的信息,对方返回的数据
Memo1.text := Memo1.Text + recstr;
if copy(recstr,1,1) = 'R' then
Mscomm1.OutPut := '接受到带R的信号'
else
Mscomm1.OutPut := '没有接受到带R的信号';
end;
end;

 
原码发给你了,望收
 
后退
顶部