VC串口通讯错误:当端口打开时操作无效

菜鸟小A 2013-12-19 10:31:31
我是用MSComm控件来收发数据的
	
if(m_Comm.GetPortOpen())
m_Comm.SetPortOpen(FALSE);
/************************************************************************/
/* 这个地方有个bug;“当端口打开时操作无效” */
/************************************************************************/
m_Comm.SetCommPort(5); //选择com1
if( !m_Comm.GetPortOpen())
m_Comm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");

m_Comm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
m_Comm.SetOutBufferSize(512);
m_Comm.SetInBufferSize(1024);

m_Comm.SetInputMode(1); //1:表示以二进制方式检取数据
m_Comm.SetRThreshold(1);

看过好多源代码都是这样打开串口的,为什么就我的会报错?
m_Comm.SetCommPort(5); 换过串口号还是报这个错
搜了好多资料都没解决这个问题
...全文
721 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Nern 2016-03-05
  • 打赏
  • 举报
回复
CString CommName;
		HANDLE h_comm;
		bool ValidPort;
		int PortNo;

		UpdateData(true);	

		PortNo = 5;
		
		//该部分用API实现对串口号有效性的检测
		CommName.Format("COM%d", PortNo);
		
		h_comm = CreateFile(CommName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);

		if(h_comm == INVALID_HANDLE_VALUE)
		{
			ValidPort = false;
		}
		else
		{
			ValidPort = true;
		}

		CloseHandle(h_comm);

		if(!ValidPort)
		{
		//	m_TextVisualCommSituation.Format("视觉串口:无效或被占用.请重新选择串口.");
			MessageBox("该串口无效或被占用");
			UpdateData(false);
			return;
		}
我觉得呢你在你贴的代码前先添加这段代码吧,这段程序我已经帮你改好了。就是直接检测你的com5是否被占用了。 这个是通过直接调用windows api完成的。如果有错,那就会直接弹个MessageBox出来告诉你你所选的com5就是有问题的啦。
dongzhuangdian 2015-04-08
  • 打赏
  • 举报
回复
个人觉得是你的虚拟串口软件有点问题
drlsdrls 2013-12-20
  • 打赏
  • 举报
回复
引用 11 楼 u011175985 的回复:
[quote=引用 10 楼 drlsdrls 的回复:] 单步调试一下出错前是哪个函数调用了open这个成员,或者你把断点打在
 m_Comm.SetCommPort(5); //选择com1
这句话之前,看看错误会不会出现
这里不会、 加在 m_Comm.SetPortOpen(FALSE); 之前会出现这个错误[/quote] 这个不科学啊,m_Comm.SetPortOpen(FALSE)语句在m_Comm.SetCommPort(5)语句之前已经被执行了,你在后面的语句打断点没错误,在前面的语句打断点反而出错误,这个怎么可能啊,你断点到底打的对不对啊
drlsdrls 2013-12-20
  • 打赏
  • 举报
回复
遇到问题,解决问题,能力才会提高
菜鸟小A 2013-12-20
  • 打赏
  • 举报
回复
引用 15 楼 drlsdrls 的回复:
[quote=引用 11 楼 u011175985 的回复:] [quote=引用 10 楼 drlsdrls 的回复:] 单步调试一下出错前是哪个函数调用了open这个成员,或者你把断点打在
 m_Comm.SetCommPort(5); //选择com1
这句话之前,看看错误会不会出现
这里不会、 加在 m_Comm.SetPortOpen(FALSE); 之前会出现这个错误[/quote] 这个不科学啊,m_Comm.SetPortOpen(FALSE)语句在m_Comm.SetCommPort(5)语句之前已经被执行了,你在后面的语句打断点没错误,在前面的语句打断点反而出错误,这个怎么可能啊,你断点到底打的对不对啊[/quote] 我现在讨厌MSComm控件了、
drlsdrls 2013-12-19
  • 打赏
  • 举报
回复
单步调试一下出错前是哪个函数调用了open这个成员,或者你把断点打在
 m_Comm.SetCommPort(5); //选择com1
这句话之前,看看错误会不会出现
菜鸟小A 2013-12-19
  • 打赏
  • 举报
回复
引用 7 楼 drlsdrls 的回复:
[quote=引用 5 楼 u011175985 的回复:] [quote=引用 3 楼 drlsdrls 的回复:] 具体报的是什么错? 你在设备管理器里是否已经确认过有COM5这个设备?
我确定没有这样的设备。开机重启第一个运行这个程序还是会弹出这个窗口,我设置COM1,或者COM2。。。都会弹出这个窗口。 但是用同样的代码在别的程序中却不会出现这种情况[/quote] 你电脑里没有COM5这个设备你还去打开COM5当然会报错。你应该先确定电脑里可用的COM编号是多少,然后在初始化的地方填上对应的COM号。另外再确认一下是不是程序在其他地方也有打开COM口的动作。这个错误信息感觉是打开了一个已经打开的COM。[/quote] 我真的没有打开过COM5这个串口。另外我在代码尝试打开其他串口,他都会弹出这个窗口。就跟你说的那样好像已经打开过一样。
菜鸟小A 2013-12-19
  • 打赏
  • 举报
