关于串口接收显示问题 急!(100分)

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

faint83

Unregistered / Unconfirmed
GUEST, unregistred user!
用spcomm 已经可以接收串口数据显示在memo上 程序为
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
str: PChar;
begin
str := StrAlloc(100);
str := Buffer;
Memo1.Text := str;
end;

但是这么显示在memo的是 连续的帧 即如51.700=51.700=51.700=51.780... (=号是分隔符,51.700和51.780分别是某帧的数据)

现在要实现把每两个等号中间这段数据动态(数据实时更新)的显示在一个比如EDIT的框中 程序该怎么写?

急。。。小弟刚用delphi没多久 请高手赐教!。。
 
有人帮忙吗。。。急啊
 
edit1.text := str;不就可以了吗
 
EDIT.text:=stringreplace(str,'=','',[rfreplaceall])
 
to 来如风
不行的。 我的理解:buffer是缓存 ,存满了,一次性 全 赋给str
所以str里是大量的帧
我要存到edit里的是要实时变化的 一帧数据
 
那你发的是 =xxxx=xxxx=xxxx这样的?

那你应该看一下你的bufferlength是多少,我想实际上应该是不断的发送 =xx.xxx 过来的

你用上面的方法把=去掉显示在edit里就可以了
 
那你发的是 =xxxx=xxxx=xxxx这样的?

那你应该看一下你的bufferlength是多少,我想实际上应该是不断的发送 =xx.xxx 过来的

你用上面的方法把=去掉显示在edit里就可以了

要看你的bufferlenth 支持来如风,
 
to 来如风
是连续发送的,串口不停的读数据进来
每组数据是10位 中间8位为数据位
bufferlength是缓冲区长度可以改变吗?
是否把bufferlength设置为10位?如果可以就能把这些xxxxxx切出来放到edit中了
 
关注中,最近也在搞串口编程
 
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
str: array of string
i: integer;
begin
setlenght(str,bufferlength);
move(buffer^,str[0],bufferlength);
for i:= low(str) to high(str) do
memo1.lines.add(str);
end;
 
要从协议分析,比如,每个协议至少有一个字节的协议头(尾),如果是只有一个字节的协议头。那就分析那个协议头。
局部变量Buffer(你自己的缓冲,即你用来分析数据的缓冲区)定义成Array of Char。
收到数据时SetLength(Buffer,收到的数据字节数),然后for循环查找协议头的那个字节(一个字节头一次判断一个字节,多个字节一次取多个字节判断这个几个字节是否是协议头,但无论一字节还是多字节循环都是for i:=0 to 收到的字节数-1,也就是循环一次数组指针加一)。找到了就依次往Buffer数组中放。然后分析协议那几个字节代表了数据,就把那几个数据取出来换算,如果是ASCII码,就用StrToInt(Buffer[x]+Buffer[y]+...)换成数值,如果是BCD码,就Byte(Buffer[X])*位权+Byte(Buffer[Y])*位权。
如果你的通讯周期是100毫秒,也就是说每两侦数据之间有100毫秒的间隔,那你把Spcom的ReadIntervalTimeout 设置成70左右,这样就可以保证每收完一侦数据就触发一次。
如果你收到的频率太快,我还有其他方法可以保证不丢数据。不过太快的Spcom就不适合了。
 
to formality
很详细 相当感谢
有个问题 setlenth(xx,收到的数据字节数) 这里 收到的数据字节数 是自己设定吗?
我的数据位是起始位 8位数据位 停止位总共10位 是否可以把收到的数据字节数设置为20位 20位里有8位完整数据
 
up一下 过两天要实地调试了
尽量问清楚。。

to formality
很详细 相当感谢
有个问题 setlenth(xx,收到的数据字节数) 这里 收到的数据字节数 是自己设定吗?
 
不是,是Comm1ReceiveData()里一个参数的大小;
是一次性能接收的最大的数据长度;
 
bufferlength?

