请DelPhi里手进来帮个忙,最好一次性搞定,应该是比较简单的问题:)

086 2002-07-06 12:10:51
Delphi写的一段程序,它的主要作用是读取由电子汽车衡传输到计算机串行口的称重数据并在计算机上显示出来,利用的是mscomm控件实现串口通讯。电子汽车衡的称重仪表的串口通讯数据共有18个字符,具体的格式见下表:
字符序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
含 S 状 状 状 回 检
T 态 态 态 (5~10位)是 (11~16位)是皮重值 车 查
义 X 字 字 字 显 示 的 重 量 值 和
A B C
程序要求在一区域显示以上数据中的第5~第10位,即仪表的重量值,为实时采集并显示,利用计时器控件每500ms(或250ms)采集一次数据并显示。曾利用函数截取这段数据中第5~第10位数据并显示,但很不稳定,常会把其他位置的数据也显示,而丢掉应显示的重量数据

问题是:怎样才能稳定的显示重量值。

是帮我朋友问的,我不会Delphi:(
如能QQ联系我最好:8899997

unit MainForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, OleCtrls, MSCommLib_TLB, ExtCtrls, StdCtrls;
type
TForm1 = class(TForm)
……
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
cominput:string; //定义接收串口数据变量
implementation
uses passdlg;
{$R *.dfm}
procedure TForm1.N41Click(Sender: TObject);
begin
mscomm1.PortOpen:=False; //关闭串口
Close; //关闭系统
end;
procedure TForm1.Timer1Timer(Sender: TObject); //定时器事件
begin
label2.Caption :=datetostr(date); //显示日期
label5.Caption :=timetostr(time); //显示时间
cominput:=MsComm1.Input; //将串口数据赋于变量
StaticText1.Caption :=cominput; //显示变量接收到的称重数据
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
with MsComm1 do
begin //设定串口为com1
CommPort:=1;
Settings:='4800,e,7,2'; //串口通讯格式为波特率4800,校验,7位数据位,2位停止位
InputMode:=0; //接受数据格式为字符型
PortOpen:=true; //打开串口
end;
end;
...全文
64 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
086 2002-07-10
  • 打赏
  • 举报
回复
?
086 2002-07-08
  • 打赏
  • 举报
回复
多谢各位!
086 2002-07-08
  • 打赏
  • 举报
回复
多谢各位
yangyugw 2002-07-06
  • 打赏
  • 举报
回复
每一次显示完,把cominput清空。本人没有用过mscomm,本人使用spcomm,我的接收部分在spcomm的接收的事件里面,对于mscomm这个控件也应该有这个事件的,你怎么可能保证mscomm在你的timer激活一次里面一定接收完了一侦数据呢。所以
接收部分不能在timer里面完成,要放在mscomm的onread这样的事件里面,保证接收了完整的一帧数据后才在改变StaticText1.Caption。
cxx1997 2002-07-06
  • 打赏
  • 举报
回复
UP,看不懂
086 2002-07-06
  • 打赏
  • 举报
回复
阿聪能否说得详细一点儿?
ajian8185 2002-07-06
  • 打赏
  • 举报
回复
去www.delphibbs.com
问问啊,我以前看见过类似的问题:)
Liujc 2002-07-06
  • 打赏
  • 举报
回复
增加一个串口数据接收缓存,将接收到的串口数据写入缓存然后再解释接收缓存数据显示。
086 2002-07-06
  • 打赏
  • 举报
回复
哈哈,谢谢,一前一后同一分钟顶的啊,呵呵
086 2002-07-06
  • 打赏
  • 举报
回复
我顶!
realprogrammer 2002-07-06
  • 打赏
  • 举报
回复
帮你UP!
surfguy 2002-07-06
  • 打赏
  • 举报
回复
同意YANGYUGW(小杨)的,至于代码,我觉得让你的朋友在读取串口字符时先用特殊位判断一下(如果是正确的称重仪表的串口通讯数据的话,某些位的值应该不变或比较特殊),正确了再赋给statictext进行处理。
086 2002-07-06
  • 打赏
  • 举报
回复
噢,多谢小杨,你能不能把上面的代码改改贴一下?麻烦了:)
yangyugw 2002-07-06
  • 打赏
  • 举报
回复
原来mscomm没有这样的事件,那也没什么,你在timer里面要判断接收的的长度是完整的就可以了
你要判断头和尾这样你就可以获得完整的一帧数据,我认为你的问题就出在
接受的头尾没有判断上面了,那么谁遍发个数据就显示,就错了
字符序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
含 S 状 状 状 回 检
T 态 态 态 (5~10位)是 (11~16位)是皮重值 车 查
义 X 字 字 字 显 示 的 重 量 值 和
A B C

5,388

社区成员

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

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