通讯问题 有协议 求写法(170分)

  • 主题发起人 主题发起人 junye--li
  • 开始时间 开始时间
J

junye--li

Unregistered / Unconfirmed
GUEST, unregistred user!
数据传输格式
1. 方向:单向到电脑。
2. 串列传输速率:2400bps。
3. 资料位元:8 bit。
4. 奇偶校验位:无。
5. 资料制式:16 进制。
6. 资料长度:14 Bytes。
7. 表示内容:LCD table on-off。
8. 资料格式: 1 byte --------- 1X (代表SEG1,4 位对应于LCD 表)
2 byte --------- 2X (代表SEG2,4 位对应于LCD 表)
3 byte --------- 3X (代表SEG3,4 位对应于LCD 表)
4 byte --------- 4X (代表SEG4,4 位对应于LCD 表)
…………..
等等。
1X-------- 4 bit,2X-------- 4 bit,3X-------- 4 bit,
4X----- --- 4bit
…………
EXH ------- 4 bit
9. X 表示:Bit3~Bit0 对应于LCD 中的(COM4~COM1)。
10. 采样速率:40kHz。

这是一个带串口的万用表协议,我想做的是把它的电压读到自己的程序中!

LCD表,共4个数码管(显示位),前有正负符号!具体对应引脚如下:

LCD表:a-g 代表LCD的七根管;1-21代表引脚号!
COM1:
1-COM1 2-未用 3-未用 4-未用 5-RS232
6-a4 7-b4 8-a3 9-b3 10-a2
11-b2 12-a1 13-b1 14-二极管符号 15-类似超生波符号
16-电容符号 17- 电池符号

COM2:
1-未用 2-COM2 3-未用 4-未用 5-AUTO
6-f4 7-g4 8-a3 9-f3 10-g2
11-f2 12-f1 13-g1 14-K 15-M
16-REL 17-HZ

COM3:
1-未用 2-未用 3-COM3 4-未用 5-DC
6-e4 7-c4 8-e3 9-c3 10-e2
11-c2 12-e1 13-c1 14-n 15-%
16-电阻符号 17- V 18-°C

COM4:
1-未用 2-未用 3-未用 4-COM4 5-AC
6-类似负号 7-d4 8-p3 9-d3 10-p2
11-d2 12-p1 13-d1 14-符号 15-m
16-F 17- A

请各位兄弟多多帮忙,过一段时间就的交差了,谢谢大家!
 
用 SPCOMM 来读串口,分析数据.
 
没看明白什么意识
 
问的简单一点 :设置两个EDIT框,一个button按纽.一个EDIT输入27 3d 4f 5d 67 7d 87 9d(有空格),点击button按钮,另一个EDIT框出现0000(无空格),如何实现?27 3d /4f 5d/67 7d/87 9d 都是零,转化后无空格.如何实现?
 
http://www6.blog.163.com/article/-hhFh004cVsM.html

http://www.delphibbs.com/keylife/iblog_show.asp?xid=23543
{ 从文本字串中分解出16进制的数据,返回这些8位数据组成的字串
// 文本字串分解规则:
// 1.数据是用16进制表示的8位数据(如FC,3D等)
// 2.每个数据只取最后两个16进制字符,如1F3D只取3D,前面多余部分抛弃
// 3.每个数据之间用空格或回车换行等格式符号隔开
}
function GetDataFromText(str: string): string;
var
i, p1, p2: Integer;
begin
Result := '';
while str <> '' do
begin
i := 0;
p1 := Pos(' ', str);
p2 := Pos(#13#10, str);

if p1 = 1 then // 空格在最前面
begin
Delete(str, 1, 1);
continue;
end;
if p2 = 1 then // #13#10在最前面
begin
Delete(str, 1, 2);
continue;
end;

if (p1 = 0) and (p2 = 0) and (str <> '') then // 都没有找到,结束
begin
i := StrToIntDef('$' + str, 0);
Delete(str, 1, Length(str));
end;
if ((p1 > 0) and (p2 = 0)) or // 找到空格
((p1 > 0) and (p2 > 0) and (p1 < p2)) then // 或都找到,但空格在前
begin
i := StrToIntDef('$' + Copy(str, 1, p1 - 1), 0);
Delete(str, 1, p1);
end;
if ((p1 = 0) and (p2 > 0)) or // 找到#13#10
((p1 > 0) and (p2 > 0) and (p1 > p2)) then // 或都找到,但空格在后
begin
i := StrToIntDef('$' + Copy(str, 1, p2 - 1), 0);
Delete(str, 1, p2 + 1);
end;
Result := Result + Chr(i); // 8位数据转为字符
end; // while
end;


//读卡的数据
procedure Tfrm_ICAccredit.Btn_ReadCardClick(Sender: TObject);
var
Buf: array [0..6] of Byte;
S: string;
I: Integer;
begin //TODO:
if CheckEditIsEmpty( edt_Readpw) then Exit;
//扇区,块
Buf[0] := HexToInt(cbx_Readfan.Text) *4 + HexToInt(cbx_ReadBlock.Text);
//密码
S := GetDataFromText(edt_Readpw.Text); //这个里面的16进制数据格式为 27 3d 4f 5d 67 7d 87 9d
for I := 1 to Length(S) do
Buf := Ord(S);

try
if self.BaseComm.SendReadICDataCmd($0F, Buf, 23)then
self.UpdateLog('发送读卡数据命令成功', clGray)
else Self.UpdateLog('发送读卡数据命令失败', clGray);
except
on E: Exception do
self.UpdateLog(E.Message, clRed);
end;
end;
 
厉害,这也行
 
多谢jfyes,我昨天用COPY函数,还是有一点问题!

  还有一个问题:因为这是一种带串口的表,采样频率为40KHZ,很快.我想每采集3次数据,求一次它的平均值(上面已经转换成功为数值型,它的值已附给某一变量),怎样能保证以指定的采集次数,求一次平均值,直到满足程序所设定的要达到值?
 
可以用个成员变量,计数采集次数,每3次把累计起来的数据值计算一次,然后清空数值变量和计数变量,进行下一次计数。
 
可以用个成员变量,计数采集次数,每3次把累计起来的数据值计算一次,然后清空数值变量和计数变量,进行下一次计数。

是个很好的主意,只是成员变量我不大会设置,我没有成功!假如让平均值达到2,即数值变量值大于2,就赋予另一个信号,让它停止(有协议命令)。能再具体的帮一下忙吗?非常感谢!
 
成员变量就是你的类成员变量.



//比喻在一个线程里面接收
Windows.EnterCriticalSection({临界变量});//如果你的数据值在别要修改最好加个临界区
try
//这里接收数据
Inc(类的成员变量计数);
数据值(也是个类成员变量) := 数据值 + 当前接收数据值;

//下面可以判断 计数的次数
//如果在指的次数就求平均值。
//然后清空这两个成员变量

finally
Windows.LeaveCriticalSection({临界变量});
end;
 
谢谢,非常感谢!我今天下午出差,如果有问题将在十一以后下一个问题中提出!非常感谢!
 
太客气了[:D][:D]
 

Similar threads

D
回复
0
查看
753
DelphiTeacher的专栏
D
D
回复
0
查看
659
DelphiTeacher的专栏
D
D
回复
0
查看
653
DelphiTeacher的专栏
D
D
回复
0
查看
835
DelphiTeacher的专栏
D
D
回复
0
查看
880
DelphiTeacher的专栏
D
后退
顶部