原来有一个VB程序,关于接收数据部分是这样的(MSComm1是串口对象) Dim Rbuffer() As Byte '接收数据暂存
Dim pn As Long '记录接收的数据
Dim buffer(0 To 9830400) As Byte '接收数据暂存数组Do While MSComm1.InBufferCount > 0
MSComm1.InputLen = 0
Rbuffer = MSComm1.Input
For i = 0 To UBound(Rbuffer)
buffer(pn) = Rbuffer(i)
pn = pn + 1
Next i
Label5.Caption = "正在采集数据,已完成" + Str$(Round(100 * pn / pnn, 1)) + "%"
ProgressBar1.Value = pn
DoEvents
Loop现在我要在VC中实现,我用了ACtiveX控件,在void CCSCommDlg::OnComm() 函数中接收数据,
if(m_MSComm.GetCommEvent()==2)时,开始接收
variant_inp=m_MSComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度下面我就不知道怎么做了,m_MSComm.GetInput(); 是保证所有的数据都在缓存区里吗,还是说我这次接收的数据只是一部分,还需要读缓存区,请高手指点!
Dim pn As Long '记录接收的数据
Dim buffer(0 To 9830400) As Byte '接收数据暂存数组Do While MSComm1.InBufferCount > 0
MSComm1.InputLen = 0
Rbuffer = MSComm1.Input
For i = 0 To UBound(Rbuffer)
buffer(pn) = Rbuffer(i)
pn = pn + 1
Next i
Label5.Caption = "正在采集数据,已完成" + Str$(Round(100 * pn / pnn, 1)) + "%"
ProgressBar1.Value = pn
DoEvents
Loop现在我要在VC中实现,我用了ACtiveX控件,在void CCSCommDlg::OnComm() 函数中接收数据,
if(m_MSComm.GetCommEvent()==2)时,开始接收
variant_inp=m_MSComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度下面我就不知道怎么做了,m_MSComm.GetInput(); 是保证所有的数据都在缓存区里吗,还是说我这次接收的数据只是一部分,还需要读缓存区,请高手指点!
GetInput()是你当前读取到的数据
MSComm1.Settings = 576000 & ",n,8,1" '通信端口波特率选择
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
MSComm1.InBufferCount = 0
Shape1.FillColor = &HFF&
End Sub是不是默认就接收所有数据?第二,在VC中我是不是可以设置很大的缓存区
m_MSComm.SetInBufferSize(9830400); //接收缓冲区%%%%%%%%%%%%%
2.你这个是设置缓冲区的大小
要设置
m_MSComm.SetRThreshold(20)//这个是若受到20个字节数据就触发OnComm事件
BYTE rxdata[1024]; //定义存放二进制数据的数组
long len1,k;
COleSafeArray safearray1; //定义COleSafeArray类的实例
CString strDis;
switch(myComm.GetCommEvent())
{
case 2:
myComm.SetInputLen(0);
input1=myComm.GetInput();
safearray1=input1;
len1=safearray1.GetOneDimSize();
for(k=0;k<len1;k++)
safearray1.GetElement(&k,rxdata+k);
if(//01 06 00 00 00 00 AA 55
(rxdata[0]==0x01)&&(rxdata[1]==0x06)
&&(rxdata[2]==0x00)&&(rxdata[3]==0x00)
&&(rxdata[4]==0x00)&&(rxdata[5]==0x00)
&&(rxdata[6]==0xAA)&&(rxdata[7]==0x55)
)
{
//数据保存成功
//m_StatusBar.SetText(_T("数据保存成功"), 3, 0);
//m_StatusBar.SetText(_T("通讯正常"), 4, 0);
//SetTimer(1,100,NULL);
}
else
{
//错误指令
// m_StatusBar.SetText(_T("数据保存失败"), 3, 0);
}
}
break;
这个VB程序就是判断输入缓冲区有数据就读取,然后依次填充到数组里面,知道缓冲区没有数据为止
VC 里面设置m_MSComm.SetRThreshold(0)//
RxData[1024];
int n; myComm.SetInputLen(0);//全部读取
input1=myComm.GetInput();获取
safearray1=input1;
len1=safearray1.GetOneDimSize();
//根据len1判断到底是什么命令?有必要?
for(k=0;k<len1;k++)
safearray1.GetElement(&k,rxdata+k);
for(k=0;k<len1;k++)
{
RxData[n]=rxdata[k]
n=n+1;
}