关于COM串口缓冲区的问题,100分差不多了!!
我接手别人的代码,看不懂,代码中与关于COM串口通讯的程序用的是Microsoft Communications Control,version 6.0控件
头文件MyComm.h
CMSComm m_ctrlComm;//生成对象
执行文件MyComm.cpp
void MyComm::OnComm()//消息响应函数,只要COM口有数据即触发此消息,接收数据
{
VARIANT variant_inp=m_ctrlComm.GetInput(); //读缓冲区,将数据存入变量
//variant_inp
。。。。。。。。。。。。。。。
}
问题:
1、本人不理解的是,本缓冲区指什么缓冲区,是否在内存中?
2、本函数是消息响应函数,按理只要有数据就触发本函数,但是我跟踪本函数得到的结果是有时候得到的字符有3个,有时4个,就是说,不是有数据即触发,而是有时候是几个字符才开始触发,那么这些字符存在什么地方的?
问题点数:100、回复次数:4Top
1 楼ygd(人生短暂,及时行乐。准备成熟中)回复于 2002-03-14 10:07:29 得分 20
串口自己开的输入和输出缓冲,再内存中
如果有大量数据的话,可能是8字节触发,存放在输入缓冲内
Top
2 楼ylb_and_xy(黑狐狸)回复于 2002-03-14 10:10:41 得分 20
串口自己开的输入和输出缓冲,在内存中。
一般都不是一个一个的触发,一般是以包为单位。
Top
3 楼rovoboy(魂之猎人)回复于 2002-03-14 10:18:10 得分 20
看看这里,可能会有所帮助
BOOL CDataDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_Send=false;
// TODO: Add extra initialization here
if(m_ComCtrl.GetPortOpen())
m_ComCtrl.SetPortOpen(FALSE);
m_ComCtrl.SetCommPort(1); //选择com1
if( !m_ComCtrl.GetPortOpen())
m_ComCtrl.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("不能打开串口");
m_ComCtrl.SetSettings("2400,n,8,1"); //波特率2400,无校验,8个数据位,1个停止位
m_ComCtrl.SetInputMode(1); //以二进制方式检到数据
m_ComCtrl.SetRThreshold(20);
//参数5表示每当串口接收缓冲区中有多于或等于5个字符时将引发一个接收数据的OnComm事件
m_ComCtrl.SetInputLen(40); //设置当前接收区数据长度为0
m_ComCtrl.GetInput();//先预读缓冲区以清除残留数据
m_length=0;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CDataDlg::OnComm()
{
static int ErrFlag1=0;
static int ErrFlag2=0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
// BYTE rxdata[350]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
strtemp="fg";
if(m_Send==true)
{
m_Send=false;
CByteArray Data;
Data.SetSize(1);
Data[0]=m_CtrlData;
m_ComCtrl.SetOutput(COleVariant(Data));
}
if(m_ComCtrl.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ComCtrl.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
{
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,m_rxdata+k);//转换为BYTE型数组
// AfxMessageBox((char*)rxdata,NULL,NULL);
m_length=len;
}
int tmp1;
int tmp2;
k=0;
///以下为解码及滤波
while(
!(m_rxdata[k]==0xF0
&&m_rxdata[k+1]==0xF1)
&&k+5<m_length)
k++;
if(k+5>=m_length)
return;
tmp1=m_rxdata[k+2]*256+m_rxdata[k+3];
tmp2=m_rxdata[k+4]*256+m_rxdata[k+5];
m_ADData1=tmp1;
if(fabs(m_ADData1Last-m_ADData1)>=100&&ErrFlag1==0)
{
ErrFlag1=1;
m_ADData1=m_ADData1Last;
}
else
{
ErrFlag1=0;
}
m_ADData1Last=m_ADData1;
m_ADData2=tmp2;
if(fabs(m_ADData2Last-m_ADData2)>=100&&ErrFlag2==0)
{
ErrFlag2=1;
m_ADData2=m_ADData2Last;
}
else
{
ErrFlag2=0;
}
m_ADData2Last=m_ADData2;
m_Port=m_rxdata[k+6];
m_Port=m_Port&3;
m_JDQStat=m_rxdata[k+7];
m_length=0;
}
}
Top
4 楼denny97104(飞翔.风)回复于 2002-03-14 10:18:52 得分 20
CMSComm m_ctrlComm;
m_ctrlComm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
Top
5 楼wangqipiao(老枪)回复于 2002-03-14 10:41:15 得分 20
缓冲区在内存里。缓冲区有多少个字符会触发?这要看通讯协议,基于字串的通信,当缓冲区接收到一个回车符时会触发,甚至不一定是回车符,可以是其它自定义的符号。Top




