【发布时间】:2011-11-01 14:03:14
【问题描述】:
我正在Delphi中创建一个简单的程序,使用2个参数通过COM端口发送字符,第一个参数是端口号,第二个参数是要发送的字符。因此,如果我将其保存为 p.exe,“p.exe 20 A”将通过 COM20 发送“A”。
try
PhoneNumber := ParamStr(2);
if(StrToInt(ParamStr(1))>=10)then
CommPort := '\\.\COM'+ParamStr(1)
else
CommPort := 'COM'+ParamStr(1);
hCommFile := CreateFile(PChar(CommPort),
GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if hCommFile=INVALID_HANDLE_VALUE then begin
ShowMessage('Unable to open '+ CommPort);
end;
if WriteFile(hCommFile, PChar(PhoneNumber)^, Length(PhoneNumber),NumberWritten, nil)=false then
showmessage('Unable to send');
PurgeComm(hCommFile,PURGE_TXCLEAR);
FlushFileBuffers(hCommFile);
CloseHandle(hCommFile);
Application.Terminate;
except
PurgeComm(hCommFile,PURGE_TXCLEAR);
FlushFileBuffers(hCommFile);
Application.Terminate;
end;
我还使用具有相同 COM 号 baudrate=9600, flow_control=none 的超级终端,它给出了相同的结果。角色发送良好。 问题是,每次登录 Windows XP 时,在执行以下步骤之前,我都无法运行我的程序 (p.exe): 通过超级终端连接到指定的 COM, 断开它。 然后我的可执行文件可以运行。否则,就像您在同一个 COM 中运行两个超级终端会话一样,它不会工作。有人对此有提示吗?我是否遗漏了代码中的任何内容?
【问题讨论】:
-
+1 用于使用超级终端进行健全性检查。
-
所以“不起作用”,您是否收到“无法打开...”错误、“无法发送”或什么?
-
波特率需要使用 setcommstate。
-
您的异常处理程序在写入之前读取
hCommFile。如果第一个命令行参数不是数字,则清除并刷新无效句柄。此外,如果CreateFile失败,您将继续使用hCommFile,即使它是Invalid_Handle_Value。 -
您假设将使用什么波特率、奇偶校验和流量控制(硬件/软件/关闭)设置?如果您对串口完全不熟悉,我建议您使用一个组件(TComPort 或 AsyncPro)。
标签: delphi serial-port hyperterminal