各位CB,关于串口的有关问题
各位CB高手请进,关于串口的问题。
我创建了一个ComboBox控件,然后存入COM1,COM2,COM3三个串口号。
如果计算机上COM3没有或者正在使用,我希望的是当选中COM3,立即弹出对话框报错。
char *cComNo;
int iComNo = 0;
iComNo = Form1->CSerialPortNum->ItemIndex;
iComNo = iComNo+1;
switch(iComNo)
{
case 1:
cComNo = "COM1:"; break;
case 2:
cComNo = "COM2:"; break;
case 3:
cComNo = "COM3:"; break;
}
hComm = CreateFile(cComNo,GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hComm == INVALID_HANDLE_VALUE) // 如果COM 未打开
{
MessageBox(0,"打开端口错误!","Error",MB_OK);
}
这个就是控件中内容改变时的代码。
现在的问题就是,当选择的次数貌似超过3次,就报错了,不管是你是不是选择的可用的串口。
怎么回事啊???新手急救~~~~~~
------解决方案--------------------
是不是打开后,没有关闭,串口不能重复打开。
------解决方案--------------------
每次打开后 需要关闭
CloseHandle(cComNo); 后才能打开
或者你在打开前进行判断一下
//判断串口是或打开
bool __stdcall IsOpen()
{
return cComNo!= INVALID_HANDLE_VALUE;
}
返回true 就说明你打开着,需要关系 才能再次打开
------解决方案--------------------
没关闭
------解决方案--------------------
请关闭了再来。
------解决方案--------------------
给段Delphi枚举系统串口的代码自己改一下咯
我创建了一个ComboBox控件,然后存入COM1,COM2,COM3三个串口号。
如果计算机上COM3没有或者正在使用,我希望的是当选中COM3,立即弹出对话框报错。
char *cComNo;
int iComNo = 0;
iComNo = Form1->CSerialPortNum->ItemIndex;
iComNo = iComNo+1;
switch(iComNo)
{
case 1:
cComNo = "COM1:"; break;
case 2:
cComNo = "COM2:"; break;
case 3:
cComNo = "COM3:"; break;
}
hComm = CreateFile(cComNo,GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hComm == INVALID_HANDLE_VALUE) // 如果COM 未打开
{
MessageBox(0,"打开端口错误!","Error",MB_OK);
}
这个就是控件中内容改变时的代码。
现在的问题就是,当选择的次数貌似超过3次,就报错了,不管是你是不是选择的可用的串口。
怎么回事啊???新手急救~~~~~~
------解决方案--------------------
是不是打开后,没有关闭,串口不能重复打开。
------解决方案--------------------
每次打开后 需要关闭
CloseHandle(cComNo); 后才能打开
或者你在打开前进行判断一下
//判断串口是或打开
bool __stdcall IsOpen()
{
return cComNo!= INVALID_HANDLE_VALUE;
}
返回true 就说明你打开着,需要关系 才能再次打开
------解决方案--------------------
没关闭
------解决方案--------------------
请关闭了再来。
------解决方案--------------------
给段Delphi枚举系统串口的代码自己改一下咯
- Delphi(Pascal) code
procedure TComSet.FormCreate(Sender: TObject); var R:TRegistry; St:TStringList; i: Integer; begin R:=TRegistry.Create; St:=TStringList.Create; R.RootKey:=HKEY_LOCAL_MACHINE; R.OpenKey('\Hardware\DeviceMap\SerialComm',false); R.GetValueNames(St); for i:=0 to St.Count-1 do SelPort.Items.Add(R.ReadString(St.Strings[i])); R.Free; St.Free; end;