发布"多串口设备监控系统"通信软件,来者有分 (300分)

是不是可以给每个端口一些标志性的描述,不然开多了会头疼的,
 
to:SS2000
有些usb模拟的串口,spcomm不支持//就是没有 '//./' 的原因
我遇到的一款是这样的。
在注册表中,和设备管理中,是COM4
但是必须要用//./COM4去访问。
CreateFile没问题。但spcomm给的参数少了'//./'

对于系统的某些设备 文件名应+'//./'

对于串口的CreateFile本来就应+'//./',只是作者偷懒了。


 
联想的机子的串口问题,我在一家医院也碰过。
还有多串口卡的问题。//有时不稳
 

to: hfghfghfg

>>对于串口的CreateFile本来就应+'//./',只是作者偷懒了。

你这个逻辑好像不对,如果说对于串口的CreateFile本来就应+'//./',那就说明了Windows的API调用
就是要求你传入'//./COM4'才可以,而不是'COM4',对吧。我们可以假设一下,我原来都是直接用Windows
的API函数做串口,每次我都知道,应该传入'//./COM4',而不是'COM4'。有一天,我觉得还是用控见省事,
于是我找到了SPCOMM,里面有一个属性CommName,你说我这时该给他'//./COM4'呢,还是'COM4'?
你觉得这个'//./',到底是由SPCOMM加还是你自己加好。
如果要SPCOMM加,我觉得干脆连'COM'一起加'//./COM',我们就传入一个整数(4),岂不更好?
 
to: 不知道_0909
你不会是开了256个串口吧,我之所以有256的选项,是为了表明我的软件有能力支持N个,当然Window只支持256,
我就最高是256个了。只要Windows能支持1024个,我也可以支持1024个,程序不用改任何代码,呵呵。
你的建议可以考虑,不过我认为没有多大用,看看别人怎么认为吧。
 
很普通的软件
没什么
我做串口监视软件不会用spcomm的
它的实时性不是很好
 
to: 常常
看来遇到高人了

>>很普通的软件
确实是普通的软件,不是很稀奇的东西,我的宗旨就是实用!

>>我做串口监视软件不会用spcomm的,它的实时性不是很好
我还真没有发现它的实时性不好,能否指教一二?
 
to:SS2000
你看看其他的串口控件,如 CPort 等 就知道了
+'//./' 是指对于设备。
COM1 应为 //./COM1 这就是标准的写法啊。
//相对路径 和 绝对路径 的关系
//当然你用相对路径COM1也可以。不过我习惯用绝对路径

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


还有多串口


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}


 
想当初,用示波器调试多串口卡时,好辛苦。
 
在我的电脑上测试是收不到数据的。我用的波特率是115200,你的怎么不能设置?
有些地方还不够专业,象“间隔时间”、“等待时间”输入框里怎么还可以输入除数字之外的字符。
 
to: hfghfghfg
关于'//./'问题,我看不用讨论了,各有各的看法,各有各的用法,已经很清楚了。顺便说一句,'//./'是Windows NT
下的问题,Windows 9x没有这样的问题。
你的
>>实时性是因为
// Wait for more new data.
if not SetupReadEvent(@overlappedRead,
szInputBuffer, INPUTBUFFERSIZE,
nNumberOfBytesRead) then
goto EndReadThread
{break;}

不知道有什么问题。

>>还有多串口
多串口有什么问题?
 
spcomm在收到数据是要// Wait for more new data.
当数据连续时就。。。。。。
所以不适合做实时监控,但这是她的一个与众不同的优点。

多串口:=多串口卡的问题。//某些型号
用多串口卡的自带的测试程序,就很稳。
但是用spcomm就会不稳。

所以把这里改了
HandlesToWaitFor[0] := hCloseEvent;
HandlesToWaitFor[1] := overlappedRead.hEvent;

这只是对于我用的那款多串口卡








 
to: c~c

谢谢你的指正,笔误把115200写成了112000了,不好意思。
>>有些地方还不够专业,象“间隔时间”、“等待时间”输入框里怎么还可以输入除数字之外的字符。
确实指正的好,专业软件是应该避免的,不过主要是做的太仓促,漏掉了这个细节,其实在其它地方
我都是屏蔽了的。不过即使你乱输,我的程序不不会被你搞死,对吧 :) 。其实我在很多环节都做了
数据有效性处理,所以,虽然漏掉了输入环节的控制,还有其它处理,保证我的程序有效性。
多谢你的指正,如果你想要注册码,告诉我email。
 
