目的:将接收到的数据保存在一个数组中,通过判断此数组的某个字节,选择相应的操作。
调试中用了下面这段经典的接收程序,在与下位机通信过程中,用串口助手发送接收没有问题,但用这段程序会出现个别字节接收错误的情况,不知道是为何?
void CSCommTestDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k);
strtemp.Format("%02X ",bt); //16进制显示
m_strRXData+=strtemp;
}
}
UpdateData(FALSE);
}
随后将触发事件这段程序修改了后,接收数据没错。但在调试中会弹出“Access violation ”的对话框,不知道为何?
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
receivebuf[i] = rxdata[k]; //将数据保存在receivebuf[]中
i++;
}
}
又修改了一下程序,用指针实现数据的保存,不会弹出“Access violation ”,但是接收到的数据receivebuf[i]会与rxdata[k]错位,又不知道是为何?所以在此请求帮助,望高人指点!在此谢过。
定义了一个unsigned char *preceive
初始化了preceive = receivebuf;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k);
*preceive = bt;
preceive++;
m_strRXData+=strtemp;
}
}