大家好,本人近日在使用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的程序,谢谢。

解决方案 »

  1.   

    挂到InitPort函数内部,看看到底是哪句出错。
      

  2.   

    没有研究过这个类,不知道它内部打开串行口时做了什么操作。你可以直接使用 CreateFile API 函数看看能否打开 COM4 。MSDN 这有简单的例子,一个函数便可知道能不能打开。
    【使用松下公司的编程软件可以使用COM4进行连机,可以进行程序上传和下载,这说明USB-RS232转的COM4是正常的】如果这句话成立的话,那说明跟这个 USB 串行口根本就没什么关系,它可以正常工作。===========================但这里我只是要提一下:你这个 USB 串行口多少钱买的?我曾经遇到过,30 块钱的有些设备上不能用,有问题,可以缺少了什么;后来换了个 100 块的,就完全好了,老板也承认 30 块钱的的确缺少了什么。
    =========楼主,你先试试看 CreateFile !关注中……
      

  3.   

    USB-RS232  没什么不同是, 我在Linux下写代码都没任何区别, Windows就更不用说了
      

  4.   

    我尝试对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)
      

  5.   

    首先用串口调试助手看看COM4是否可用,如果不可用,确保你的设备管理器中的USB转串和你要打开的是一样的,一般情况下是串口线有问题