十万火急啊 ,马上要交了啊。。 ( 积分: 100 )

C

cf83325

Unregistered / Unconfirmed
GUEST, unregistred user!
大家帮忙看一下这个串口的 数据包 怎么收啊,马上要交工了,着急啊。。。
小弟不才,第一次接触串口编程。。。。。。。。。
我 用的 是 MScomm控件。。。
串口速率 460800 串口报文头格式如下(定长128字节)
第一字节 0xAA
第二字节 0x55
第三字节 0x01
第四字节 0x7B
第五字节 0x00
第六字节 0xFF
第七字节 0xD8
第八字节 0xFF
第九字节 0xD9
第10字节开始64字节识别结果
第75字节至116字节保留 第117字节为手动抓拍标志
第118字节为图像编号
第119字节为车头车尾标志
第120字节为速度
第121字节红灯标志
第122字节摄像头编号
第123字节为视频测速标志
第125,126图片长度低位,高位
第127,128图片长度低位,高位
1.报文头的开始是0xAA 0x55 0x01 0x7B 0x00 0xFF 0xD8 0xFF 0xD9
2.从第10字节到第73字节为识别结果信息,台湾香港澳门新加坡车牌可能五个六个或七个八个字节不等,从第10个开始到0x00为结束;
3.第63字节为车牌颜色 0 黄牌 1 蓝牌 2白牌 3 黑牌 中间的保留字节用于将来扩展用;
4.117字节0为大视场抓拍,1 为识别,2 为手动按键抓拍(5-10图片),3雷达触发模式
5.118字节为软件抓拍的图像编号 从0开始 最大 10(每张图片的 前面有128字节的头)
6.第120字节为速度 0—252第119字节为车头车尾标志 0为车头,1为车尾速度正负视安装情况确定
7.第121字节为红灯标志
8.第122字节为摄像头编号:1 代表第一路视频, 2 代表第2路视频
9.最后的第125,126字节为图片的 长度,例如图片长度为0x2367,则第125字节为0x67,第126字节为0x23;第127和128字节也 为图片的 长度,用于冗余校验,第127和125相同,第128和第126相同;
在发送128字节报头之后直接发送图片内容 图片长度不定
10. 所以图片前必须有一个128字节的头
 
C

cf83325

Unregistered / Unconfirmed
GUEST, unregistred user!
自己往是顶。。。。
 
C

cf83325

Unregistered / Unconfirmed
GUEST, unregistred user!
我再顶。。
 
F

free_dragon

Unregistered / Unconfirmed
GUEST, unregistred user!
你这不是已经有协议了吗,,在从串口读数据的时候按协议读取相应的字节不就行了
 

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
有什么问题,照着协议定个record读写就是了。
 

白河愁

Unregistered / Unconfirmed
GUEST, unregistred user!
再说一下,嘿嘿,你是死定了,如果是相求代码,别人没你的硬件调试,很难去花时间做出来的,等着被炒吧,^_^~
 
L

lake_cx

Unregistered / Unconfirmed
GUEST, unregistred user!
没说明目的。。。
不过可以给你个思路
首先自己写个类TSnapshot,封装你这个数据信息
包含属性:识别结果信息(你看是什么类型)、车牌颜色(枚举)、抓拍标志(枚举)、图像编号(整形)、车速(整形,带符号)、红灯标志(布尔)、摄像头编号(整形)、图像(是什么图像就什么类型,如TBitMap)
包含静态方法:function CreateFromBuf(Buf: array of Byte): TSnapshot;
然后在这个方法中写上读取数据的代码,注意:从读到0xAA 0x55 0x01 0x7B 0x00 0xFF 0xD8 0xFF 0xD9时开始,最后传输图像时有图片长度信息,所以可以判断是否结束
//MSCOMM参数设置
MSComm1.CommPort := 1;//使用COM1
MSComm1.Settings := ''9600,N,8,1'';//设置通信口参数
MSComm1.InBufferSize := 32;//设置MSComm1接收缓冲区为32字节
MSComm1.OutBufferSize := 32;//设置MSComm1发送缓冲区为32字节
MSComm1.InputMode := comInputModeBinary;//设置接收数据模式为二进制形式
MSComm1.InputLen := 32;//设置Input 一次从接收缓冲读取字节数为32
MSComm1.SThreshold := 32;//设置Output 一次从发送缓冲读取字节数为32
MSComm1.InBufferCount := 0;//清除接收缓冲区
MSComm1.OutBufferCount := 0;//清除发送缓冲区
MSComm1.RThreshold := 32;//设置接收一个字节产生OnComm事件
MSComm1.PortOpen := true;//打开串口1
个人感觉需要设置全局缓冲,例如在一次接受过程中MSComm1.Input接受到了32个字节,但是此次快照到图片末尾只需要16个字节,而另外16个字节可能是下一次快照的数据,应该保留起来给下一次创建快照对象使用,全局缓冲需要一个字节数组、当前指针即可。例如,先从当前指针位置读取全局缓冲至末尾,再将MSComm1.Input的32个字节移到全局缓冲(32字节),然后读取并设置指针位置即可。
 
C

cf83325

Unregistered / Unconfirmed
GUEST, unregistred user!
好了问题解决了。。。。。谢谢lake_cx
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
526
import
I
I
回复
0
查看
757
import
I
I
回复
0
查看
574
import
I
顶部