MAX485串口通信
程序使用了简单的协议,准确率较高!
欢迎高手指教!
C51程序设计:
#include <reg51.h>
#include <string.h>
//#include "HC595_Driver.h"
//**************** 55 01 XX YY ZZ CS(=55+01+XX+YY+ZZ) AA(EE)********************//
//****************校验 方向 3个数据 检验和 帧尾************************************//
//
#define INBUF_LEN 3 //数据长度
unsigned char buff[INBUF_LEN];
unsigned char flag,Res=0;
sbit RS485E=P3^6; //定义485的使能脚
void init_serialcomm(void)
{
SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xF3; //Baud:4800 fosc=12MHz
TL1 = 0xF3;
TR1 = 1; // timer 1 run
ES=1; //Enable Serial Interrupt
TI=0;
RS485E=0; //485发送使能端,使能接受
EA=1;
}
//向串口发送一个字符
void send_char_com(unsigned char Sendch)
{
RS485E=1; //485的使能发送
SBUF=Sendch;
while(!TI);
TI=0;
RS485E=0; //485的使能接受
}
void sendStrings(char *dat)
{
while(*dat!='\0')
{
send_char_com(*dat++);
}
}
unsigned char Check_Data(unsigned char dat)
{
static unsigned char FCMS=0,cnt=0,dir,cs;
switch (FCMS)
{
case 0:
{
if(dat==0x55) //找到帧头
{
FCMS=1;
cnt=0;
}
break;
}
case 1:
{
dir=dat; //保存方向
FCMS=2;
break;
}
case 2:
{
buff[cnt++]=dat; //接收数据(3个数据)
if(cnt>=3)
{
FCMS=3;
}
break;
}
case 3:
{
cs=dat; //保存校验
FCMS=4;
break;
}
case 4:
{
if(dat==0xAA) //接受一帧数据完毕
{
flag=1;
if(cs==(0x55+dir+buff[0]+buff[1]+buff[2])) //帧校验正确
{
if(dir==0x01) //方向正确
{
Res=1;//数据帧OK
FCMS=0; //重置状态
break;
}
}
Res=0;//数据帧错误
FCMS=0;
}
else
{
FCMS=0;
}
break;
}
default: FCMS=0;
break;
}
return 1;
}
//串口接收中断函数
void serial () interrupt 4
{
unsigned char dat;
if(RI)
{
dat=SBUF;
RI=0;
Check_Data(dat);
}
else
{
TI=0;
}
}
void main()
{
init_serialcomm(); //初始化串口
sendStrings("hello world!\r\n");
while(1)
{
if(flag)
{
if(Res)
{
send_char_com(0xFF);
}else
{
send_char_com(0x00);
}
flag=0;
}
}
}
MAX485串口通信相关推荐
- 【STC单片机学习】第十三课:串口通信和RS485
[朱老师课程总结 侵删] 第一部分.章节目录 1.13.1.通信有关的常见概念 1.13.2.什么是串行通信 1.13.3.51单片机的串行通信 1.13.4.STC51的串行通信相关寄存器1 1.1 ...
- 十一、51单片机之串口通信
1.通信的关键 (1)事先约定.通信之前规定好的,如通信速率,起始信号,结束信号等. (2)通信传输的基本信息单元. (3)信息的编码.传输.解码. 2.通信相关的概念 2.1.同步和异步 (1)同步 ...
- 串口通信和RS485
1 通信有关的常见概念 1.1 什么是通信 (1)人和人之间的通信:说话.写信.狼烟.手势等. (2)人和计算机之间的通信:按键.显示器.鼠标.触摸屏等. (3)计算机和计算机之间的通信? 1.2 通 ...
- python第三方库之学习pyserial库--串口通信
pyserial串口通信库 1.安装pyserial库 2.填写串口参数的注意事项 3.简单封装一下 4.碰到的bug 1.安装pyserial库 pip install pyserial versi ...
- VC串口通信编程-2
VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...
- Linux ROS与嵌入式的串口通信
1.根据ros wiki的官方教程 学习即可,并且有许多例子可供学习 http://wiki.ros.org/rosserial_arduino/Tutorials 2.用ASIO读写设备串行口 AS ...
- 投影串口测试程序_【原创】串口通信测试程序
源代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; ...
- labVIEW与单片机实现串口通信的设计过程
1.概述 在现代测控系统中,我们经常会采用上位机和下位机的开发控制模式.下位机主要是用来采集数据,可以通过嵌入式控制器.单片机控制器.PLC等来实现.上位机主要是图形界面,用来实时显示采集数据,并进行 ...
- chord协议模拟实现_C#.NET和单片机串口通信实现监控单片机数字量输入继电器输出模拟量输入模拟量输出...
一.必备软件和硬件: 1.C#.NET: 2.单片机开发板: 3.通信电缆. 二.通信参数: 1.数据位:8位 2.校验方式:无校验 3.停止位:1位 4.波特率:9600bps 5.通信协议:自定义 ...
最新文章
- Java--获取request中所有参数的方法
- Dynamips和Vmware完成CCVP试验(1)
- sql OFFSET 和 ORDINAL
- (扫盲)RPC远程过程调用
- mongodb按照时间分组统计
- 电脑上安装了多个版本的nodejs,如何知道node命令调用的哪一个
- java 与 c#的 中 字符串比较“==”与“equals”的差异
- Oracle 20c 新特性:表达式参数值 Expressions Parameter Values
- mysql 前n个最大值_选择MySQL中的第n个最大值
- 在高考作弊这事上,古今监考老师操碎了心!
- linux自学笔记--DNS服务器
- Java 位运算符 深入理解
- nit计算机考试题目,NIT计算机考试大纲
- JAVA 算法之穷举法
- 西门子电机选型参考一
- 直播盒子源码开发合作
- 【FPGA算法加速】FPGA编程开发环境:Vivado安装教程详细说明
- ABAP如何获取当前月的第一天和最后一天
- modules node 太大了_解决node_modules文件名太长无法删除的两个方法-文件名太长
- C语言学习日记(四)