选择“打开串口”时,出现"the device is not open",这是什么原因?

feibeyond 2012-07-04 07:05:30
这是其主要代码,电脑中本身有com3和com4,并且都好用,求解!!!


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);
}


...全文
1181 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
佑勿勿 2012-07-07
  • 打赏
  • 举报
回复
你用串口调试助手验证一下某个串口是否真的能打开,如果能打开,再去调你写的程序
shuzhongxunyu 2012-07-07
  • 打赏
  • 举报
回复
你那个串口是不是有问题啊?用USB转串口试试呢
wshcdr 2012-07-06
  • 打赏
  • 举报
回复
串口要看 它的波特率,奇偶校验,停止位等等设置
feibeyond 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

试试这样
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.pu……
[/Quote]
还是不行,这次说“串口1打开失败”。。。
hdg3707 2012-07-05
  • 打赏
  • 举报
回复
给你个例子:
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);
zgl7903 2012-07-04
  • 打赏
  • 举报
回复
试试这样

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打开失败"));
}

android 串口驱动源代码 package android.serialport; import java.io.File; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.util.Log; public class SerialPort { private static final String TAG = "SerialPort"; /* * Do not remove or rename the field mFd: it is used by native method close(); */ private FileDescriptor mFd; private FileInputStream mFileInputStream; private FileOutputStream mFileOutputStream; public SerialPort(File device, int baudrate) throws SecurityException, IOException { /* Check access permission */ if (!device.canRead() || !device.canWrite()) { try { /* Missing read/write permission, trying to chmod the file */ Process su; su = Runtime.getRuntime().exec("/system/bin/su"); /*String cmd = "chmod 777 " + device.getAbsolutePath() + "\n" + "exit\n";*/ String cmd = "chmod 777 /dev/s3c_serial0" + "\n" + "exit\n"; su.getOutputStream().write(cmd.getBytes()); if ((su.waitFor() != 0) || !device.canRead() || !device.canWrite()) { throw new SecurityException(); } } catch (Exception e) { e.printStackTrace(); throw new SecurityException(); } } mFd = open(device.getAbsolutePath(), baudrate); if (mFd == null) { Log.e(TAG, "native open returns null"); throw new IOException(); } mFileInputStream = new FileInputStream(mFd); mFileOutputStream = new FileOutputStream(mFd); } // Getters and setters public InputStream getInputStream() { return mFileInputStream; } public OutputStream getOutputStream() { return mFileOutputStream; } // JNI private native static FileDescriptor open(String path, int baudrate); public native void close(); static { System.loadLibrary("serial_port"); } }

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