Builder4中如何使用MSComm32通讯控件?(急!)(100分)

  • 主题发起人 fenghualiang
  • 开始时间
F

fenghualiang

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在正在用Builder4作毕业设计,由于是第一次使用,遇到
不少问题,最关键的是串口通讯问题,程序要求从连到串口的传感器中
读数。传感器送出的数据格式为AA PP PP PP TT TT TT 55(十六进制),
其中AA 55为标志,P表示压力数据,T表示温度数据。每组数据共八个。
波特率1200,八个数据位,一个或两个停止位(视不同的工作方式而定),
无校验位。
我我想用微软的ActiveX控件mscomm32.ocx来实现通讯,我的机器
上装了VC++6.0,c:/windows/system下也有MSComm32.dep,MSComm32.ocx.
我也成功的把这个控件装到Builder4中.问题是程序运行有错,或者一点响
应也没有.下面是原程序,麻烦各位帮我看看有什么问题.谢谢!
#include
#pragma hdrstop
#include "Comm.h"
#include "time.h"
#define comEvReceive 2
//-------------------------------------------------------
#pragma package(smart_init)
#pragma link "MSCommLib_OCX"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------
OleVariant vResponse;
void __fastcall TForm1::FormCreate(TObject *Sender)
{
MSComm1->CommPort=2;
if(!MSComm1->PortOpen)
MSComm1->PortOpen=true
//打开端口
/*
当程序运行到这儿时,有时出现如下错误:
Project Commu.exe raised exception class EOleException with
message 'Port already open'.Process stopped.Use Step or Run to
continue.
实际上,串口似乎根本就没打开
*/
MSComm1->InputMode=1
//二进制方式
MSComm1->Settings="1200,n,8,1";
MSComm1->RThreshold=1
//接收阈值
MSComm1->InputLen=0;
vResponse=MSComm1->Input
//清空接收缓冲区
}
//---------------------------------------------------------------
//串口事件处理
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
int k=0;
if(MSComm1->CommEvent==comEvReceive) //如果有接收事件产生
{
k=MSComm1->InBufferCount;
if(k>0)
{
MSComm1->InputLen=(short)k;
vResponse=MSComm1->Input;
for(int i=0;iLines->Add(IntToStr(vResponse.VByte));
}
}
}
//---------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
if(MSComm1->PortOpen)
MSComm1->PortOpen=false;
}
//---------------------------------------------------------------
如果不出现前述"port already open"的问题,一般都没有事件产生,所以也
没法收到数据.不过有一次莫名其妙收到了数据,但数据不对.后来又没反应了.
我已经排除硬件错误的可能性,因为我在DOS下用C编的程序可以正确的读到数据.现在我束手无策了,恳请各位高手帮忙!
不胜感激!




 
B

brightangel

Unregistered / Unconfirmed
GUEST, unregistred user!
据偶以往经验,用微软的控件MSComm32.ocx实现通讯,用Input和
Output属性实现接收和发送二进制数据很不可靠,除非是可显示的ASCII文
本,否则不要依赖它们。接收和发送数据,分别用两个Win32 API: ReadFile
和WriteFile(调用参数hFile就用MSComm1->CommID),具体用法参见Delphi
或C++ Builder Help的Win32 Programmer's Reference.
接收数据还得通过MSComm的事件响应例程,调试时,建议就设定属
性InputLen=1,RThreshold=1,即接收缓冲区每收到一个字节,产生一条消息,
调用ReadFile从接收缓冲区读取一个字节,检查正确与否.
至于程序的串口打开和关闭部分,应该没问题。若还有EOleException
提示,检查是否有别的程序或设备占用串口。
Take it easy and good luck.
 
F

fenghualiang

Unregistered / Unconfirmed
GUEST, unregistred user!
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
581
import
I
I
回复
0
查看
594
import
I
顶部