求指教,我刚学VC。用控件编了个串口程序,能向单片机发送程序,但不能接收程序,接收就出错。“0x5f5624b0”指令引用的“0x0000205d”内存。该内存不能读。
下面的我的代码,请大家指教。
void CExampleDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组
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("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}void CExampleDlg::OnButtonOpenport()
{
// TODO: Add your control notification handler code here
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(5); //选择串口com3
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE); //打开串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率4800,无校验,8个数据位,1个停止位 m_ctrlComm.SetInputMode(1); //以二进制方式检取数据
m_ctrlComm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput(); //先预读缓冲区以清除残留数据
}void CExampleDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_ctrlComm.SetOutput(COleVariant(m_strTXData)); //发送数据
}
下面的我的代码,请大家指教。
void CExampleDlg::OnComm()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组
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("%c",bt); //将字符送入临时变量strtemp存放
m_strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
UpdateData(FALSE); //更新编辑框内容
}void CExampleDlg::OnButtonOpenport()
{
// TODO: Add your control notification handler code here
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(5); //选择串口com3
if(!m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE); //打开串口
else
AfxMessageBox("cannot open serial port");
m_ctrlComm.SetSettings("9600,n,8,1"); //波特率4800,无校验,8个数据位,1个停止位 m_ctrlComm.SetInputMode(1); //以二进制方式检取数据
m_ctrlComm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput(); //先预读缓冲区以清除残留数据
}void CExampleDlg::OnButtonManualsend()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
m_ctrlComm.SetOutput(COleVariant(m_strTXData)); //发送数据
}
COleSafeArray safearray_inp;
Sleep(100); if ( m_MSComm.get_CommEvent()== 2) //事件值为2表示接收缓冲区内有字符
{
Rec_Data = m_MSComm.get_Input();
int Data_Len = Rec_Data.parray->rgsabound->cElements; //取出一维的数据个数
char Rec_Data_Array[64]={0};
memcpy(Rec_Data_Array, (char*) Rec_Data.parray->pvData, Data_Len); //拷贝出数据
m_MSComm.put_InBufferCount(0);
m_ID = CString(Rec_Data_Array);
}我一般是这么用的
给你个我写的静态库类,效率很高的,在相同的电脑上跑一样的过程,CPU使用率基本上在0%-%3左右,看电脑配置而定,现在一般的机子都在0%-1%左右,老机子要跑到3%。
http://download.csdn.net/detail/SupermanKing/2690778