一:不知道大家是否使用过专业串口调试工具sscom,作者:丁丁,最新 版本下载地址:http://www.mcu51.com/download/sscom.rar
这个软件有个小功能小弟不知道如何用Delphi实现,就是在选择串口号的ComboBox里,它会自动罗列本地所有可用的串口号,而且,即使是正在被其他程序占用的串口号也罗列其中,如何实现,请各位大虾指点;二:我选用的串口控件是SPComm,目前我的理解是:发送数据是WriteCommData函数,接收数据是OnReceiveData的事件,那么,如何实现一种情况:串口每隔10秒发送一个数据,在接下来5秒内串口收到响应,否则提示出错。令小弟不解的是OnReceiveData是一个事件,如何确定这个事件里收到的响应内容能与发的内容相对应呢?PS:小弟初学Delphi,可能在很多大虾眼里所提问的问题非常简单,甚至是非常愚蠢,但是,请大虾们高抬贵手,指点一二,小弟不甚感激,祝愿给予小弟帮助的朋友,事业上步步高升,生活上美满幸福,身体健康,万事如意!
这个软件有个小功能小弟不知道如何用Delphi实现,就是在选择串口号的ComboBox里,它会自动罗列本地所有可用的串口号,而且,即使是正在被其他程序占用的串口号也罗列其中,如何实现,请各位大虾指点;二:我选用的串口控件是SPComm,目前我的理解是:发送数据是WriteCommData函数,接收数据是OnReceiveData的事件,那么,如何实现一种情况:串口每隔10秒发送一个数据,在接下来5秒内串口收到响应,否则提示出错。令小弟不解的是OnReceiveData是一个事件,如何确定这个事件里收到的响应内容能与发的内容相对应呢?PS:小弟初学Delphi,可能在很多大虾眼里所提问的问题非常简单,甚至是非常愚蠢,但是,请大虾们高抬贵手,指点一二,小弟不甚感激,祝愿给予小弟帮助的朋友,事业上步步高升,生活上美满幸福,身体健康,万事如意!
//检测串口
var
KeyHandle: HKEY;
ErrCode, Index: Integer;
ValueName, Data: string;
ValueLen, DataLen, ValueType: DWORD;
TmpPorts: TStringList;
begin
ErrCode := RegOpenKeyEx(
HKEY_LOCAL_MACHINE,
'HARDWARE\DEVICEMAP\SERIALCOMM',
0,
KEY_READ,
KeyHandle); if ErrCode <> ERROR_SUCCESS then
Exit; // raise EComPort.Create(CError_RegError, ErrCode); TmpPorts := TStringList.Create;
try
Index := 0;
repeat
ValueLen := 256;
DataLen := 256;
SetLength(ValueName, ValueLen);
SetLength(Data, DataLen);
ErrCode := RegEnumValue(
KeyHandle,
Index,
PChar(ValueName),
Cardinal(ValueLen),
nil,
@ValueType,
PByte(PChar(Data)),
@DataLen); if ErrCode = ERROR_SUCCESS then
begin
SetLength(Data, DataLen);
TmpPorts.Add(Data);
Inc(Index);
end
else
if ErrCode <> ERROR_NO_MORE_ITEMS then
exit; //raise EComPort.Create(CError_RegError, ErrCode); until (ErrCode <> ERROR_SUCCESS); TmpPorts.Sort;
Ports.Assign(TmpPorts);
finally
RegCloseKey(KeyHandle);
TmpPorts.Free;
end;end;
接收的数据怎么对应?你总得有个通讯协议吧,按照协议来啊
“如何确定这个事件里收到的响应内容与发的内容相对应呢?”你发了命令后,就要等待串口响应(工控中的应用基本都是一应一答的),收到响应后,解释收到的内容,就知道是不是和发的相对应了吧。