wzpanda 发表于 2009-8-27 09:34:39

port already open 怎么解决,求救!

再问下 port already open 怎么解决?
说明:这框我没写的,而自己写 的        打开串口失败则弹出AfxMessageBox("cannot open serial port")框框的,但是失败时没弹出!却弹出port already open这个框框,这到底是why呢?郁闷。。。

wzpanda 发表于 2009-8-27 09:35:04

在线等。。。。

wzpanda 发表于 2009-8-27 09:47:12

怎么没人看的?

oldtom 发表于 2009-8-27 11:00:35

懒得理你,乱改帖子!

wzpanda 发表于 2009-8-27 11:27:58

明白,谢谢LS,再问下 port already open 怎么解决?

xukaiming 发表于 2009-8-27 19:08:39

貌似在调试串口程序吧?
port already open

try
{
   Comm.Open()
}
catch(CException &e)
{

}
//
问奇怪的问题最好先贴代码

wzpanda 发表于 2009-8-27 22:08:45

回【5楼】 xukaiming
是在调串口的,第一次写的串口程序,就头疼了。。。
void CSCOMMTESTDlg::OnComm()
{
        // TODO: Add your control notification handler code here
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata; //设置BYTE数组 An 8-bit integerthat is not signed.
    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; //加入接收编辑框对应字符串
      }
        }
}

void CSCOMMTESTDlg::OnOpenportbutton()
{
        // TODO: Add your control notification handler code here
        if(m_ctrlComm.GetPortOpen())
                m_ctrlComm.SetPortOpen(FALSE);

        m_ctrlComm.SetCommPort(3);   //选择com3
        if( !m_ctrlComm.GetPortOpen())
        {
                m_ctrlComm.SetPortOpen(TRUE);//打开串口
                AfxMessageBox("open serial port");
        }
        else
        AfxMessageBox("cannot open serial port");

        m_ctrlComm.SetSettings("4800,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();       //先预读缓冲区以清除残留数据       
}
看看有问题不?再声明下用的是USB转的串口的!!

zhenke 发表于 2009-8-27 22:25:38

弹出port already open这个框框

是因为MSComm控件可以捕获错误8013,自己弹出的。端口已经打开。

wzpanda 发表于 2009-8-27 23:00:14

但是还是通信不了啊。?

zhenke 发表于 2009-8-27 23:07:12

哦,你说的这个意思啊。

com3是系统他用的,你不能使用。

zhenke 发表于 2009-8-27 23:15:55

一般分配给 Modem

http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_475366.JPG
(原文件名:com3.JPG)

wzpanda 发表于 2009-8-27 23:21:09

不是的,我详细检查过了,com3是USB转的串口来的,是不是VC程序有问题啊?一直都通信不了。。

zhenke 发表于 2009-8-27 23:24:27

仔细看了一下,你等会。我帮你试一下。

wzpanda 发表于 2009-8-27 23:43:26

你太好了。。。

zhenke 发表于 2009-8-27 23:55:32

好像程序不会出现这个问题,还是串口被占用了。

安装usb串口的时候可以选择其它串口吗?

yplin27 发表于 2009-8-28 00:05:33

建议:
1、把所有用到这个串口的软件关闭。
2、运行串口调试助手,看可不可以打开 ----- 如果不可以打开,重启试试,有可能是某个后台程序占用串口
3、如果串口调试助手可以打开,则把串口调试助手关闭,运行你的程序 ------ 如果此时报错,则检查你的程序有没有可能多次打开串口

zhenke 发表于 2009-8-28 00:20:38

发两个软件,一个虚拟串口,一个串口助手。

先用串口助手看能不能打开COM3。如果不能检查自己的COM3。


用虚拟串口虚拟出COM4,COM5。

串口助手设置成COM4,自己程序设置成COM5。2个互发调试。

点击此处下载 ourdev_475375.rar(文件大小:2.81M) (原文件名:Virtual Serial Port Driverv6.rar)
点击此处下载 ourdev_475376.rar(文件大小:114K) (原文件名:串口调试助手V2.2.rar)

wzpanda 发表于 2009-8-28 01:04:56

用串口调试时,是可以打开的,所以我就怀疑是不是不VC程序的问题了,但是我对vc了解又不多。所以问题就还不会解决。
好的,我试下用虚拟串口自发自收行不行先。。

xukaiming 发表于 2009-8-31 21:03:06

奇怪了啊,你那个程序在我的电脑上没问题 啊

wzpanda 发表于 2009-9-1 22:42:40

是程序的问题,谢谢各位!

fringe 发表于 2011-5-3 11:07:50

说明一下,Mscomm控件的GetPortOpen函数仅能判断本程序自身的串口状态,其他程序改变的串口状态由事件响应自动处理,顶一下zhenke发的虚拟串口Virtual Serial Port Driverv6.rar工具,不错!!!
页: [1]
查看完整版本: port already open 怎么解决,求救!