当前位置:首页 > 单片机 > 单片机
[导读]1 /* 数据发送格式:2 * 0 1 2 3 4 ... DataLenth-1 DataLenth3 * HEAD1 - HEAD2 - DataLenth(n+1) - data_1 - data_2 - ... - data_n - CheckSum4 * CheckSum = HEAD1 + HEAD2 + DataLenth + da

1 /* 数据发送格式:

2 * 0 1 2 3 4 ... DataLenth-1 DataLenth

3 * HEAD1 - HEAD2 - DataLenth(n+1) - data_1 - data_2 - ... - data_n - CheckSum

4 * CheckSum = HEAD1 + HEAD2 + DataLenth + data_1 + data_2 + ... + data_n

5 */

6

7 #define FRAME_HEADER1 0xFA // 定义帧头 1

8 #define FRAME_HEADER2 0xFA // 定义帧头 2

9 unsigned char ReceiveDataBuffer[16] = {FRAME_HEADER1, FRAME_HEADER2, 0x00};

10 unsigned char DataBufferCnt = 0x02;

11 unsigned char CheckSum = FRAME_HEADER1 + FRAME_HEADER2;

12 // 串口接收中断程序

13 void USART_IRQHandler(void)

14 {

15 static unsigned char headBufCnt = 0x00;

16 unsigned char buf;

17

18 buf = ReadRegisterReceiveBuffer(); // 读接收寄存器数据到缓冲区

19

20 #if (FRAME_HEADER1 != FRAME_HEADER2) // 检测帧头,两字节帧头不同

21 if(FRAME_HEADER1 == buf) { headBufCnt = 0x01;}

22 else if(0x00 != headBufCnt)

23 {

24 headBufCnt = 0x00;

25 if(FRAME_HEADER2 == buf)

26 {

27 DataBufferCnt = 0x02;

28 CheckSum = FRAME_HEADER1 + FRAME_HEADER2;

29 return;

30 }

31 }

32 #else // 检测帧头,两字节帧头相同

33 if(FRAME_HEADER1 == buf) { headBufCnt ++;}

34 else if(headBufCnt >= 2)

35 {

36 headBufCnt = 0x00;

37 DataBufferCnt = 0x02;

38 CheckSum = FRAME_HEADER1 + FRAME_HEADER2;

39 }

40 else { headBufCnt = 0x00;}

41 #endif /* FRAME_HEADER1 != FRAME_HEADER2 */

42

43 ReceiveDataBuffer[DataBufferCnt] = buf;

44 if((DataBufferCnt-2) < ReceiveDataBuffer[2])

45 {

46 CheckSum += ReceiveDataBuffer[DataBufferCnt]; // 计算校验和

47 DataBufferCnt ++;

48 }

49 else // 数据接收完毕

50 {

51 if(CheckSum == ReceiveDataBuffer[DataBufferCnt]) // 数据校验成功

52 {

53 // 数据校验完毕且正确

54 }

55 DataBufferCnt = 0x02;

56 }

57 }


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

串行通信需要传输的数据通过调制器(Modulator)将数据转换为模拟信号,经过信号调制(Modulation)后在传输线上传输,接收端通过解调器(Demodulator)将信号解码还原成原始数据。

关键字: 串口 串行通信 并行通信

51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺...

关键字: 单片机 全双工 串口

串口是“串行接口”的简称,即采用串行通信方式的接口。串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送,其特点是通信线路简单,但传输速度较慢。因此串口广泛应用于嵌入式、工业控制等领域中对数据传输速度要求不高的场合...

关键字: 串口 RS232 同步传输

串口作为单片机开发的一个常用的外设,应用范围非常广。大部分时候,串口需要接收处理的数据长度是不定的。那么怎么才能判断一帧数据是否结束呢,今天就以STM32单片机为例,介绍几种接收不定长数据的方法。

关键字: 单片机 串口 STM32

这是FPGA之旅设计的第十例啦,在上一例中,已经成功驱动了OLED屏幕,本例将结合上一例,以及第四例多bytes串口通信做一个有趣的例程。

关键字: FPGA OLED屏 串口

接下来测试烧写功能,本次采用串口和USB烧写方式。使用ISP串口烧写这是51单片机常用的方案,本次测试比较顺利,没有遇到什么问题。但是USB烧写没有测试成功,USB烧写方式不需要任何的驱动和硬件支持,直接将USB线和ST...

关键字: PCB控制板 USB 串口

摘要:多功能电能表在配电系统中应用广泛,其计量的准确度对企业管理和考核至关重要,因此在设计多功能电能表时需要对其进行校准,满足一定应用等级。常规的多功能电能表校准方法是以电能脉冲校准为主,现提出一种基于C#和功率校表法的...

关键字: 多功能电能表 串口 波特率

摘 要:为了能通过串口采集电能参数,完成一种基于串口的三相电能采集设备的研制,设计了电能采集设备的硬件和软件部分。其中硬件采用MCU+专用电能计量芯片的结构,结构简单;软件则用于实现输入、输出、三相电能参数的采集和串行通...

关键字: 电能采集 ATT7022B MSP430 串口

如何确定时基假如要测量的波特率为9600,则每一比特位的时间为:1/9600≈104μs,一般示波器横向上每个大格子里5个小格子,要想看清一比特位一般需要一个小格子就够了,则时基为:104μs*5=520μs,也就是说时...

关键字: 串口

VivadoML最新版2021下载方法:《安装Vivado2021.1ML版,编译时间真的会减少吗?》今天我们通过zedboard串口使用的实例来简单介绍vivado和vitis的使用步骤。1,首先打开软件,新建一个空白...

关键字: 串口 zedboard vi
关闭
关闭