主  题:串口通信问题:怀疑MSCOMM的接收数据能力有问题!!!

caifei9999 2001-12-17 09:43:37

作  者:caifei9999
所属论坛:Delphi
问题点数:23
回复次数:4
人气指数:29
发表时间:2001-12-16 22:46:38

主  题:300分送上:在DELPHI中调用MSCOMM???

问题:在DELPHI中调用MSCOMM,通过MODEM传送二进制文件。在38。4K和57。6K的速率 下,收端会丢失二进制数据,附程序代码,请各位高手指教!!!!
我怀疑MSCOMM在高速下接收会丢失数据,请各位证实。
问题附加解释:
1:串口波特率在38。4K和57。6K的速率下丢失数据,在19。6K、9。6K速率下发送接收稳定,不丢数据。
2:串口已经设置为二进制方式、RTS流量控制方式。
3:发送和接收之间采用类似与1KXMODEM协议。即发方发1039字节数据后,等待收方响应,收到收方确定响应,才发送下一帧。
4:不知道我发送/接收的方式是否对,请各位高手指教!!!
5:加大或减小comm1.InBufferSize 、comm1.OutBufferSize 不起作用;

下面为三段代码:1:接收代码;2:发送代码;3:对串口和MODEM的设置。
我的信箱地址为:caifei9999@263.net



1:接收代码:
procedure TForm1.Comm1Comm(Sender: TObject);
var
inputlength:integer;
p:POleVariant;
btest:olevariant;
begin
//收到 Rthreshold 个字符。该事件将持续产生直到用 Input 属性从接收缓冲区中删除数据。
if (comm1.CommEvent=2) then
begin
inputlength:=comm1.inbuffercount;
btest:= VarArrayCreate([0,inputlength-1], varByte);
btest:=comm1.input;
//1:接收数据
p:=VarArrayLock(btest);
try
move(p^,M.ReceiBuff[M.Recei_Total],inputlength);
M.Recei_Total:=M.Recei_Total+inputlength;
finally
VarArrayUnlock(btest);
end;
end;


2:发送代码
ShortPacketLen:=1039
function SendShortPacket(PacketConent:byte):integer;
//发送短控制信息帧,PacketLen个PacketConent,
var
i:integer;
shortoutole:olevariant;
begin
shortoutole := VarArrayCreate([0,ShortPacketLen-1], varByte);
for i:=0 to ShortPacketLen-1 do shortoutole[i]:=PacketConent; //PacketConent
Form1.comm1.output:=shortoutole;
repeat
application.ProcessMessages ;
until Form1.comm1.outBufferCount=0;
result:=1;
end;
3:MSCOMM的设置:
MSCOMM以设置成二进制方式
comm1.CommPort :=Form_Comsele.RadioGroup1.ItemIndex+1 ; ;
comm1.DTREnable :=true;
comm1.RTSEnable :=true;
comm1.Settings :=Form_Comsele.RadioGroup3.Items.Strings[Form_Comsele.RadioGroup3.ItemIndex]+',N,8,1';
comm1.InBufferSize :=2048;
comm1.OutBufferSize :=4096;
comm1.InBufferCount :=0; //清除缓冲区
comm1.OutBufferCount :=0; //清除缓冲区
//comm1.SThreshold :=1; //发送缓冲区数据全部发送完时,触发
//comm1.InputLen :=1; //每次接受一个字符
comm1.InputLen :=0; //每次读空缓冲区
comm1.SThreshold :=0; //发送缓冲区数据全部发送完时,禁止触发
comm1.RThreshold :=1; //收到一个字符,触发一次
comm1.PortOpen:=true;
comm1.Output:='ATQ0E0V1W0S0=1&C1&D2&K3'+chr(13)+chr(10); //


转移贴子到 Visual C++ Visual Basic Delphi C/C++ C++ Builder ASM 数据库开发 PowerBuilder ActiveX/COM 数据算法 软件工程 图形/游戏/多媒体 安全技术 网络/通讯 技术书籍 文件格式 C# XML/SOAP 数据仓库 VBA 主页制作 图形处理 ASP PHP Perl Java Javascript JSP 嵌入式开发 .NET Framework lotus开发使用 ADO.NET ASP.NET Web Services Web Forms Windows Forms VB.NET VC.NET Windows 9x/ME Windows NT/2000/XP DOS Office使用 Office开发 Exchange server IIS 程序人生 软件市场 程序员考试 人才热线 建议和意见 灌水乐园 走向海外 程序员杂志 软件使用 资源使用 我看软件 寻找软件 行业软件 软件评测 Linux/Unix 硬件指南 程序员大本营 | 贴子加分 | 密码:


回复贴子:
 V_Lucky(Lucky) 回复于2001-12-17 9:59:01
关注!
 leijinhe(雷) 回复于2001-12-17 10:20:41
在DELPHI中调用MSCOMM接收数据确实有问题,前一段时间我一直在搞串口通讯,调用MSCOMM控件接收数据不是缺位就是错位,后来改用CPort263就可以了。
 superyiman(役满) 回复于2001-12-17 10:35:03
你在http://www.csdn.net/expert/topic/420/420062.shtm,说过这个问题,贴子还没有结.
我提一些看法
任何串口通讯都有可能丢失数据,只不过发生的几率不同,你只能想办法去降低它
windows下mscomm程序检测串口需要一定的时间间隔,比如说4ms检测一次(你可以测个测试程序自己先测一下),如果握手设的不好容易丢数,你的RThreshold 太少了,触发太频繁容易丢数,关键是要在编程时考虑丢数的情况,握手时可以加上收发的大小,每次发送按照接收大小选择发送内容,触发终止可以加上定时检验去重新触发,不要把心思用在怎么去避免丢数上
 caifei9999() 回复于2001-12-17 21:28:30
superyiman(役满) :
你说得很有道理。我现在采用定时器,如果超过规定时间未收到规定字节数,则给发端发重发信号,让发端重新发送一遍。现在可以在两台机器之间在6分钟之内,传完1M字节的文件。但只是迂回解决了串口通信丢失的问题。
后来我也试过把RThreshold设为需要接收的字节数,但还是无法避免丢失数据的现象。
我觉得在串口通信中,加入RTS/CTS握手协议,应该可以避免数据丢失问题。
不知道在SPCOMM中是否会丢失数据?请多指教!



...全文
59 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangjiki1111 2002-04-22
  • 打赏
  • 举报
回复
交流一下,我也有同感,在使mscomm与plc通讯时,最大字符长度只能到132个,并且通讯时间要大于212毫秒,如果字符串在长一点,就会丢数据,或错位,时间短于31毫秒时,也会丢数据。

4,358

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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