请教一个串口问题!比较奇怪。 我写了一个串口测试程序,本来一直没什么问题得,可今天在测试通道得时候,居然发现只要串口名称大于9也就是COM10及其以上得都说打开失败。很郁闷,不知道是为什么!用超级终端打开是没问题得!还请高手指教!另外想问一下:怎么枚举出一台机子得所有串口啊?谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我打开串口得方法是:CreateFile(lpszPortNum, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL))==(HANDLE)-1)请各位帮忙啊 不知道楼主的问题解决了没有。如果没有可以看看我的建议,应该不会白看的楼主如果用MSCOMM32.ocx控件的话,就不会有这个问题了。如果用CreateFile()来打开串口的话,其中参数lpszPortNum指的就是串口名,如"COM1","COM2",,"COM9"。为什么只到"COM9",因为从"COM10"以后名字不一样了。如串口10,对应的参数为"\\\\.\\COM10",至于串口11以后的,我就不说了,楼主应该能想到了。至于要枚举出一台机子得所有串口,楼上回答过这个问题,我不说了 xx是否与串口的输入输出范围有关03F8-03FF 我使用了一个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; } 请问一下无法解析的外部符号的问题? 多文档视图分割后,如何为每个视图添加滚动条 诡异的内存问题! dynamic_cast为什么运行不正常? STATIC控件,在Dlg的初始化的时候,设定好了此控件的位置在屏幕的正中间,但是在后来刷新的时候,位置偶尔会移到左上角。 ListCtrl 如何添加一个自定义的项(类似自定义的VIEW) CreateProcess问题 想用OpenGL作界面,求教。 Win32下的MessageBox如何定位在屏幕的任一区域? VC真是垃圾 介绍一个加快开发效率的方法 XP下一个VC技巧
CreateFile(lpszPortNum,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL))==(HANDLE)-1)
请各位帮忙啊
楼主如果用MSCOMM32.ocx控件的话,就不会有这个问题了。
如果用CreateFile()来打开串口的话,其中参数lpszPortNum指的就是串口名,如
"COM1","COM2",,"COM9"。
为什么只到"COM9",因为从"COM10"以后名字不一样了。
如串口10,对应的参数为"\\\\.\\COM10",
至于串口11以后的,我就不说了,楼主应该能想到了。
至于要枚举出一台机子得所有串口,楼上回答过这个问题,我不说了
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;
}