我原来的程序
procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
BufferLength: Word);
var
str: PChar;
begin
str := StrAlloc(100);
str := Buffer;
Memo1.Text := str;
end;

str就是100字节吧?能否在str里面截取 起始位和终止位 中间的数据?
 
当然可以,前提是在你知道起始位和终止位是什么东西的情况下;
 
谢谢你们,使我学到了好多东西,问一下有关comport控件是不是也是这样的,再就是协议的编写问题。我的要求从下位机上接收两路传感器信号,用一个串口怎么解决呀,协议不知道怎么写
 
很遗憾的告诉你,不知道协议的话就没法写.
 
SPCOMM消息方式处理,没一个字符处理一次消息,
不过如此以来,波特率需要设定很小才行,接收过程中什么也看不出来除了最后一个字符,
其实满可以把所有接收好的数据定时分段一个个显示才好。
 
我的问题具体说明如下:
编写计算机和虚拟试验机通讯问题(试验机是用软件模拟的),其实就是两个软件把两个串口连接起来模拟实现通讯,采用串口把数据从试验机软件传递给计算机,传送的是力值和伸长量两组数据,只用一条串口线。也不知道怎么具体实现,请大家帮忙指点一下,谢谢大家。给的具体通讯协议如下:
拉伸试验系统串口通讯协议
一、 主机上保留独立运行功能:
二、 通讯内容:
1. 串口通讯参数:波特率9600~115200可调,奇校验位(计算机可调),1停止位,8数据位,串口序号可调(计算机)。
2. 需要传递的参数:
(1) 上下钳口距离(隔距)
(2) 拉伸速度 mm/min
(3) 定负荷值 N
3. 动作指令:
(1) 握手:QF 回答QS
(2) 校定长 JL 接受到该指令,按传递的伸长值进行隔距校定。结束后回答 OK。
(3) 拉伸 SE 接受到该指令,进行定负荷拉伸,传递伸长结果。
4. 传输总则:
(1) 收一发一:起两个作用,一是校正波特率失配误差,二是起正确性校验。
收方:收一个字符,发出所收字符。
发方:发一个字符,等待回收同一字符(暂不校验,以后再添加此功能)。
如 试验机的测试参数由计算机设定
计算机方面 试验机方面
发 Q F 回 Q S (一个字符对一个字符的收发)
发 表头数据 等待接收(字节间最多延时3秒),收到后改变参数设置

5. 表头数据:

偏移 (1)日期时间
1 P(80,50h)
2 T(84,54h)
3 00H
4 05H
5 年(00~99)
6 月(01~12)
7 日(01~31)
8 时(00~24)
9 分(00~59)
偏移 (2) 试验方式
1 P(80,50h)
2 G(71,47h)
3 方式代码(0~6)
4 02H
5 试验速度 高8位
6 低8位
备注:方式:0 定速拉伸、1 顶破试验、2 撕裂试验、3 剥离试验、4定伸长弹性试验(应力松弛试验)、5定负荷弹性试验(蠕变试验)、6缝口拉伸试验
高低8位存储速度,增量为1毫米。20~2500mm/min。前导符P、T、G等后面括号中数字为10进制和16进制的值。

偏移 (3)初始参数
1 P(80,50h)
2 W(87,57h)
3 00H
4 04H
5 定负荷值 高8位
6 低8位
9 隔距
长度 高8位
10 低8位
备注:定负荷值:增量1N。
隔距长度:增量为1毫米。

6. 测试数据
偏移 (4)伸长 备注
1 P(80,50h) 高、中8位是整数部分,低8位是小数部分
2 E(69,45h)
3 00H
4 03H
7 伸长值 高8位
8 中8位
9 低8位

偏移 (5)力值 备注
1 P(80,50h) 高、中8位是整数部分,低8位是小数部分
2 E(69,45h)
3 00H
4 06H
7 力值 高8位
8 中8位
9 低8位
 
后退
顶部