发布1.0.0.2:修改错误把波特率115200写成112000的问题,可以自定义速率。
 
监控串口通信的话,不应该这么做吧
应该是HOOK来做吧?
如果你这样做,不如就串口通信软件

我也在做这个叱
 
to: hfghfghfg

啊啊,原来你屏蔽掉了overlappedCommEvent.hEvent,原来如此。
其实这正说明了你的那块多串口卡的驱动有问题。我前面提到的就是这样,我的那块多串口卡有时就莫
名其妙的出现overlappedCommEvent.hEvent这个事件,而且没完没了,导致无法正常工作,当然,除非
你不理会overlappedCommEvent.hEvent事件。事实证明,是他们驱动有问题,从理论上分析,这也是多
串口卡的BUG,把它算到SPCOMM头上,太冤枉SPCOMM了。只能说你的那块多串口卡不能再SPCOMM的工作方
式(异步)下正常工作,(只能在同步下工作?)而这种工作方式是Window提供的标准方式之一,是没有
问题的。说不定你升级一下串口驱动就好了。


>>spcomm在收到数据是要// Wait for more new data.
>>当数据连续时就。。。。。。
>>所以不适合做实时监控,但这是她的一个与众不同的优点。

你说得不错,这是它的优点,当有连续数据时,我们当然希望是收完了一起给我们,难道你希望它一个一个
字符给我们,来一个给一个?当然,如果你强调实时性,非要一个一个的收,来一个字符就必须处理一个字符,
那也是没有问题的,只是我想问一下,如果不用SPCOMM,直接用Window API,你怎么做。如果WindowAPI做不了,
那就没有一个控件能做,对吧。当然,Window API做得了,SPCOMM也做得了。就是设置ReadTotalTimeoutMultiplier,
ReadTotalTimeoutConstant,ReadIntervalTimeout这3个属性的之就可以了。具体的说,就是
ReadIntervalTimeout := MAXDWORD;
ReadTotalTimeoutMultiplier := MAXDWORD;
ReadTotalTimeoutConstant := MAXDWORD-1;
包管你来一个字符处理一个字符,没有任何延时。
如果说你和常常是这样看SPCOMM的实时性问题,我想是你们的误解。
 
to:SS2000
我试了一下你的东东,接收数据的时候显示出来的是ASCII字符串。我建议你多一个显示16进制原码的功能。其实就是 inttohex(ord(inchar))。这条建议实用吧。

to:hfghfghfg
大侠,看了你的文章感觉你对串口通讯的研究很深。我想请教你,如何实现全双工的串口通讯。我前段时间也在写串口程序。我为读串口建立线程,用ClearCommError检测串口状态,读取数据。但是一旦同步执行写串口操作,程序就会异常中断。后来只好在执行写操作之前强行终止线程。搞成了异步方式。请教高手问题出在哪里?如何解决?
 
To: KervenLee

>>监控串口通信的话,不应该这么做吧
你搞错了,我不是监控"串口通信",我的软件名叫“多串口设备监控系统”,呵呵,这可能有误解。
我的软件原意是"监控(多)连接到串口上的设备"。不是监控串口自己这个设备,呵呵,误解。
你做的是什么,不妨交流交流。
 
to lixiaoxi:
>>我试了一下你的东东,接收数据的时候显示出来的是ASCII字符串。我建议你多一个显示16进制原码的功能。其实就是 inttohex(ord(inchar))。这条建议实用吧。
你的建议确实实用,可是这是我已有的功能呀,你没有看到 :(
 
to:SS2000

hehe ~~~ 实在不好意思。我没注意到。
但是我发现你从设备传回的数据显示比实际上的回传不一致。我设备明明回传的是5个字符,但是你显示出来的只有2个字符。不知道是不是你在处理某变量的时候出问题了??
 

Similar threads

X
回复
0
查看
519
xalion
X
回复
0
查看
585
不得闲
回复
0
查看
862
不得闲
X
回复
0
查看
862
xalion
X
顶部