用delphi开发串口通讯程序,使用spcomm组件(100分)

  • 主题发起人 主题发起人 flyupwards
  • 开始时间 开始时间
F

flyupwards

Unregistered / Unconfirmed
GUEST, unregistred user!
各位好:
我用delphi开发串口通讯程序,使用spcomm组件,前面判断打开端口的语句为:
if Not CommHasOpen then
begin
Comm1.StopComm;
Comm1.StartComm;
CommHasOpen:=true;
end;

将数据写入端口代码为:
GetMem(tmp,1);
HexStrToBytes('0F',tmp);
if Comm1.WriteCommData(tmp,1) then 。。。
else。。。
但总是执行else语句,也就是说,写数据失败,请问这是为什么?如何处理?
 
首先无需再多一个变量
if comm1.handle=0 then
begin
comm1.startcomm;
end;

试试这样:
buff:array[0..1024]of char;
buff[0]:=#$0f;
if comm1.writecommdata(buff,1) then
begin
end
else
begin
end;
我的程序中就是这么用的,没问题
 
spcomm控件从哪里能获得?谢谢!还有串口的效率有多高[:D]
 
各位:
后经反复测试,并参阅csdn有关介绍,发现在打开端口之后,发送写数据(writecommdata)
之前,须加上延时设定,代码只用一句:sleep(10);就能够发送写数据成功,也许和本人
所用的硬件设备有关,尚需延时。

谢谢budware的参考代码。

另外,尚有新的问题,就是根据协议规定:
一。首先计算机发送f0到串口设备(巡更机)
二。串口设备用0f作为应答
三。计算机需要再发送一个00字节,串口设备据计算机发送的这个字节,发回8个字节的数据
作为回应,分别表示 秒、分、时、日、月、星期、年、及CRC校验共八个字节,并通过
onreceivedata中的buffer参数接收,但每次收到的长度不定,有时是8个字节,有时是
10个字节,有时是9个字节,而且读出的时间形如 2005年62月10日66点41分06秒星期三

我想请问各位,8个字节的长度不对,需要考虑哪些方面,就协议本身来讲,并不是太复杂,
而spcomm控件,很多东西已被封装。是缓存的事吗?如何处理?如果不是,问题又在哪里?

谢谢各位观注!!

关于苍蝇拍子所所问的spcomm.zip从哪里下载,我记不清从哪下的了,可以在雅虎上用spcomm
关键字查询,一样可以查到的,至于效率问题,尚在试用



 
经查,spcomm内设缓存为2048,时间间隔为20ms,似乎不是这方面问题。

又经测试,收到的字节的数据如下,按协议应为八个,且数据为正确的时间值,现在看来,
字节个数不对,数据值也不正确。
... ...
Length: 9, 04 10 06 41 66 50 60 a2 6b //第n次测试
Length:10, 06 41 66 10 62 03 05 21 15 f8 //第n+1次
... ...
据协议分析,后两位数是多出来的两位,各位对应的值据协议似乎应当是如下示:
秒 时 分 日 月 周 年 crc校验值 后两位a2 6b,或15 f8数值可能有问题的数。
即 2005年3周62月10日66分41时06秒




 
与许是吧,
我的程序是通过串口与一块C51的单片机通讯,不用什么延时,通讯正常。

从你的数据来看,怀疑有以下情况:
1、你的波特率与下位机的不完全一致,可能差别大于5%
2、与下位机握手的时序有问题,你得到的是两批数据,且数据残缺,
这么认为是请看:
Length: 9, 04 10 06 41 66 50 60 a2 6b //第n次测试
Length: 10, 06 41 66 10 62 03 05 21 15 f8 //第n+1次
3、下位机的协议发生变化

你可以试试:
1、修改Timeouts中的参数,好象是readintervaltimeout、xxxconst之类的属性,
对不起,我这没有环境。
2、微调上位机波特率,看所得数据有什么变化
3、将采数间隔加大或缩小
4、与下位机设计者联系,取得最新协议

苍蝇拍子:
spcomm的效率并不是很高,不过比mscomm强多了,对一般应用足够了。
好象www.inprises.com上就有
 
budware 说的对,你可看你系统的时钟频率,若有差别,可适当调换一下.
或发送时每一个数据适当做一下延迟.
 
感谢budware,ghg_qh及大家的支持:

现已将相关情况发邮件到下位机供应商处,另

*需要说明的是,接到的十或九个字节,原来取的为前八个字节,此后,取值按从后前数八个字节处理。

经修改,时间间隔(readintervaltimeout属性),
原来为:100 设为:20后,变为:
20102年50月66日41时06分10秒 星期
关闭程序,重新运行后:
2065年05月03日62时10分66秒 星期
又设为:200 :
20102年50月66日41时06分10秒 星期

波特率调为9600+或-(9600*5%),即9600*(1+5%)=10100;9600*(1-5%)=9100;
分别设为:10100或9100后,readtimeout仍按默认值100,结果为:
2065年05月03日62时10分66秒 星期
 
非常感谢各位大侠,我已经找到这个控件啦,但是效率问题是一个非常严重的问题,如果过不了
M级,恐怕他的应用范围会很窄的,并口的效率听说可以达到4M,有没有这方面的资料?
还有,听说有一家公司出一个硬件串口,可以达到10/100M,有这种可能吗?
 
[:)]感谢大家的支持与帮助,问题已经解决,后来的问题,是供应商的硬件不稳定造成,谢谢参与!!
 
后退
顶部