USB转串口(使用spcomm)问题

starwang 2005-12-02 09:22:28
使用usb转串口的设备,用spcomm控件直接向串口发送、接收数据。
打开串口时出现错误“File handle is not a comm handle”;
我将spcomm源代码中的以下语句封掉
if GetFileType( hNewCommFile ) <> FILE_TYPE_CHAR then
begin
CloseHandle( hNewCommFile );
raise ECommsError.Create( 'File handle is not a comm handle ' )
end;

此后,startcomm可以通过,使用WriteCommData发送数据也没有报错,但是却无法接收到数据。
请问是什么问题呀!
...全文
719 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tetsuya 2006-04-04
  • 打赏
  • 举报
回复
驱动没有装好.
chinawzg 2006-04-04
  • 打赏
  • 举报
回复
我也用过没有任何问题呀
chenquan 2006-03-14
  • 打赏
  • 举报
回复
我正调试串口程序
我用的是台湾的USB->COM
没有问题
wang2f 2006-03-13
  • 打赏
  • 举报
回复
用力特(Z-TEK)的,肯定行
Chudengxiong 2006-03-03
  • 打赏
  • 举报
回复
我用过了,用台湾产的还行,不过也要测试一下
aiirii 2005-12-28
  • 打赏
  • 举报
回复
其实,我也试过,部分老式的 usb2com 存在 ffwin说的情况, 所有,如果还不行,估计就是有问题了,你可以先用 超级终端 试下
xiangdie 2005-12-28
  • 打赏
  • 举报
回复
我试了下aiirii的代码,还是通不上啊
xiangdie 2005-12-28
  • 打赏
  • 举报
回复
aiirii,能说说你那样改的原理吗?为什么要把第二个挂起事件的所有代码去掉?我看源程序里有两个TOverlapped变量,谢谢!
xiangdie 2005-12-28
  • 打赏
  • 举报
回复
我也出现过FFwin的情况,最后终于找到一种是一个台湾生产的USB转串口线,但现在用户买的都是普通的,所以一直在寻找软件解决办法,我试过,普通USB能发出命令,且对方能收到,就是收不到对方发回的信号,可能是信号太弱。
 不知谁解决没,aiirii的方法确认能接收到吗?
ffwin 2005-12-05
  • 打赏
  • 举报
回复
我可以很负责任的告诉你,市场上的USB转串口只有一家能用,95%以上全是假的,根本就不是USB转串口,所以才会出现你说的这种提示,我曾经为了买一个能用的,拿的电脑在电脑市场买了两天,把我系统给搞崩了(这就是中国特色的电脑配件,全是不负责任的人开发的程序,所谓自己驱动首先占用了端口,那别的应用程序如何进行通讯,这也能叫驱动程序吗?),才买到一个真的,之前我曾在2001年左右用过一个真的,现在的很难买到真的,仔细找一找,如果想知道是什么牌子,请楼主UP一下
aiirii 2005-12-05
  • 打赏
  • 举报
回复
spcomm支持usb to com以及多串口卡的修改
procedure TComm.StartComm;
var
hNewCommFile: THandle;
begin
// Are we already doing comm?
if (hCommFile <> 0) then
raise ECommsError.Create('This serial port already opened');

hNewCommFile :=
CreateFile(PChar('\\.\' +FCommName),
GENERIC_READ or GENERIC_WRITE,
0, {not shared}
nil, {no security ??}
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,
0 {template});

procedure TReadThread.Execute;
var
szInputBuffer: array[0..INPUTBUFFERSIZE - 1] of Char;
nNumberOfBytesRead: DWORD;

HandlesToWaitFor: array[0..1] of THandle;
dwHandleSignaled: DWORD;


// Needed for overlapped I/O (ReadFile)
overlappedRead: TOverlapped;

label
EndReadThread;
begin
FillChar(overlappedRead, Sizeof(overlappedRead), 0);

// Lets put an event in the Read overlapped structure.
overlappedRead.hEvent := CreateEvent(nil, True, True, nil);
if overlappedRead.hEvent = 0 then
begin
PostHangupCall;
goto EndReadThread
end;


// We will be waiting on these objects.
HandlesToWaitFor[0] := hCloseEvent;
HandlesToWaitFor[1] := overlappedRead.hEvent;

// Setup CommEvent handling.

// Set the comm mask so we receive error signals.
if not SetCommMask(hCommFile, EV_ERR or EV_RLSD or EV_RING) then
begin
PostHangupCall;
goto EndReadThread
end;

// Start waiting for Read events.
if not SetupReadEvent(@overlappedRead,
szInputBuffer, INPUTBUFFERSIZE,
nNumberOfBytesRead) then
goto EndReadThread;

// Keep looping until we break out.
while True do
begin
// Wait until some event occurs (data to read; error; stopping).
dwHandleSignaled := WaitForMultipleObjects(2, @HandlesToWaitFor,
False, INFINITE);

// Which event occured?
case dwHandleSignaled of
WAIT_OBJECT_0: // Signal to end the thread.
begin
// Time to exit.
goto EndReadThread
end;

WAIT_OBJECT_0 + 1: // CommEvent signaled.
begin
// Get the new data!
if not HandleReadEvent(@overlappedRead,
szInputBuffer,
INPUTBUFFERSIZE,
nNumberOfBytesRead) then
goto EndReadThread;

// Wait for more new data.
if not SetupReadEvent(@overlappedRead,
szInputBuffer, INPUTBUFFERSIZE,
nNumberOfBytesRead) then
goto EndReadThread
{break;}

end;

WAIT_FAILED: // Wait failed. Shouldn't happen.
begin
PostHangupCall;
goto EndReadThread
end
else // This case should never occur.
begin
PostHangupCall;
goto EndReadThread
end
end {case dwHandleSignaled}
end; {while True}

// Time to clean up Read Thread.
EndReadThread:

PurgeComm(hCommFile, PURGE_RXABORT + PURGE_RXCLEAR);
CloseHandle(overlappedRead.hEvent);
end; {TReadThread.Execute}
魏莹 2005-12-05
  • 打赏
  • 举报
回复
我的usb-com椰油问题
cjf1009 2005-12-02
  • 打赏
  • 举报
回复
转的com口和自带的com口是一样的。
我觉得是你设备的问题
ly_liuyang 2005-12-02
  • 打赏
  • 举报
回复
我用的就没有任何问题
U口的COM,其实一样使用的
zwm09 2005-12-02
  • 打赏
  • 举报
回复
我也是用同样设备,将USB口多插拔几次就好了。另外看看USB设备属性对应的是COM几

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