选择“打开串口”时,出现"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转串口试试呢
[解决办法]
你用串口调试助手验证一下某个串口是否真的能打开,如果能打开,再去调你写的程序