我用CSerialPort串口类做通讯程序,我用注册表得到我想要的串口号,例如是COM3。并在CCombobox的下拉列表中显示出来,当我选中COM3后,点打开串口按钮,总是显示:未发现此串口。我把我的按钮程序粘贴在下面,请大家指教指教我这个菜鸟。本人分很少请大家见谅O(∩_∩)O~
void CPropPageReaddate::OnButton1()
{
// TODO: Add your control notification handler code here
int index;
CString str;
index=m_memoCOM.GetCurSel();//得到当前是第几项
if(index==CB_ERR)
{
MessageBox("没有串口被选中");
return;
}
m_memoCOM.GetWindowText(str); char m_cParity;
DWORD m_dwCommEvents;
m_cParity='N';
m_dwCommEvents = EV_RXFLAG | EV_RXCHAR;
if (m_Port.InitPort(this, index+1, 9600,m_cParity,8,1,m_dwCommEvents,512))
{
m_Port.StartMonitoring();//启动串口监视线程
str.Format("串口%d已经准备好,请发送数据…………",index+1);
char *szout;
szout=str.GetBuffer(str.GetLength());//把str这个字符串转换成char型的数组
m_List1.AddString(szout);//添加一个字符串到列表中
char aa[20]=" ";
sprintf(aa,"串口%d已经打开",index+1);//在按钮上写字儿,打印一个字符串保存在aa中
m_openCOM.SetWindowText(aa);//更新按钮字
}
else
{
str.Format("没有发现此串口%d…………",index+1);
char *szout;
szout=str.GetBuffer(str.GetLength());
MessageBox(szout);
}
}
void CPropPageReaddate::OnButton1()
{
// TODO: Add your control notification handler code here
int index;
CString str;
index=m_memoCOM.GetCurSel();//得到当前是第几项
if(index==CB_ERR)
{
MessageBox("没有串口被选中");
return;
}
m_memoCOM.GetWindowText(str); char m_cParity;
DWORD m_dwCommEvents;
m_cParity='N';
m_dwCommEvents = EV_RXFLAG | EV_RXCHAR;
if (m_Port.InitPort(this, index+1, 9600,m_cParity,8,1,m_dwCommEvents,512))
{
m_Port.StartMonitoring();//启动串口监视线程
str.Format("串口%d已经准备好,请发送数据…………",index+1);
char *szout;
szout=str.GetBuffer(str.GetLength());//把str这个字符串转换成char型的数组
m_List1.AddString(szout);//添加一个字符串到列表中
char aa[20]=" ";
sprintf(aa,"串口%d已经打开",index+1);//在按钮上写字儿,打印一个字符串保存在aa中
m_openCOM.SetWindowText(aa);//更新按钮字
}
else
{
str.Format("没有发现此串口%d…………",index+1);
char *szout;
szout=str.GetBuffer(str.GetLength());
MessageBox(szout);
}
}
下面是寻找串口的函数
int CPropPageReaddate::GetSeriNum()
{
int reg;
// CStringArray strCommArr;
HKEY hKey;
int rtn;
//m_cmbComm.ResetContent();
rtn = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Hardware\\DeviceMap\\SerialComm",
NULL, KEY_READ, &hKey); // 打开串口注册表
if( rtn == ERROR_SUCCESS)
{
int i=0;
char portName[256],commName[256];
DWORD dwLong,dwSize;
while(1)
{
dwSize = sizeof(portName);
dwLong = dwSize;
rtn = RegEnumValue( hKey, i, portName, &dwLong,
NULL, NULL, (PUCHAR)commName, &dwSize );
//
if( rtn == ERROR_NO_MORE_ITEMS ) // 枚举串口
{
break;
}
// strCommArr.Add(commName);
m_memoCOM.AddString(commName);
i++;
}
reg=i;
}
RegCloseKey(hKey);
return reg;
}
请大家指教。是不是这个COM口得存到CCombobox里啊?怎么存呢?
this 指针对吗?是串口拥有者的CWnd* pWnd
你的串口有没有被其它程序 占用呢 ,有没有这个串口呢
跟踪到InitPort函数里边进去,看看那个地址返回错了呢。
中的参数值分别为index=1,m_cParity=78'N',m_dwCommEvents=3(但是这个3在信息区显示是红色的),我的com口就是COM3。所以我觉得函数传递应该是对的吧?
中的参数值分别为index=1,m_cParity=78'N',m_dwCommEvents=3(但是这个3在信息区显示是红色的),我的com口就是COM3。所以我觉得函数传递应该是对的吧? 你的COM 口是 3 那么 InitPort 第二个参数是 3才对啊,而不是 INDEX +1 等于 2 啊,你说对不?
str = str.Right(1);
m_nCom = atoi(str);
//以 9600 COM 1 打开串口
if (m_SerialPort.InitPort(this, m_nCom,
if(index==CB_ERR)
{
MessageBox("没有串口被选中");
return;
}你自动查找串口后,确实没有看到你有操作过CCombox你确定你自动查找到的Comname和你CCombox选择的Comname是一致的么?自动查找串口后比较combox中的候选项,然后选中匹配项。