USB-RS232形成的COM口无法使用CSerialPort类

clw_zxq 2009-02-15 09:10:09
大家好,本人近日在使用USB-RS232转换成的COM4口进行PLC编程练习,PLC为松下的FPG系列,使用松下公司的编程软件可以使用COM4进行连机,可以进行程序上传和下载,这说明USB-RS232转的COM4是正常的,我自己也使用CSerialPort类变了一个和PLC联机的通讯软件,使用电脑自带的COM1口可以正常联机,这说明编的软件是对的,程序的一部分如下:
if(!m_bOpenPort)
{
if(m_Port.InitPort(this,m_nCom,m_nBaud,m_cParity,m_nDatabits,
m_nStopbits,dwComEvts,m_nBufferSize))
{
m_Port.StartMonitoring();
strStatus.Format("%d",m_nBaud);
// m_cParity,m_nDatabits,m_nStopbits);
m_ctrlComStatus.SetWindowText(strStatus);
m_bOpenPort=TRUE;
}
else
{
AfxMessageBox("Can't open COM");
m_ctrlComStatus.SetWindowText("Open Failed");
m_bOpenPort=FALSE;

return;
}
此时的m_nCom=1;
然后我就打算使用COM4,我把m_nCom=4,可是每次联机都是Can't open COM,很奇怪,为什么使用COM1可以,COM4打开串口不成功?难道是CSerialPort不支持USB-RS232?请大家帮忙解释一下,最好能够给个CSerialPort改造后支持COM4的程序,谢谢。
...全文
614 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
xumaojun 2009-02-20
  • 打赏
  • 举报
回复
首先用串口调试助手看看COM4是否可用,如果不可用,确保你的设备管理器中的USB转串和你要打开的是一样的,一般情况下是串口线有问题
clw_zxq 2009-02-17
  • 打赏
  • 举报
回复
我尝试对if(m_Port.InitPort(this,m_nCom,m_nBaud,m_cParity,m_nDatabits,
m_nStopbits,dwComEvts,m_nBufferSize))进行了跟踪,发现第一次是成功了,由于我使用的是自动波特率检测,就是在某个波特率下向PLC发送通讯指令,如果波特率正确则PLC就会反馈一条指令,如果不成功,则不会反馈,如果不对,则继续换个波特率发送,对常用的波特率都试一遍,如果还不成功,则PLC连接失败,我现在大体知道了USB-RS232是好的,就是暂时不知怎么解决,我知道一个不是办法的办法,原有的InitPort如下:
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 < 5);
assert(pPortOwner != NULL);

// if the thread is alive: Kill
if (m_bThreadAlive)
{
do
{
SetEvent(m_hShutdownEvent);
} while (m_bThreadAlive);
TRACE("Thread ended\n");
}
// create events
if (m_ov.hEvent != NULL)
ResetEvent(m_ov.hEvent);
else
m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (m_hWriteEvent != NULL)
ResetEvent(m_hWriteEvent);
else
m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (m_hShutdownEvent != NULL)
。。。。。。
由于内容太多,我只截取一部分,
我在里面加了用红色标记的一句话就可以了,我觉得太奇怪了
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 < 5);
assert(pPortOwner != NULL);

// if the thread is alive: Kill
if (m_bThreadAlive)
{
do
{
SetEvent(m_hShutdownEvent);
} while (m_bThreadAlive);
TRACE("Thread ended\n");
}
AfxMessageBox("RUN HERE!"); //key point reason
// create events
if (m_ov.hEvent != NULL)
ResetEvent(m_ov.hEvent);
else
m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (m_hWriteEvent != NULL)
ResetEvent(m_hWriteEvent);
else
m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (m_hShutdownEvent != NULL)
用户 昵称 2009-02-16
  • 打赏
  • 举报
回复
硬件本身的问题。
q_qq5566 2009-02-15
  • 打赏
  • 举报
回复
up
CodeProject-Jerry 2009-02-15
  • 打赏
  • 举报
回复
USB-RS232 没什么不同是, 我在Linux下写代码都没任何区别, Windows就更不用说了
zaodt 2009-02-15
  • 打赏
  • 举报
回复
没有研究过这个类,不知道它内部打开串行口时做了什么操作。

你可以直接使用 CreateFile API 函数看看能否打开 COM4 。

MSDN 这有简单的例子,一个函数便可知道能不能打开。


【使用松下公司的编程软件可以使用COM4进行连机,可以进行程序上传和下载,这说明USB-RS232转的COM4是正常的】

如果这句话成立的话,那说明跟这个 USB 串行口根本就没什么关系,它可以正常工作。

===========================

但这里我只是要提一下:

你这个 USB 串行口多少钱买的?

我曾经遇到过,30 块钱的有些设备上不能用,有问题,可以缺少了什么;

后来换了个 100 块的,就完全好了,老板也承认 30 块钱的的确缺少了什么。


=========

楼主,你先试试看 CreateFile !

关注中……
一条晚起的虫 2009-02-15
  • 打赏
  • 举报
回复
挂到InitPort函数内部,看看到底是哪句出错。
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

16,471

社区成员

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

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

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