打印

请问各位大侠关于单片机串口数据接收的问题(在线等)

[复制链接]
1982|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
x_catl|  楼主 | 2009-5-14 14:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机和PC上位机定好了协议,然后我这里是单片机接收PC的数据,根据协议是一个一个数据包处理的。 以前没怎么编过这方面的程序,还请各位帮帮忙……

具体协议:

1. PC给MCU发: 帧头:0xff + 卡号(1BYTE)0x_ _ + 时(1BYTE):0x_ _ + 分(1BYTE):0x_ _ + 秒(1BYTE):0x_ _ + 校验位(1BYTE)(卡号,时分秒相或的结果)

2. MCU给PC发: (这里先给每个MCU编号)
   帧头:0xff + 卡号(1BYTE)0x_ _  + 状态(0x01为正确,0x00为错误)+ 校验位(1BYTE) (卡号和状态相或的结果)



我试着编程,可是总是出错,以前只会一个一个数据接收,不知道怎么一个一个数据包接收…… 

请高手们帮忙看看如何编程序啊?

相关帖子

沙发
icecut| | 2009-5-14 14:46 | 只看该作者

包需要同步.

还需要容错.
包内不能含有包头字符.

使用特权

评论回复
板凳
icecut| | 2009-5-14 14:48 | 只看该作者

我以前写过.详细点.

1.发现前导码则认为振开始.确保振内没有帧头字节.

你要考虑,错字节和丢字节.

使用特权

评论回复
地板
dengm| | 2009-5-14 22:37 | 只看该作者

用和校验, 保证数据不为 0xff

校验位 用和校验: 
    A =0 
    FOR I = 1 TO N-1
      A = A + D(I) + 1
      IF A>=256 THEN
         A=(A AND 255)
      ELSE
         A = A -1
      ENDIF
    NEXT I
    D(I)= A
  ================================

  MOV R0, #UART_OUT_BUF
  MOV R2, #(N-1)
  CLR A
LP_R2:
     SETB C
     ADDC A, @R0
     JC L_10
       DEC A
L_10:
   DJNZ R2, LP_R2
   MOV @R0, A
      


使用特权

评论回复
5
lbx_00| | 2009-5-15 17:13 | 只看该作者

弄个接收缓冲区,进队列呀

使用特权

评论回复
6
耕在此行| | 2009-5-15 21:52 | 只看该作者

弄个接收缓冲区,进队列呀

收完一帧数据再处理

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

58

帖子

1

粉丝