过完年,一到公司主管就催我赶紧把这个项目的PC和单片机的RS485通信给调通。这几天,一直在实验室度过的。开始我从单片机简单发送一串数据,用串口调试助手测试。上位机根本没有接收到数据,用示波器测了发送管脚和接收管脚都没有波形,查看了下波特率也是对的。所以初步断定是否硬件电路有问题,检查了ADM2483的DE端初始化时是低电平,我在程序里把这个位置为高电平,再用万用表测量还是低电平。原来DE和RE和地线是连到一块的,问其他同事,原来他们前面把这个地方拉低为了让485模块一直处于接收状态,测试测试能否接收到上位机数据。把这个地方改过来后,继续测试。还是用简单的串口收发数据测试通信,上位机发送数据,下位机接收到数据后紧接着把接收到的数据发给上位机。测试的时候,发送55和00是正确的,但是其他数据都发生了改变。后面用示波器测试单片机TXD2和RXD2的波形,发现下位机发出的数据在RXD2上显示波形,初步断定是否设计原理图的时候这两个引脚是否反了,把电路板割线,重新跳线调换两个引脚后再测试下位机往上位机发送数据,上位机接收正常。紧接着,发送和接收一起测,发送和接收都正常了。调了几天,原来电路板出问题了,可主管一来就说硬件是没有问题的,让我检查软件。哎,干软件的就是弱势群体,特别在我们公司真是这样。所以搞嵌入式开发的最好要软硬件都懂。最后,我把我以前写的程序下载到板子上,发现仍然和上位机不能通信。最后我想是不是在接收中断函数里通信协议解析不对,通过查阅资,改用另一种方式解析,结果可以通过上位机控制下位机输出显示了。最后把自己些调试用的程序附上:

简单的串口2收发程序

#include <reg52.h>/*******************宏定义***********************/
#define uchar unsigned char
#define uint unsigned int
/*****************串口2特殊功能的声明*************/
sfr AUXR=0x8e;  // 辅助寄存器,用于设定串口2工作波特率、独立波特率发生器的选择
sfr S2CON=0x9a; //串口2串行控制器
sfr S2BUF=0x9b; //串口2数据缓冲寄存器
sfr BRT=0x9c;  //独立波特率产生器,重装数
sfr IE2=0xaf; //串口2中断寄存器
sfr AUXR1=0xa2;// 辅助寄存器1,用于切换端口。以后用,切记!
#define S2RI  0x01 // 串口2接收标志位
#define S2TI  0x02 // 串口2发送标志位
sfr WDT_CONTR = 0xc1;//看门狗
/*******************位定义声明*****************/
sbit EN1=P3^3;//485通信使能端
bit flag = 0;
/********************数据存储、数据缓冲器声明*************//**************************************************************/
//++++++++++++++++++++++++++++++++++++++++//
//名称:delay_ms
//作用:延时time毫秒
//说明:延时函数
//输入参数:time
//输出参数:
//++++++++++++++++++++++++++++++++++++++++//
void delay_ms(unsigned int time)
{unsigned int i,j;for(i=time;i>0;i--)for(j=112;j>0;j--){;}
}uint num;
void UartInit(void)  //9600bps@11.0592MHz
{AUXR &= 0xf7;  //波特率不倍速S2CON = 0x50;  //8位数据,可变波特率BRT = 0xFD;      //设定独立波特率发生器重装值AUXR &= 0xfb;  //独立波特率发生器时钟为Fosc/12,即12TAUXR |= 0x10;  //启动独立波特率发生器EA=1;IE2=0x01;
}
void send(uint ch)
{EN1 = 1;IE2=0x00;    S2CON&=~S2TI;  S2BUF=ch;      while(!(S2CON&S2TI));  S2CON &=~S2TI; IE2=0x01;EN1 = 0;
}void main()
{EN1 = 0;UartInit();send(0x55);delay_ms(1);send(0xaa);delay_ms(1);send(0xff);delay_ms(1);while(1);}
void Uart2() interrupt 8
{ if(S2CON&S2RI){S2CON&=~S2RI;delay_ms(1);num=S2BUF;send(num);}
}

通信协议解析部分程序

void Data_analysis(void)
{static unsigned int check_sum = 0;  //存放校验和static unsigned char lencnt = 0;  //数据长度计数器switch (state_flag){case 0:{if(recdata == 0xaa)     // 是否帧头第一个数据state_flag = 1;elsestate_flag = 0;    // 标志复位 break;      }case 1:{if(recdata == 0x55)     //是否帧头第二个数据state_flag = 2;elsestate_flag = 0;    // 标志复位break;}case 2:{if(recdata == addr)     //判断目的地址是否正确{state_flag = 3;check_sum = recdata;}elsestate_flag = 0;    // 标志复位break;}case 3:{state_flag = 4;cmd = recdata;  //指令码check_sum ^= recdata;  //校验和累加 break;} case 4: {lencnt = 0;  //数据长度计数器清零data_count = recdata;  //存储数据长度check_sum ^= recdata;  //累加if(data_count != 0)  //后面有数据码state_flag = 5;else state_flag = 7;break;}        case 5: case 6: {dat[lencnt++] = recdata;  //存储数据码check_sum ^= recdata;   //累加if(lencnt == data_count){state_flag = 7;lencnt = 0;        }                  elsestate_flag = 6;break;}case 7:{if(check_sum == recdata)   //数据校验,判断累加和是否正确state_flag = 8;else{retval = 1;   //置错误标志,数据传输不正确state_flag=0;   }check_sum=0;//累加和清0break;}case 8:{if (recdata==0x0d){retval = 2;   //置接收一帧数据成功标志state_flag=0;}elsestate_flag=0; break; }default:break;}
//  if(timeOutFlag == 1)  //超时判断
//  {
//      timeOutFlag = 0;
//      state_flag=0;
//      retval = 1;   //置错误标志,数据传输不正确
//      recdata = 0x00;
//  }
}

