读书人

抉择“打开串口”时出现quot;the device

发布时间: 2012-08-13 13:21:53 作者: rapoo

选择“打开串口”时,出现"the device is not open",这是什么原因?
这是其主要代码,电脑中本身有com3和com4,并且都好用,求解!!!

C/C++ code
void C串口测试Dlg::OnBnClickedOpencom(){    // TODO: 在此添加控件通知处理程序代码    if(m_mscomm.get_PortOpen())    {        m_mscomm.put_PortOpen(FALSE);    }    m_mscomm.put_CommPort(4);//选择COM1    m_mscomm.put_InBufferSize(1024);//接收缓冲区    m_mscomm.put_OutBufferSize(1024);//发送缓冲区    m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取    m_mscomm.put_InputMode(1);//以二进制方式读写数据    m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件    m_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600,无校验位,8个数据位,1个停止位    if(!m_mscomm.get_PortOpen())    {        m_mscomm.put_PortOpen(TRUE);        AfxMessageBox(_T("串口1打开成功"));    }    else    {        m_mscomm.put_OutBufferCount(0);        AfxMessageBox(_T("串口1打开失败"));    }}void C串口测试Dlg::OnBnClickedClosecom(){    // TODO: 在此添加控件通知处理程序代码    m_mscomm.put_PortOpen(FALSE);//关闭串口    AfxMessageBox(_T("串口1已关闭"));}void C串口测试Dlg::OnBnClickedSend(){    // TODO: 在此添加控件通知处理程序代码    UpdateData(TRUE);//读取编辑框内容    m_mscomm.put_Output(COleVariant(m_Send));//发送数据    m_Send.Empty();//发送后清空数据    UpdateData(FALSE);//更新编辑框内容}BEGIN_EVENTSINK_MAP(C串口测试Dlg, CDialogEx)    ON_EVENT(C串口测试Dlg, IDC_MSCOMM, 1, C串口测试Dlg::OnCommMscomm, VTS_NONE)END_EVENTSINK_MAP()void C串口测试Dlg::OnCommMscomm(){    // TODO: 在此处添加消息处理程序代码    static unsigned int cnt=0;    VARIANT variant_inp;    COleSafeArray safearray_inp;    long len,k;    unsigned int data[1024]={0};    byte rxdata[1024];//设置byte数组    CString strtemp;    if(m_mscomm.get_CommEvent()==2)//值为2表示接收缓冲区内有字符    {        cnt++;        variant_inp=m_mscomm.get_Input();//读缓冲区消息        safearray_inp=variant_inp;        len=safearray_inp.GetOneDimSize();//得到有效的数据长度        for(k=0;k<len;k++)        {            safearray_inp.GetElement(&k,rxdata+k);        }        for(k=0;k<len;k++)//将数组转换为CString型变量        {            strtemp.Format(_T("%x"),*(rxdata+k));            m_Receive+=strtemp;            CString temp=_T("\r\n");            m_Receive+=temp;        }    }    UpdateData(FALSE);}




[解决办法]
试试这样
C/C++ code
  if(m_mscomm.get_PortOpen())    m_mscomm.put_PortOpen(FALSE);  m_mscomm.put_CommPort(4);//选择COM1  m_mscomm.put_PortOpen(TRUE);  if(m_mscomm.get_PortOpen())  {    m_mscomm.put_InBufferSize(1024);//接收缓冲区    m_mscomm.put_OutBufferSize(1024);//发送缓冲区    m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取    m_mscomm.put_InputMode(1);//以二进制方式读写数据    m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件    m_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600,无校验位,8个数据位,1个停止位    AfxMessageBox(_T("串口1打开成功"));  }  else  {    AfxMessageBox(_T("串口1打开失败"));  }
[解决办法]
给你个例子:
void CMy72V300AView::OnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
long i = 0,len;
switch (m_Comm1.get_CommEvent())
{
case 2:
//表示接收缓冲区内有字符
{

variant_inp = m_Comm1.get_Input();
safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize();
for (i = 0; i < len; i++)
{
safearray_inp.GetElement(&i, &m_ReceBuff[i]);
}
m_Comm1.put_OutBufferCount(0);// '清空发送缓冲区
m_Comm1.put_InBufferCount(0);// '滑空接收缓冲区
safearray_inp.Clear();
}
break;
default:
break;
}
}
串口初始化:
view1->m_Comm1.put_CommPort(1); //串口1
view1->m_Comm1.put_InBufferSize(4096); //设置输入缓冲区的大小,Bytes
view1->m_Comm1.put_OutBufferSize(2048); //设置输入缓冲区的大小,Bytes
if(!view1->m_Comm1.get_PortOpen()) //打开串口


{
view1->m_Comm1.put_PortOpen(true);
}
view1->m_Comm1.put_OutBufferCount(0);// '清空发送缓冲区
view1->m_Comm1.put_InBufferCount(0);// '滑空接收缓冲区

view1->m_Comm1.put_InputMode(1); //设置输入方式为二进制方式
view1->m_Comm1.put_Settings(str); //设置波特率等参数
view1->m_Comm1.put_RThreshold(8); //为8表示有8个字符即引发事件
view1->m_Comm1.put_InputLen(0);

[解决办法]
你那个串口是不是有问题啊?用USB转串口试试呢
[解决办法]
你用串口调试助手验证一下某个串口是否真的能打开,如果能打开,再去调你写的程序

读书人网 >VC/MFC

热点推荐