CSerialPort类 串口号的限制

j_enjoy 2011-10-25 03:21:11
请教各位大虾一个问题!
CSerialPort类的源文件中有这么一段
BOOL CSerialPort::InitPort(CWnd* pPortOwner, // the owner (CWnd) of the port (receives message)
UINT portnr, // portnumber (1..4)
UINT baud, // baudrate
char parity, // parity
UINT databits, // databits
UINT stopbits, // stopbits
DWORD dwCommEvents, // EV_RXCHAR, EV_CTS etc
UINT writebuffersize) // size to the writebuffer
{
assert(portnr > 0 && portnr < 200);
assert(pPortOwner != NULL);
.........................................
}
assert(portnr > 0 && portnr < 200);这条语句是对串口号做了限制吗?
我的电脑获取到实际的串口号是21,
我的程序: if(m_serialport.InitPort(this,21,9600,'N',8,1,EV_RXFLAG|EV_RXCHAR,512))

{
m_serialport.StartMonitoring();
m_bComm[0]=TRUE;
AfxMessageBox("SUC");
}
else
{
AfxMessageBox("没有发现此串口或被占用!");
m_bComm[0]=FALSE;
}
当我打开21号串口的时候会出错,提示串口号不存在或被占用。即使我屏蔽了以上assert语句,结果还是一样的,请问应该怎么处理呀??
我在程序中需要同时打开10个串口,分别监控10台仪表的串口数据。头疼!
...全文
484 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bclshuai 2013-06-05
  • 打赏
  • 举报
回复
在串口选择的控件上点击右键,属性,内容,看到有com1com2com3com4,按ctrl和enter换行,在后面添加,比如说你要添加到12,com5……com12,就可以显示12个!
bclshuai 2012-12-05
  • 打赏
  • 举报
回复
各位大侠,我用的是龚建伟编的V2.2,但是是最多只能识别4个串口,而我要用到10个串口,怎么修改源代码啊?我已经修改了// assert(portnr > 0 && portnr < 21); 也加上了上面的 // prepare port strings if(portnr<10) { sprintf(szPort, "COM%d", portnr); } else { sprintf(szPort, "\\\\.\\COM%d", portnr); } 还是没有用,只能显示四个,各位大侠帮帮忙!
skywind123 2012-09-18
  • 打赏
  • 举报
回复
// prepare port strings
if(portnr<10)
{
sprintf(szPort, "COM%d", portnr);
}
else
{
sprintf(szPort, "\\\\.\\COM%d", portnr);
}
确实是可以的。
lanbucom 2012-05-17
  • 打赏
  • 举报
回复
感谢。试了一下,行的。
liwei__1987 2012-05-04
  • 打赏
  • 举报
回复
// prepare port strings
if(portnr<10)
{
sprintf(szPort, "COM%d", portnr);
}
else
{
sprintf(szPort, "\\\\.\\COM%d", portnr);
}
这样可以,我试过了的!
litong860105 2012-02-03
  • 打赏
  • 举报
回复
我也出现了同样的问题。我按照上面提示做了这个判断:
// prepare port strings
if(portnr<10)
{
sprintf(szPort, "COM%d", portnr);
}
else
{
sprintf(szPort, "\\\.\\COM%d", portnr);
}
但是好像还不行哦。还是提示串口号不存在或被占用。
arabicsara 2011-10-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cynixway 的回复:]

串口号大于10的话,CreateFile的时候字符串都应该是"\\\.\\com100",而不能是简单的"com1",不知道CSerial类里面做了转换没,时间太长忘记了。不过之前我遇到了这个问题。你试试如果超过10比如说11可以用就不是这个问题,那就可能是串口不存在,被占用等情况。
[/Quote]支持
用户 昵称 2011-10-26
  • 打赏
  • 举报
回复
你找找CreateFile的语句。
诶呦 2011-10-26
  • 打赏
  • 举报
回复
1.assert(portnr > 0 && portnr < 5);//调整至大于你的串口号
2.sprintf(szPort, "COM%d", portnr);//看看这句你有没有,单步调一下看到这里是不是21
3.在单步调2的时候看看串口返回的句柄值是否有效
j_enjoy 2011-10-26
  • 打赏
  • 举报
回复
试过了,COM号在10以内都可以,超过10就出错!
关键是怎么处理呀??
iCan.club 2011-10-25
  • 打赏
  • 举报
