关于串口通讯的问题~~~~~~~~~~~~~~~ ( 积分: 100 )

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

sbzldlb

Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个串口通讯的小程序
能够发送成功,但是接受不到
后来我下了别人的程序,也只能发送,接受不到
请问这是什么原应呢,是不是一定要在COM口上装上设备?
 
我做了一个串口通讯的小程序
能够发送成功,但是接受不到
后来我下了别人的程序,也只能发送,接受不到
请问这是什么原应呢,是不是一定要在COM口上装上设备?
 
不知道你有没有用控件,我用的是TMS的,还不错。因为看不到你的代码,不好说什么,
但是调试的话,最好还是接上设备,或者接台电脑,这样比较真实,调试速度也快。
 
我没有用空间,我是自己写的
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Timer1: TTimer;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function Init_RS232(com_name:pChar):boolean; //初始化RS232
end;

var
Form1: TForm1;
hCom:Thandle;
successflag:Boolean;
lpol:Poverlapped;


implementation

uses
SPComm;

{$R *.dfm}
function TForm1.Init_RS232(com_name:pChar):boolean; //初始化RS232
var
lpdcb:TDCB;
CommTimeOut : TCOMMTIMEOUTS;
begin
hCom:=CreateFile(com_name
,(GENERIC_READ or GENERIC_WRITE)
,0
,nil
,OPEN_EXISTING
,FILE_ATTRIBUTE_NORMAL , 0);//打开串行口
if hCom=invalid_handle_value then
begin
ShowMessage('Can not Open COM!');
CloseHandle(hCom);
Result:=false;
exit;
end;

if GetFileType( hCom ) <> FILE_TYPE_CHAR then
begin
CloseHandle( hCom );
raise ECommsError.Create( 'File handle is not a comm handle ' )
end;


CommTimeOut.ReadIntervalTimeout := MAXDWORD;
CommTimeOut.ReadTotalTimeoutMultiplier := 0;
CommTimeOut.ReadTotalTimeoutConstant := 0;
SetCommTimeouts(hCom, CommTimeOut);

successflag:=SetupComm(hCom,4096,4096); //设置COM输入,输出缓冲区皆为4096字节

PurgeComm(hCom, PURGE_TXABORT and PURGE_RXABORT and PURGE_TXCLEAR and PURGE_RXCLEAR ) ;


if not successflag then
begin
ShowMessage('Can not setup COM!');
CloseHandle(hCom);
Result:=false;
exit;
end;
successflag:=GetCommState(hCom,lpdcb); //获取DCB当前默认设置
if not successflag then
begin
ShowMessage('Can not get DCB!');
CloseHandle(hCom);
Result:=false;
exit;
end;
lpdcb.baudrate:=9600;
lpdcb.ByteSize:=8;
lpdcb.Parity:=NoParity; //偶校验
lpdcb.StopBits:=OneStopBit;

successflag:=SetCommState(hCom,lpdcb);
if not successflag then
begin
ShowMessage('Can not setup DCB!');
CloseHandle(hCom);
Result:=false;
exit;
end;
successflag:=SetCommMask(hCom,ev_rxchar or ev_txempty); //指定串行口事件为接收到字符;
if not successflag then
begin
ShowMessage('Can not setup Event!');
CloseHandle(hCom);
Result:=false;
exit;
end;
PurgeComm(hCom,PURGE_RXCLEAR or PURGE_TXCLEAR);
Result:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Init_RS232(pchar('com1'));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
VV : LongWord;
dwLength : DWORD;
Buf : pChar;
SS : string;
begin
Buf :='123123';
dwLength := Length(Trim(Buf));

successflag:=False;
successflag:=WriteFile(hCom,Buf[0],dwLength,VV,nil);
if successflag then
memo1.Lines.Add('写入成功:'+Buf);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
fReadStat:Boolean;
InChar : array[0..255] of Char;
ComStat : PComStat;
dwErrorFlags,dwLength : DWORD;
ReadNumber:DWord;
begin
timer1.Enabled:=False;
fillchar(lpol,sizeof(toverlapped),0);
try
if hCom>0 then
begin
GetMem(ComStat,SizeOf(TComStat));
ClearCommError(hCom, dwErrorFlags, ComStat);
if (dwErrorFlags > 0) then begin
PurgeComm(hCom,(PURGE_RXABORT and PURGE_RXCLEAR));
end;
dwLength := ComStat.cbInQue;


fReadStat:=False;
dwLength:=6;
if dwLength>0 then
fReadStat := ReadFile(hCom, InChar, dwLength,readnumber, lpol);
if fReadStat then
begin
memo1.Lines.Add('读到'+inttostr(readnumber)+'个数据:'+trim(InChar));
end;
end;
finally
timer1.Enabled:=true;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
closehandle(hCom);
end;

end.
 
呵呵,你没接设备哪里来的数据让你接收啊,可以用这个方法来调试你的程序,
把串口的2脚和3脚短接起来,这样你往这个串口发送什么数据,就会接收到什么数据。
 
当然需要在串口上接上设备。
否则,你通过串口发送的数据谁来接收呢?
两个程序是不可以同时控制一个计算机的串口的。
你可以用一根串口线连接计算机的两个串口,这样一个串口发,另一个串口收就可以了。
 
哦,一定要接设备啊,但是,我不是在程序里writefile 了吗,这样不是有数据了吗
然后read
 
我程序中只对一个COM口操作的
先write 然后 read
 
先检测看看你的串口是不是正常的,

有的坏了的串口发送是正常的,不过接收不了,有的是能接受不能发送,
 
我的穿口是好的
因为,它可以读的,不过读出来的字符书是0,然后显示一个乱码
 

sleep(500);
 
不需要吧,write之后只是放在缓存里,早读晚读,总汇把它读出来
但是现在是读不出
是不是我write失败呢?但是显示的是成功
 
我觉得一个串口的接受和发送的好象不能这样直接在缓冲里交叉写吧,毕竟串口也有自己的
接口标准啊,所有的程序都是基于这个原则开发的,要是本身不支持的话,那程序怎么写好象也达不到吧。
 
我看了SPcomm 它好像也没用什么标准?
也只是写数据然后读数据
而且用SPCOMM控件,也只能写数据,不能读
 
我的意思是,你的机器如果没有串口这个设备的话,那自然什么程序都没有用,调试的前提是你的机器有串口,串口这个硬件也是有工业标准的啊。楼上的一个DFW不是说了,2,3短接一下就可以了。至于底层的东西,我也不清楚,只是提出自己的一个看法,大家参考参考。

补充一下:你说写成功了,但写的应该是发送的缓村吧,至于有没有写到接收的缓存呢?
是不是需要验证一下呢。我觉得接收的缓存是从3脚电流变化来接收数据的吧。这样的话,你的任务好象不好完成啊。
 
谢谢大家了
我准备去找个设备
弄什么设备好呢?
 
找个母口,2,3用锡旱接在一起。然后插到你要调试的机器的串口上。
 
找个跳线帽把23脚短接就行了
 
多人接受答案了。
 
后退
顶部