Mscomm控件和计算机串口(50分)

  • 主题发起人 主题发起人 coconut123
  • 开始时间 开始时间
C

coconut123

Unregistered / Unconfirmed
GUEST, unregistred user!
问一个弱弱的问题,MSComm不一定是同调制解调器相关吧?只要计算机的9针的串口有数据传输就会有用吧?
那我用串口调试助手软件模仿串口输入,将计算机的两个串口连起来,用MSComm接受。
这样做可以吗?
 
当然可以,但就目前的硬件条件,有这个必要吗?
如果是工控,使用IOCOMPS更好, 去 www.51delphi.com 下载。
 
不好意思,我是个初学者,但是现在需要编一个串口通信的程序,书上有mscomm的介绍就用了。
由于是其他硬件没弄好,所以想先用软件模拟调试。
可是按照前面的方法却没有触发mscomm的oncomm事件,不知道哪位能为我指点一下。
程序如下(从一本书中抄的):
procedure TForm1.FormCreate(Sender: TObject);
begin
MSComm1.InBufferCount:=0;
MSComm1.InputLen:=0;
MSComm1.RThreshold:=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
MSComm1.Settings:='9600,N,8,1';
MSComm1.CommPort:=1;
MSComm1.PortOpen:=true;
MSComm1.DTREnable:=true;
MSComm1.RTSEnable:=true;
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;
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
MSComm1->InBufferCount = 0; // 清空接收缓冲区
MSComm1->InputLen = 0; // Input读取整个缓冲区内容
MSComm1->RThreshold = 1; // 每次接收到字符即产生OnComm事件
MSComm1->CommPort =1 ; //com1
MSComm1->PortOpen = true; // 打开串口
MSComm1->DTREnable = true; // 数据终端准备好
MSComm1->RTSEnable = true; // 请求发送
MSComm1->InputMode = 1;//以二进制 0为文本方式
}

//---------------------------------------------------------------------------
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
int buff[200]; //声明一个存储接收数据的缓冲区,全局变量<br>
int ByteNum; //收到的字节数
int BuffPtr; //接收缓冲区的指针,请声明为全局变量。
OleVariant RxBuff; //一个用于接收的OleVariant变量。
if(MSComm1->InBufferCount > 0)
RxBuff = MSComm1->Input; //如果缓冲区有多于一个字节的数据
ByteNum = RxBuff.ArrayHighBound(1); //将实际读的字节数取出
for(int i=0;i<=ByteNum;i++)
{
buff = RxBuff.GetElement(i);
//Memo1->Text = Memo1->Text + IntToHex(buff, 2) + " ";
m = m + IntToStr(buff) + " - ";
}
Memo1->Text = m;
}

//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &amp;Action)
{
MSComm1->PortOpen =false; // 关闭串口
MSComm1->DTREnable =false;
MSComm1->RTSEnable =false;
}
 
to 春意
谢谢你给贴的程序,我的程序和你的类似。可是问题是oncomm事件根本没有触发,是控件设置的问题
还是那个串口调试助手的问题?
如果不用那个软件的话,是不是可以在delphi中自己设置另一个mscomm控件发送数据?
 
可以在一台计算机上试,(如果有两个COM口的话),将两个DB9的2-3,3-2,5-5即可。
从COM1发,COM2收;反之亦可. 
 
同意 apw 我也这样子做过的。。。
 
to apw and darnis
我本来打算在一台机器上调试的,你说的连接方式具体怎么做呢?
我现在是用串口线把两个9针的串口连起来的,可以吗?
谢了!
 
可能是串口线的接法错造成的。
建议用三线制接法试试。
2-3
3-2
5-5
然后把控件和和调试软件的流控制都设置为none。
 
我有一个现成的串口通信exe 给我e-mail
自动在一台机器的COM1和COM2之间通信,要求有一根连接两个串口的连接线。
是DELPHI写的。
 
再mscomm中你要再属性里设置oncomm的触发条件,看是缓冲区有多少数据的时候才触发

具体属性我急不清了,两年前用过。你查查msnd。上面说的很清楚。也有例子。
 
coconut123:
如果你的计算机有两个口(以前计算机都是,现在不一定了),把两个DB9用一根线连起来,2-3,3-2,5-5,一个插COM1,一个插COM2;
用一个控件打开COM1,另一个打开COM2。
 
wendylee301@sina.com

不好意思,真的是才开始接触。我再问问,什么是DB9,应该怎样操作。
谢了!
 
可以,但串口有个接法,你可以查查.
要同时开两个MSComm 一个用于发送,一个用于接受.
 
DB9就是9针的插头,插计算机上应该是母头。
 
多谢各位前辈的指点,今天终于发现线不对,它是一一对应的。
现在要自己做一条,想确定一下是不是就只是2-3,3-2,然后其他的就一一对上就可以了?
5-5是必须的,其他可用可不用,是吗?
 
只需要三根线,2-3,3-2,5-5
 
如果只有一个串口的话,可以将2、3短接,不过接收和发送必须在同一个程序里面
要不会报端口被占用的错误
 
多人接受答案了。
 
后退
顶部