功能:51单片机向PC应用程序发送外部脉冲计数,串口通信
设置:串口:2400 n 8 1,T0的TH0、TL0作为16位计数器存储外部脉冲数
51单片机向PC传输16位有效数据(TH0+TL0),PC上有delphi开发的应用程序进行接收显示计数值,因串口通信数据位是8位,为了使PC应用程序界面显示16位数据,自定通信协议为:每次通信时,51向PC首先发送0XFA(作为数据开始标志),然后发送TL0中的计数值,发送TH0的计数值, PC端应用程序首先判断数据开始标志0XFA,若是则取后面的两个字节数据作为输出显示
请问这样定义通信协议可以吗? 要不要再加一个字节作为校验?
或者还有其他更好更合适的解决办法?
敬请指点,谢谢!
谢谢你详细的回答!
如下:
1. 通信距离为50m
2. 发送数据的频率: 每隔一秒取数据、发数据
3. 用ASCII码发送是什么意思? 不都是发送0x04之类的吗?
1、50米太长了,RS232原则上不支持,建议使用RS485,RS232可能会出错,需要校验;
2/3、数据量很少,建议使用ASCII格式,就不存在问题了。所谓ASCII格式,就是二进制0x54用两个字节0x35和0x34表示,数据的范围在0x30~0x46之间,其它数据你就可以用来表示帧头帧尾了。建议你参照MODBUS协议
请问结束标志怎么弄?
还有如何以英文ASCii码做标志?用单片机给串口发数据时不都是SBUF=XXX吗?
请指点下菜鸟我啊谢谢谢~~
ASCii码也是有16进制构成的,详细的可查ASCii码表。
当然,如果你发送的数据结构简单、整齐,为提高通讯效率也可以以简单的起始符号来开始,不过尽量要想方法不让起始标志与正常数据混淆就可以了。
方法有很多。例如,单片机发送的数据不可能出现的数值,单片机发送的最高位只能是0的话,就可以以0X80H之后的数字来做起始标志等等。
结束标志可以用校验和数值。比如发送的所有数据之和的低8位。PC端也进行校验和,一致了说明传输正确。当然也可以重复发送进行比较只是效率不高。
单片机SBUF=0X61H,在PC端可显示出“a”。