实时串口通信的问题(我使用的是SPComm)

swordman119 2006-03-29 10:05:26
我用SPComm做的一个实时串口通信的程序。总觉得效果不理想。
我处理串口通信的代码如下:
const
DELAYBEFOREPROC=200;
var
comm: TComm;
g_sendData: Array[1..100] of char;
procedure executeComm(dataLength: Integer);
begin
if not comm.SendDataEmpty then
sleep(100);
comm.WriteCommData(g_sendData,dataLength);
//iDataLength := 0;
sleep(DELAYBEFOREPROC);
application.ProcessMessages;
end;
请大家帮忙下,怎么样才能提高效率?
...全文
237 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQgenie 2006-04-08
  • 打赏
  • 举报
回复
Cport也不一定好用.
tttSoft 2006-04-04
  • 打赏
  • 举报
回复
或者
while not comm.SendDataEmpty do
Sleep(1);

这样Sleep的时间和次数是根据实际缓冲区的数据决定,而不是不管3721, 就Sleep 200毫秒, 这样100%会出现,无畏Sleep(200)的情况, 比如:你判断的时候只有一个字节还没发送,和还有100个字节还没发送的时间是不一样的。

tttSoft 2006-04-04
  • 打赏
  • 举报
回复
实际上我个人主观认为在这里用SLEEP似乎不合适,我的理解SLEEP用于进程间,而不是内部任务间,或许可以用Applicaton.processmessage试试,如果用Sleep也建议是Sleep(1)

而且从代码来看,Sleep的作用无非是:如果发送缓冲区中还有内容的话,闲置一下, 但这里有个问题,你闲置的目的是等缓冲区清空? 还是只是等待200MS,之后就算有数据也继续发送?

我认为或许可以这么做(代码我没测试, 紧供参考):
while not comm.SendDataEmpty do
Application.ProcessMessage;

getit911 2006-04-03
  • 打赏
  • 举报
回复
把sleep(100);去掉
sleep(DELAYBEFOREPROC);改成sleep(50)试试。

solokey 2006-04-03
  • 打赏
  • 举报
回复
www.cnpack.org
下一个cnpack的组件包吧...cnrs232...用事件就可以了..
ffwin 2006-04-03
  • 打赏
  • 举报
回复
建议不要用spcomm,用cport3,否则死得很难看,这两个用法很想像代码不会改的超过5行,但性能却有天地之别,特别用于实时方面
zzwu 2006-04-03
  • 打赏
  • 举报
回复
DPR
zzwu 2006-04-03
  • 打赏
  • 举报
回复
其中没有任何牵涉政治的言论,奇怪。
我本以为是串口名“comm”引起,把所有的comm改成c omm,也没用。
zzwu 2006-04-03
  • 打赏
  • 举报
回复
我想发一个串口通信的贴,但一出来:

请不要发表可能给我们带来伤害的言论,谢谢配合

没有办法。
aiirii 2006-04-03
  • 打赏
  • 举报
回复
SPComm 中应该不用 sleep的,
有事件标示是否已经发送完数据
ZhuJunfeng 2006-04-03
  • 打赏
  • 举报
回复
作成多线程模式
solokey 2006-04-03
  • 打赏
  • 举报
回复
你可以做一个循环..来判断发送缓冲...这样比死死等200ms好一点..
tttSoft 2006-04-03
  • 打赏
  • 举报
回复
问题是不是出在sleep(DELAYBEFOREPROC); 这是非常影响性能的。
swordman119 2006-04-03
  • 打赏
  • 举报
回复

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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