倾家荡产求教Builder4中使用MSComm通讯控件的问题(300分)

  • 主题发起人 主题发起人 brightangel
  • 开始时间 开始时间
B

brightangel

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 <vcl.h>
#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;i<k;i++)
Memo->Lines->Add(IntToStr(vResponse.VByte));
}
}

}
//---------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &amp;Action)
{
if(MSComm1->PortOpen)
MSComm1->PortOpen=false;
}
//-----------------------------------------------------------
如果不出现前述"port already open"的问题,一般都没有事件产生,所以也没法
收到数据.不过有一次莫名其妙收到了数据,但数据不对.后来又没反应了.
我已经排除硬件错误的可能性,因为我在DOS下用C编的程序可以正确的读到数据.
现在我束手无策了,恳请各位高手帮忙!
不胜感激!
 
是不是你端口设置错误,换个端口试试?


这句程序好象有问题???
for(int i=0;iLines->Add(IntToStr(vResponse.VByte));
 
换过端口的,一般换端口后的前几次执行不会出现"port already open"错误,
但几次以后又不行了.
OleVariant类型变量我也不会用,请指教.
我没在问题中提出它的用法问题是因为现在连事件都没有.
 
程序只有这些???请稍微详细些???

》一般换端口后的前几次执行不会出现"port already open"错误
是不是以前的程序非正常退出???
 
我把所有文件用邮件发给你,
麻烦你帮我看一看,
谢谢!
 
1)先在超级终端(win 9x 自带的)里接收一遍,不管怎样确定一下
2)void __fastcall TForm1::MSComm1Comm 根本没触发?
 
你发到那里了,我没受到。

发这里吧 shenqw@371.net

最好写个readme.越详细越好.
 
sorry,I sent it to shenqw@21cn.com
let me try again
 
谁帮我解决这个问题,
全部家底奉送!
 
要不,我给你一个组件好了。
 
什么组件,寄给我试试吧。
fenghualiang@263.net
 
注:feng1 is brightangel
 
实在不行
用SPCOMM如何?
要的话
mail to wrench@263.net
 
feng1
哎,我真服了你了,发给我的居然不是将程序打包,而是。。。。还要让我去分捻,
呵呵,看看能不能帮你解决问题.
 
看来你还得发一次,HTML语法屏蔽掉一些程序段。 如果还要发,请Zip打包.
 
沈前卫:
sorry!
再来!
^_^
 
多人接受答案了。
 
后退
顶部