单片机串口发送数据包的问题

来源:百度知道 编辑:UC知道 时间:2024/09/24 05:02:21
现在定义的格式如下:
帧头(3)+地址信息(1)+数据长度(1)+数据块(2)+校验码(2)+帧尾(1)
后面括号为数据个数,校验码为数据和校验+异或校验两种校验。
因是第一次做有些不懂,请大侠指点:
1、上面的数据我通过串口一个一个的发送出去?可以吗,因为是数据包,不知道是不是这样做的?我不是用中断发送。
2、用中断接收时,比如说是收到帧头第一个数,进入中断,判断如果是对的,变量加1(使用了一个变量作为协议状态机的转换状态,用于确定当前字节处于一帧数据中的那个部位)后,是否需要退出中断,当下一个数据到来后再进入中断根据变量来识别是那一个数据进行解析??????还是就在此中断中等待数据包的下一个数据到来根据变量来识别是那一个数据再进行相关变量的设置呢?
ATF144X你好!
1.正是如此,使用串口发数据包的时候一次发送一个字节,发送多次把一个数据包完全送出去。

在使用非中断方式发送的时候,先把数据包的所有内容放在一个数组中,然后把数组发送。

使用中断方式接收数据时也是这样。按照你的情况来看,由于发送的数据有帧头和帧尾,所以你在设计数据包结构时就要考虑如何识别“开始”和“结束”的过程。如对于帧头的3个字节,你可使用特殊字符的组合,如0x55,0xAA,0x3C,0xC3等来作为开始和结束的标志。这样不管数据包有多长都能被正确的接收。在数据包接收完成之后,把一个标志位设置,以便后续程序的处理。
============================================================================================
中断接收中,接收一个字节作相应的解析后,就退出中断,下一个字节到来后再进入中断进行解析.是不是这样的??

1.正是如此,使用串口发数据包的时候一次发送一个字节,发送多次把一个数据包完全送出去。

在使用非中断方式发送的时候,先把数据包的所有内容放在一个数组中,然后把数组发送。

使用中断方式接收数据时也是这样。按照你的情况来看,由于发送的数据有帧头和帧尾,所以你在设计数据包结构时就要考虑如何识别“开始”和“结束”的过程。如对于帧头的3个字节,你可使用特殊字符的组合,如0x55,0xAA,0x3C,0xC3等来作为开始和结束的标志。这样不管数据包有多长都能被正确的接收。在数据包接收完成之后,把一个标志位设置,以便后续程序的处理。

补充:是的,每次进入中断之后都对数据进行解析,然后做记号(标志位或者计数)。

我来回答你的问题:
1。串口,即串行通迅(异步心通迅)本来就是一位一位的将数据串行发出,所以你的数据(10字节)肯定是一位一位的发,发完第一字--》第二字节--》。。。第10字节。注意发送某一字节时不能停顿,当然串口会自动完成,不需要人工干扰;发完一个字节后中途肯定是可以停顿的,否则我1ms不发送串口就不工作???肯定不会的了。

2。接收端用状态机来做最方便,编者顺手,读者称心。收到一字节后,自动进入中断,定义一下step来指示接收到了哪一个“阶段”,如:地址检验阶段,然后step++,退出中的,下次再进中断时,就进入了下一个“阶段”了,就是你的“数据长度”,然后step++,退出中断(如果数据如:ID,址址不对就直接返回STEP=0)。。。。。直到接收完整个数据帧;接收完一字节数据肯定是要退出中断去做其它事情的,要不就成了轮循的接收方式,而不叫中断方式了;

以下为我用PIC的USART做的一段状态机接收接收程序:

ISR_USART_RX;串口接收中断
MOVFW RX_STEP ;the counter of RX
ADDWF PCL,F
GOTO ISR_RX_PREAMBLE ;同步头检验
GOTO ISR_RX_ID_H ;ID_H检验,不对就置RX_STEP=0