在串口通讯中,在vc下使用多个串口,在com10以上应怎么处理?

美丽海洋 2005-04-02 07:46:35
在我的串口通讯程序中,当达到com10以后,vc下用函数createfile创建端口编程就出现了问题,请问各位应怎么处理?
...全文
447 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
samp_miao 2005-04-27
  • 打赏
  • 举报
回复
小于10时候加不加都行的,大于9时候就是必须要加"\\\\.\\"

比如串口10,对应的参数为"\\\\.\\COM10",
美丽海洋 2005-04-05
  • 打赏
  • 举报
回复
我在用createfile()函数时,得到句柄时出现错误,报错是:大部开端口,各位有没有遇到过这个问题?应怎么解决?

qrlvls(≌AIR⌒LIKE ≤空气≥) 兄,是怎么解决的则合格问题?
qrlvls 2005-04-02
  • 打赏
  • 举报
回复
COM1和COM10并未有所区别,应该检查其他部分的代码,而不要归结于是COM10还是COM11
qrlvls 2005-04-02
  • 打赏
  • 举报
回复
注:我同时驱动了16个串口,使用了COM20
qrlvls 2005-04-02
  • 打赏
  • 举报
回复
我使用了一个CSerialPort 的串口类,并未见到有何异常
void CLSComm::Initialize(UINT uBaud, char chParity, UINT uDataBits, float fStopBits)
{
m_uBaudRate = uBaud;
m_chParity = chParity;
m_uDataBits = uDataBits;

if (fStopBits == 1.5) // 1.5 个停止位
m_uStopBits = 2;
else if(fStopBits > 1.5) // 2 个停止位
m_uStopBits = 3;
else
m_uStopBits = 1; // 1 个停止位
}

BOOL CLSComm::OpenDevice(UINT uPort, HWND hMsgTarget)
{
BOOL bResult = FALSE;
TCHAR szPort[MAX_PATH];
TCHAR szBaud[MAX_PATH];

m_uCommPort = uPort;
m_hTargetWindow = hMsgTarget;

CloseDevice();

m_hWriteEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 发送数据事件
m_hShutdownEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 关闭线程的事件
m_ovComm.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // 读取数据事件

m_hEventArray[USER_EVENT_QUIT] = m_hShutdownEvent;
m_hEventArray[USER_EVENT_RECEIVE] = m_ovComm.hEvent;
m_hEventArray[USER_EVENT_SEND] = m_hWriteEvent;

wsprintf(szPort, _T("\\\\.\\COM%d"), m_uCommPort);
wsprintf(szBaud, _T("baud=%d parity=%c data=%d stop=%d"), m_uBaudRate, m_chParity, m_uDataBits, m_uStopBits);

InitializeCriticalSection(&m_csCritical);
EnterCriticalSection(&m_csCritical);

// 打开串口设备
m_hDevice = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
if (m_hDevice == INVALID_HANDLE_VALUE)
{
m_hDevice = NULL;
return FALSE;
}

if (SetCommTimeouts(m_hDevice, &m_timeoutComm))
{
if (SetCommMask(m_hDevice, EV_RXCHAR | EV_TXEMPTY | EV_CTS))
{
if (GetCommState(m_hDevice, &m_dcbComm))
{
m_dcbComm.fRtsControl = RTS_CONTROL_ENABLE;
//m_dcbComm.fRtsControl = RTS_CONTROL_DISABLE;
//m_dcbComm.fDtrControl = DTR_CONTROL_ENABLE;
if (BuildCommDCB(szBaud, &m_dcbComm))
{
if (SetCommState(m_hDevice, &m_dcbComm))
{
PurgeComm(m_hDevice, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
m_hCommThread = CreateThread(NULL, 0, _CommThread, this, 0, &m_dwCommThreadID);
bResult = (m_hCommThread != NULL) ? TRUE : FALSE;
}
}
}
}
}

LeaveCriticalSection(&m_csCritical);

if (!bResult)
CloseDevice();
else
m_bThreadAlive = TRUE;

return bResult;
}
auly403 2005-04-02
  • 打赏
  • 举报
回复
mark
legendhui 2005-04-02
  • 打赏
  • 举报
回复
不知道楼主的问题解决了没有。如果没有可以看看我的建议,应该不会白看的。。。
楼主如果用MSCOMM32.ocx控件的话,就不会有这个问题了。
如果用CreateFile(。。。)来打开串口的话,其中参数lpszPortNum指的就是串口名,如
"COM1","COM2",。。。,"COM9"。
为什么只到"COM9",因为从"COM10"以后名字不一样了。
如串口10,对应的参数为"\\\\.\\COM10",
至于串口11以后的,我就不说了,楼主应该能想到了。。。。
至于要枚举出一台机子得所有串口,楼上回答过这个问题,我不说了。。。

16,551

社区成员

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

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

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