串口程序中, ReadFile的读取速度太慢了, 如何才得快速取到最新的数据.(100分)

  • 主题发起人 主题发起人 pal2003
  • 开始时间 开始时间
P

pal2003

Unregistered / Unconfirmed
GUEST, unregistred user!
前面的贴子也看了不少, 找不到答案,
串口程序, 有时设备的波特率比较高,在数据接收部分,我用
ReadFile(g_ComInfo.cHandle, bDat, 1, rwBytes, nil);
还没读完旧数据,新数据又来了,怎么办呢?


PurgeComm(g_ComInfo.cHandle, (PURGE_RXCLEAR)); // 清空队列中的数据
每秒作一次 PurgeComm,
居然也可以读到几秒前的旧数据,怎么回事?
 
你的数据量有多少?数据通讯速度是多少?
使用spcomm ,把通讯速度设置到38400试试,我觉得可以处理好。
我有时候遇到很大的通讯量都可以很好的完成。
 
异步处理,用完成例程
 
// PurgeComm(g_ComInfo.cHandle, (PURGE_RXABORT + PURGE_RXCLEAR)); // 清空队列中的数据
while true do
begin
bl:= ReadFile(g_ComInfo.cHandle, bDat, 1, rwBytes, nil);
if rwBytes<=0 then exit;

if (chr(bDat)='+') or (chr(bDat)='-') then v_str := '' //读到起始字节
else
v_str := v_str + chr(bDat);

// 数据分析
end
 
用api写的, 是一个对不同型号称重显示器读数的公用程序,
有些机器不知为什么, readfile的速度很慢, 波特率比较大时, 程序不能正常工作,
 
老数据丢失没有关系,我只想读到最新的数据就可以了,
 
ReadFile慢?
难道你要机器指令自己写吗
就算你把波特率设置为115200
一般来说
也没问题的
关键是你要把问题分析清楚
如果设备传来的数据是定长的
那你可以设置一个逻辑
等待串口接收缓冲区中有了指定长度的数据再读
 
to Mike1234567890,
我用另外一种方式写, 一次把队列中的所有数据读取出来,
ReadFile(g_ComInfo.cHandle, bDat, .inque, rwBytes, nil);
可以效果一样的,
波特率低的时候工作得很好, 波特率高于9600就有退不出来了.
 
把队列设小一点, 让多余的数据丢失, 也不行, 郁闷呀,

// 设置读写队列的大小
SetupComm(g_ComInfo.cHandle, 128, 128);
 
这种问题,是因为收到时还没来得及保存,对方又发过来了。。。从而造成数据丢失,,,
处理方面有两,一是收到时进行援时,不过这种效率不高。。。
二是收完后发一个标志过去,当发送端收到这个标志时,再发送。。。
 
问题已解决, 我现采用的是一次性读取缓存队列到数组中, 再从数组中分析得到数据.
谢谢大家了.
 
感谢Mike1234567890的热心帮助,请到
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3534343
领分.
 
多人接受答案了。
 
后退
顶部