回复


引用 7 楼 drlsdrls 的回复:
[quote=引用 5 楼 u011175985 的回复:]
[quote=引用 3 楼 drlsdrls 的回复:]
具体报的是什么错?
你在设备管理器里是否已经确认过有COM5这个设备?

我确定没有这样的设备。开机重启第一个运行这个程序还是会弹出这个窗口,我设置COM1,或者COM2。。。都会弹出这个窗口。
但是用同样的代码在别的程序中却不会出现这种情况[/quote]

你电脑里没有COM5这个设备你还去打开COM5当然会报错。你应该先确定电脑里可用的COM编号是多少,然后在初始化的地方填上对应的COM号。另外再确认一下是不是程序在其他地方也有打开COM口的动作。这个错误信息感觉是打开了一个已经打开的COM。[/quote]
这个错误是:
我用的是虚拟串口软件来联通COM4和COM5来收发数据。COM5只是一个串口号,需要的话COM128和COM129都可以设置的啊
drlsdrls 2013-12-19
  • 打赏
  • 举报
回复
引用 5 楼 u011175985 的回复:
[quote=引用 3 楼 drlsdrls 的回复:] 具体报的是什么错? 你在设备管理器里是否已经确认过有COM5这个设备?
我确定没有这样的设备。开机重启第一个运行这个程序还是会弹出这个窗口,我设置COM1,或者COM2。。。都会弹出这个窗口。 但是用同样的代码在别的程序中却不会出现这种情况[/quote] 你电脑里没有COM5这个设备你还去打开COM5当然会报错。你应该先确定电脑里可用的COM编号是多少,然后在初始化的地方填上对应的COM号。另外再确认一下是不是程序在其他地方也有打开COM口的动作。这个错误信息感觉是打开了一个已经打开的COM。
菜鸟小A 2013-12-19
  • 打赏
  • 举报
回复
这个问题真是匪夷所思啊!!就好像凭空跳出来的一样
菜鸟小A 2013-12-19
  • 打赏
  • 举报
回复
引用 3 楼 drlsdrls 的回复:
具体报的是什么错? 你在设备管理器里是否已经确认过有COM5这个设备?
我确定没有这样的设备。开机重启第一个运行这个程序还是会弹出这个窗口,我设置COM1,或者COM2。。。都会弹出这个窗口。 但是用同样的代码在别的程序中却不会出现这种情况
菜鸟小A 2013-12-19
  • 打赏
  • 举报
回复
引用 2 楼 hdg3707 的回复:
if(m_Comm.GetPortOpen()) m_Comm.SetPortOpen(FALSE); /************************************************************************//* 这个地方有个bug;“当端口打开时操作无效” 把这两条语句去掉,并没给控件赋值哪个串口,当然出错了。应该是下面的判断
m_Comm.SetCommPort(5); //选择com1 这句是打开COM5。上面的这两句是先把串口关闭下面的代码是打开串口COM5并设置属性。 我的程序能运行,但是每次打开都会弹出一个窗口:“当端口打开时操作无效。” 而且之前没有出过这个错误的。
drlsdrls 2013-12-19
  • 打赏
  • 举报
回复
具体报的是什么错? 你在设备管理器里是否已经确认过有COM5这个设备?
hdg3707 2013-12-19
  • 打赏
  • 举报
回复
if(m_Comm.GetPortOpen()) m_Comm.SetPortOpen(FALSE); /************************************************************************//* 这个地方有个bug;“当端口打开时操作无效” 把这两条语句去掉,并没给控件赋值哪个串口,当然出错了。应该是下面的判断
菜鸟小A 2013-12-19
  • 打赏
  • 举报
回复
暂时还不打算用其他方法打开串口。毕竟这是微软推出的串口通讯控件,利用价值还是很高的。有大神知道怎么解决吗?请教了!
菜鸟小A 2013-12-19
  • 打赏
  • 举报
回复
引用 13 楼 xiaohuh421 的回复:
要么串口号指定错误, 要么就是串口号已经被占用,就是你在某个地方打开了, 却没有关闭. 串口是独占的.
我还是没有搞定、 太难过了
xiaohuh421 2013-12-19
  • 打赏
  • 举报
回复
要么串口号指定错误, 要么就是串口号已经被占用,就是你在某个地方打开了, 却没有关闭. 串口是独占的.
菜鸟小A 2013-12-19
  • 打赏
  • 举报
回复
这个帖子也谈到这个问题、不过也没解决啊 http://bbs.csdn.net/topics/20390823
菜鸟小A 2013-12-19
  • 打赏
  • 举报
回复
引用 10 楼 drlsdrls 的回复:
单步调试一下出错前是哪个函数调用了open这个成员,或者你把断点打在
 m_Comm.SetCommPort(5); //选择com1
这句话之前,看看错误会不会出现
这里不会、 加在 m_Comm.SetPortOpen(FALSE); 之前会出现这个错误

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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