51单片机串口2的RS485通信调试总结相关推荐

  1. 51单片机串口通信模板_深入理解51单片机串口通信及通信实例

    串口通信的原理 串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一 ...

  2. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...

  3. 51单片机进阶案例(1)——基于MATLAB GUI的单片机串口与PC的通信实现实时时钟和双向可调时钟功能(利用DS1302时钟芯片和LCD1602液晶屏)

    目录 一.案例描述 二.实现功能 三.51单片机部分实现 3.1 实时时钟的实现 3.2 串口通信的实现 3.2.1 接收数据 3.2.2 发送数据 四.MATLAB部分实现 4.1 GUI界面 4. ...

  4. 51单片机-串口通信(串口向电脑发送信息电脑通过串口控制LED)

    文章目录 前言 一.串行通信口的功能以及串行通信口的结构及原理 1.1 串行通信口的功能 1.2 51单片机串口的结构 二.串行通信口的控制寄存器 2.1 串行控制寄存器SCON 2.2 电源控制寄存 ...

  5. 51单片机串口多机通信的原理与编程实现

    51单片机串口多机通信 需要用的的寄存器 (了解的可直接跳到下一节) TMOD 定时器/计数器模式控制寄存器 TCON 定时器控制寄存器 SCON 串口控制寄存器 PCON 电源控制位寄存器 IE 中 ...

  6. 51单片机串口通信模板_51单片机串口通信

    51 单片机串口通信 51 单片机串口通信(转载) 2009-03-03 18:22 一.串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计 算机端,而且也能实现计算机对单 ...

  7. 51单片机~串口通信(讲解+代码)

    51单片机~串口通信 (一)计算机串行通信原理: 综上:所以在设置的时候,经常将SCON设置为0X50==0101 0000 ,使用方式1. (二)工作: 中断控制 led灯,每发送一条指令灯亮或灭( ...

  8. 51单片机串口通信【收集学习向】

    本篇整理了学习51串口通信过程中看到的一些比较好的文章,有很多的超链接.并根据自己遇到的情况分析了串口传输乱码的一些原因. 目录 1.原理知识 2.测试程序和虚拟仿真 3.电路设计与公母口连线 电路设 ...

  9. 51单片机串口通信发送以及接收代码详解1

    #include <reg51.h> //实验现象:单片接收电脑发送的字符串,并发回给PC端的代码.//函数声明 void uart_init(void); void uart_seng_ ...

最新文章

  1. b树删除节点每次只能删一个吗_面试官,请不要问我B+树了!!
  2. Lync Server 2010迁移至Lync Server 2013部署系列21:Lync 2013边缘第二台服务器配置
  3. wsl ubuntu update显示err: 404 Not Found解决方法
  4. 漫画 | 程序员的悲哀是什么?
  5. #4604. The kth maximum number(整体二分 + 树套树)
  6. 通过SQL Server 2008 访问Oracle 10g
  7. 多线程:生产者消费者问题
  8. 克服浮躁_建立强大的全球社区时克服挑战
  9. 三年级小孩近视150度需要戴近视眼镜么?
  10. hibernate 错误 could not determine type for
  11. C中文件的输入输出与C++的文件流
  12. Python Selenium打开谷歌浏览器
  13. 惯量比多少合适_详解】伺服电机负载惯量比的合理取值汇总
  14. 企业级代码静态测试工具Helix QAC——支持编码规范
  15. 各种图片格式的图片清晰程度排序
  16. 面试常问的16个C语言问题,你能答上来几个?
  17. MATLAB | 绘图复刻(二) | 折线图+误差棒+柱状图+散点抖动+灰色背景+图片叠加
  18. Naive Bayes
  19. 万国觉醒服务器维护,万国觉醒好像没看到1服怎么回事 官方关闭部分服务器公告[多图]...
  20. OLLYDBG使用笔记

热门文章

  1. java证书验证失败_解决https证书验证不通过的问题
  2. 解决YOLOV5训练时P、R、mAP等值均为0的问题
  3. CPU架构 intel,amd和arm的关系
  4. 外卖平台对接笔记(美团外卖,饿了么外卖)
  5. 我的素描基础练习第一周~欢迎大家多提意见哈
  6. python替换pdf内容_如何编辑pdf文件,替换其数据?
  7. 剪辑视频,怎么虚化边框缩小原视频
  8. SQL函数说明大全(一)
  9. could not open selected vm debug port (8700)解决方法
  10. http请求https报错:Mixed Content: The page at ‘xxx‘ was loaded over HTTPS, but requested an insecure...