单片机串口发送数据包的问题
2个回答
展开全部
我来回答你的问题:
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
GOTO
ISR_RX_ID_L
;ID_L检验,不对就置RX_STEP=0
GOTO
ISR_RX_DATA
;数据
GOTO
ISR_RX_CHECK
;检验
希望楼主能满意我的回答。
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
GOTO
ISR_RX_ID_L
;ID_L检验,不对就置RX_STEP=0
GOTO
ISR_RX_DATA
;数据
GOTO
ISR_RX_CHECK
;检验
希望楼主能满意我的回答。
展开全部
1.正是如此,使用串口发数据包的时候一次发送一个字节,发送多次把一个数据包完全送出去。
在使用非中断方式发送的时候,先把数据包的所有内容放在一个数组中,然后把数组发送。
使用中断方式接收数据时也是这样。按照你的情况来看,由于发送的数据有帧头和帧尾,所以你在设计数据包结构时就要考虑如何识别“开始”和“结束”的过程。如对于帧头的3个字节,你可使用特殊字符的组合,如0x55,0xAA,0x3C,0xC3等来作为开始和结束的标志。这样不管数据包有多长都能被正确的接收。在数据包接收完成之后,把一个标志位设置,以便后续程序的处理。
补充:是的,每次进入中断之后都对数据进行解析,然后做记号(标志位或者计数)。
在使用非中断方式发送的时候,先把数据包的所有内容放在一个数组中,然后把数组发送。
使用中断方式接收数据时也是这样。按照你的情况来看,由于发送的数据有帧头和帧尾,所以你在设计数据包结构时就要考虑如何识别“开始”和“结束”的过程。如对于帧头的3个字节,你可使用特殊字符的组合,如0x55,0xAA,0x3C,0xC3等来作为开始和结束的标志。这样不管数据包有多长都能被正确的接收。在数据包接收完成之后,把一个标志位设置,以便后续程序的处理。
补充:是的,每次进入中断之后都对数据进行解析,然后做记号(标志位或者计数)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询