大家好,本人近日在使用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的程序,谢谢。
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的程序,谢谢。
解决方案 »
- 散分
- VS2008 关于OnLButtonDown的问题
- curlpp编译问题
- 高分求救。。。。突然被 ON_CONTROL 和 ON_NOTIFY 迷糊了。。。。
- 怎样看一个进程用了几个线程?
- 如何定义带不定参数的宏?
- VC+ADO数据库编程中,如何把内存中用结构体链表保存的一些字符串和数据点的通过ADO数据库操作保存到Access中?还能够读出来用链表保存。
- 有没有这样的聊天软件源代码:使用udp协议,不使用服务器,实现局域网内多个机算计聊天
- 困惑中。。谁能帮忙解决这个问题?
- 如何转为固定网络字节,进行网络发送?
- 程序退出的问题
- 我学习VC时,用CRectTracker改进的类,具有限制在一个RECT中和蚂蚁线功能,贴出来,共分享!
【使用松下公司的编程软件可以使用COM4进行连机,可以进行程序上传和下载,这说明USB-RS232转的COM4是正常的】如果这句话成立的话,那说明跟这个 USB 串行口根本就没什么关系,它可以正常工作。===========================但这里我只是要提一下:你这个 USB 串行口多少钱买的?我曾经遇到过,30 块钱的有些设备上不能用,有问题,可以缺少了什么;后来换了个 100 块的,就完全好了,老板也承认 30 块钱的的确缺少了什么。
=========楼主,你先试试看 CreateFile !关注中……
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)