回复
串口号大于10的话,CreateFile的时候字符串都应该是"\\\.\\com100",而不能是简单的"com1",不知道CSerial类里面做了转换没,时间太长忘记了。不过之前我遇到了这个问题。你试试如果超过10比如说11可以用就不是这个问题,那就可能是串口不存在,被占用等情况。
CSerialPort First Version by Remon Spekreijse on 2000-02-08 http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c2483/A-communication-class-for-serial-port.htm Second Version by mrlong on 2007-12-25 https://code.google.com/p/mycom/ 增加 ClosePort 增加 WriteToPort 两个方法 增加 SendData 与 RecvData 方法 by liquanhai on 2011-11-04 http://blog.csdn.net/liquanhai/article/details/4955253 增加 ClosePort 中交出控制权,防止死锁问题 by liquanhai on 2011-11-06 http://blog.csdn.net/liquanhai/article/details/6941574 增加 ReceiveChar 中防止线程死锁 by viruscamp on 2013-12-04 https://github.com/viruscamp/CSerialPort 增加 IsOpen 判断是否打开 修正 InitPort 中 parity Odd Even 参数取值错误 修改 InitPortportnr 取值范围,portnr>9 时特殊处理 取消对 MFC 的依赖,使用 HWND 替代 CWnd,使用 win32 thread 函数而不是 MFC 的 增加用户消息编自定义,方法来自 CnComm by itas109 on 2014-01-10 http://blog.csdn.net/itas109/article/details/18358297 解决COM10以上端口无法显示的问题 扩展可选择端口,最大值MaxSerialPortNum可以自定义 添加QueryKey()和Hkey2ComboBox两个方法,用于自动查询当前有效的串口。 by liquanhai on 2014-12-18 增加一些处理措施,主要是对减少CPU占用率 by itas109 on 2016-05-07 http://blog.csdn.net/itas109 修复每次打开串口发送一次,当串口无应答时,需要关闭再打开或者接收完数据才能发送的问题。 解决办法:在m_hEventArray中调整m_hWriteEvent的优先级高于读的优先级。CommThread(LPVOID pParam)函数中读写的位置也调换。 参考:http://zhidao.baidu.com/link?url=RSrbPcfTZRULFFd2ziHZPBwnoXv1iCSu_Nmycb_yEw1mklT8gkoNZAkWpl3UDhk8L35DtRPo5VV5kEGpOx-Gea 修复停止位在头文件中定义成1导致SetCommState报错的问题,应为1对应的停止位是1.5。UINT stopsbits = ONESTOPBIT switch(stopbits)和switch(parity)增加默认情况,增强程序健壮性 by itas109 on 2016-06-22 http://blog.csdn.net/itas109 增加ReceiveStr方法,用于接收字符串(接收缓冲区有多少字符就接收多少字符)。 解决ReceiveChar只能接收单个字符的问题。 by itas109 on 2016-06-29 http://blog.csdn.net/itas109 解决RestartMonitoring方法和StopMonitoring方法命令不准确引起的歧义,根据实际作用。 将RestartMonitoring更改为ResumeMonitoring,将StopMonitoring更改为SuspendMonitoring。 增加IsThreadSuspend方法,用于判断线程是否挂起。 改进ClosePort方法,增加线程挂起判断,解决由于线程挂起导致串口关闭死锁的问题。 增加IsReceiveString宏定义,用于接收时采用单字节接收还是多字节接收 by itas109 on 2016-08-02 http://blog.csdn.net/itas109 https://github.com/itas109 改进IsOpen方法,m_hComm增加INVALID_HANDLE_VALUE的情况,因为CreateFile
串口工具集成目前多数串口工具的优秀功能于一身,采用CSerialPort进行编写,并在此基础上对该进行了改进。本工具免费试用,永不过期。并且本着奉献的精神,公开本串口工具的源代码,希望广大用户反馈意见或建议。 源码地址:code.csdn.net/itas109/serialport_itas109 博客地址:blog.csdn.net/itas109 Email:itas109@qq.com 本软件主要在XP系统做测试使用。 本工具的主要功能有: 1.接收从串口进来的数据并在窗口显示. 2.所接收到的数据数据显示方式可以选择为字符方式或者HEX方式 3.支持显示中文 4.串口波特率可以选择为300bps-115200bps. 5.可以即时刷新存在的串口.如果您增加了usb转串口等设备,点击刷新串口按钮后,新的串口也会在列表中出现. 6.支持最多20个串口列表,包括COM1-COM256中的任意20个活跃串口 7.可以选择“5、6、7、8”四种数据长度. 8.可以选择为“1、2”两种停止位. 9.数据可以选择为“无、奇校验、偶校验、1、0”四种方式. 10.串口设置和字符串操作等设置在程序关闭时自动保存,打开时自动载入.您可以自行设置是否自动保存. 11.可以在字符串输入框输入您想发送的字符串,并发送. 12.可以在字符串输入框输入您想发送的HEX数据串,数据的值从00到FF,没有任何限制. 13.可以定时重复发送数据,并可以设置发送时间间隔. 14.可以在发送字符串时选择发送新行,即自动加上回车换行. 15.可以即时显示发送的字节数和接收到的字节数,按清除窗口将会清零. 16、可以设置自动清空功能,在达到30行数据时,自动清空。未设置时,达到100行,自动清空. 17、在手动发送旁边的按钮可以设置按ENTER发送数据,注意点击“打开串口”后,请使焦点离开该控件. 另外要说明的是,由于本人编程能力有效,未免可能有些差错,在此先声明一下,您可以免费使用和自由传播本软件,但是我不对本软件所造成的任何损失负责!如果你使用了本软件,即表明您愿意接收这一条款。如果你不能接受,请立即将其删除!

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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