导航
  • 主页
  • VC综合技术
  • MFC新技术
  • 互联网技术
  • .NET 技术
  • VC/MFC界面
  • VC/MFC 进程
  • VC/MFC 数据库
  • VC++技术资源

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的程序,谢谢。
...全文
509 点赞 收藏 7
写回复
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)
回复
硬件本身的问题。
回复
q_qq5566 2009-02-15
up
回复
USB-RS232 没什么不同是, 我在Linux下写代码都没任何区别, Windows就更不用说了
回复
zaodt 2009-02-15
没有研究过这个类,不知道它内部打开串行口时做了什么操作。

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

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


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

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

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

但这里我只是要提一下:

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

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

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


=========

楼主,你先试试看 CreateFile !

关注中……
回复
挂到InitPort函数内部,看看到底是哪句出错。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

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