RS485通信示例程序
RS485双机通信程序

void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void master(uchar command)
{
uchar aa,i;
DR=1;
SBUF=command;
while(TI!=1);
0xb0,0x92,0x66,0xfF};
uchar rebuf[8];
void delay(uint xms)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
uchar j;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
RS-485双机通信程序
主机程序
此程序的主要特点是加的的校验少,适合初学者利用max485模拟单片机双机通信
建议看程序前看看郭天祥的单片机双机通信或者对于单片机双机通信协议有一个总体的了解,如果有了这个基础我相信你能够很快看明白下面的程序。
#include <reg52.h>
#define uchar unsigned char
PCON=0x00;
TR1=1;
SCON=0xd0;
EA=1;
while(1)
{
DR=0;
ES=1;
for(j=0;j<8;j++)
{
P0=rebuf[j];
delay(1000);
}
}
C51很简洁易懂的RS458串口通信接收发送程序

{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void) {
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
SendFlag = 1;
}
}
/*******************************************************************************
*标题: RS485串口通信试验(接受与发送) *
**
* 1.通过本例程了解串口的基本原理及使用,理解并掌握对串口进行初始化*
**
* 2.请使用串口调试助手(Baud 4800、数据位8、停止位1、效验位无)做为上位机(发送)数据和(接受)数据,
void ser_int (void) interrupt 4 usin
TI = 0;
SendFlag = 0;
}
if(RI == 1) //RI接受中断标志
{
RI = 0;//清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
SenData=ReData;
*请在字符串输入框中输入字符和数字(HEX),按发送按钮。观看接受窗显示情况.也可以用自动循环发送。
*
* 3.试验RS485需要用RS232转485的转换头。RS485的A对应串口头的9针B对应4针.接法大家可以参考原理图。
**
*请学员认真消化本例程,学会用C语言操作串口和485的实现*
详解RS485通讯程序代码及技术介绍

} } //主函数 void main() { DDRD|=BIT(PD2); //PORTD|=BIT(PD2); USART_Init(); //UART_Puts("\r\n 你发送的字符串是:");//发送字符串 PORTD&=~BIT(PD2); DDRD|=BIT(PD2); while(1) { if(RX_Flag)
{
PORTD|=BIT(PD2);
//UART_Puts();
USART_Send('1');
//USART_Send(RX_Buffer);
RX_Flag=0;
PORTD&=~BIT(PD2);
PORTD|=BIT(PD2);
//UART_Puts();
USART_Send('2');
//USART_Send(RX_Buffer);
HART 网络:HART 是由现在的艾默生提出一个过度性总线标准,他主要是在 4~20 毫安电流信号上面叠加数字信号,物理层采用 BELL202 频移键控技术,以 实现部分智能仪表的功能,但此协议不是一个真正意义上开放的标准,要加入他 的基金会才能拿到协议,加入基金会要一部分的费用。技术主要被国外几家大公 司垄断,近两年国内也有公司再做,但还没有达到国外公司的水平。现在有很大 一部分的智能仪表都带有 HART 圆卡,都具备 HART 通讯功能。但从国内来看还没 有真正利用其这部分功能,最多只是利用手操器对其进行参数设定,没有发挥出 HART 智能仪表应有的功能,没有联网进行设备监控。从长远来看由于 HART 通信 速率低组网困难等原因,HART 仪表的采购量会程下滑趋势,但由于 HART 仪表已 经有十多年的历史现在在装数量非常的大,对于一些系统集成商来说还有很大的 可利用空间。
RS485通信原理图及程序实例详解

RS485通信原理图及程序实例详解RS232 标准是诞⽣于 RS485 之前的,但是 RS232 有⼏处不⾜的地⽅:接⼝的信号电平值较⾼,达到⼗⼏ V,使⽤不当容易损坏接⼝芯⽚,电平标准也与TTL 电平不兼容。
传输速率有局限,不可以过⾼,⼀般到⼀两百千⽐特每秒(Kb/s)就到极限了。
接⼝使⽤信号线和 GND 与其它设备形成共地模式的通信,这种共地模式传输容易产⽣⼲扰,并且抗⼲扰性能也⽐较弱。
传输距离有限,最多只能通信⼏⼗⽶。
通信的时候只能两点之间进⾏通信,不能够实现多机联⽹通信。
针对 RS232 接⼝的不⾜,就不断出现了⼀些新的接⼝标准,RS485 就是其中之⼀,它具备以下的特点:采⽤差分信号。
我们在讲 A/D 的时候,讲过差分信号输⼊的概念,同时也介绍了差分输⼊的好处,最⼤的优势是可以抑制共模⼲扰。
尤其当⼯业现场环境⽐较复杂,⼲扰⽐较多时,采⽤差分⽅式可以有效的提⾼通信可靠性。
RS485 采⽤两根通信线,通常⽤ A 和 B 或者 D+和D-来表⽰。
逻辑“1”以两线之间的电压差为+(0.2~6)V 表⽰,逻辑“0”以两线间的电压差为-(0.2~6)V 来表⽰,是⼀种典型的差分通信。
RS485 通信速率快,最⼤传输速度可以达到 10Mb/s 以上。
RS485 内部的物理结构,采⽤的是平衡驱动器和差分接收器的组合,抗⼲扰能⼒也⼤⼤增加。
传输距离最远可以达到 1200 ⽶左右,但是它的传输速率和传输距离是成反⽐的,只有在 100Kb/s 以下的传输速度,才能达到最⼤的通信距离,如果需要传输更远距离可以使⽤中继。
可以在总线上进⾏联⽹实现多机通信,总线上允许挂多个收发器,从现有的 RS485芯⽚来看,有可以挂 32、64、128、256 等不同个设备的驱动器。
RS485 的接⼝⾮常简单,与 RS232 所使⽤的 MAX232 是类似的,只需要⼀个 RS485转换器,就可以直接与单⽚机的 UART 串⼝连接起来,并且使⽤完全相同的异步串⾏通信协议。
485通信讲解(附案例)

RS485通讯协议
控制字定义
控制字 (位)
值
bit9
1
含义
点动反转
0
点动反转停止
bit10
1
主站控制有效
0
主站控制无效
bit14
1
运行方向正转
0
运行方向反转
bit11~13 ,bit15 、4
未定 义
预留
功能描述
主站下发的当前控制字和运行设定值 有效 主站下发的当前控制字和运行设定值 无效,变频器保持前一次的控制字和 运行设定值
发送顺序 1 2 3 4 5
6
(字节)
变频器至控制器:
起 始 字 节
从 机 地 址
响 应 字
功 能 码 号
功能 码实 际值
功能 码实 际值
控制区
78
数据区 校验
9
10 11
状 态 字
状 态 字
实际 运行 数据
实际 运行 数据
异 或 校 验
字节定义 头 地址 命令区
参数区
控制区 数据区 校验
RS485通讯协议
67
起 始 字 节
从 机 地 址
控 制 字
控 制 字
运行 数据 设定
运行 数据 设定
异 或 校 验
字节定义头地址控制区 数据区 校验
发送顺序 1 2 3 4 5 (字节)
67
变频器至控制器:
起 始 字 节
从 机 地 址
状 态 字
状 态 字
实际 运行 数据
实际 运行 数据
异 或 校 验
字节定义头地址状态区 数据区 校验
1、以50Hz运行2#变频器。(此例需要将变频器频率设定成F0.03=6)
PLC资料:三菱PLC RS485通讯使用教程(带示例)

通信
一、联机方式
自动化生产线各工作站中PLC之间通过RS-485串行通信的方式实现互连,构成分布式的控制系统。
二、N:N网络功能
N:N网络功能,就是在最多8台FX可编程控制器之间,通过RS-485通信连接,进行软元件相互连接。
1)根据要链接的点数,有3种模式可以选择。
2)数据的链接是在最多8台FX可编程控制器之间自动更新。
3)总延长距离最大可达500m。
三、链接模式及链接点数
四、N:N网络接线图
五、N:N网络中使用的软元件如下:
1.N:N网络设定用的软元件
是用于设定N:N网络的软元件。
使用N:N网络时,必须设定下列的软元件。
2.判断N:N网络错误用的元件
用于判断N:N网络错误。
请将链接错误输出到外部,并在顺控程序的互锁等中使用。
3. 链接软元件
是用于发送接收各可编程控制器之间的信息的软元件。
根据在相应站号设定中设定的站号,以及在刷新范围设
定中设定的模式不同,使用的软元件编号及点数也有所不同。
1)模式0时
2) 模式1时
3) 模式2时
三菱PLC 485通讯示例(2个PLC)
题目:
按下SB1(0#PLC 的X0),灯L1(1#PLC 的Y0)亮。
按下SB2(1#PLC 的X1),灯L2(0#PLC 的Y1)亮。
通讯线连接方式:
主站程序:
从站程序:。
教程组态软件的无线485通讯实例

教程组态软件的无线485通讯实例在工业现场可能会遇到这样的情况分布在不同地方(车间、控制室场所等)的PLC需要与总控中心的组态王软件进行远距离无线通信。
通常情况是采用有线RS485总线敷设电缆,通过MODBUS协议完成此功能。
在这里介绍一种PLC的MODBUS无线组态通信的实现方法。
本方案可以作为西门子PLC与组态王通信的实例。
1组态王实现MODBUS主站1.1新建组态王工程打开组态王工程管理器,菜单栏点击文件→新建工程,弹出新建工程向导对话框,点击下一步,输入工程名称,如MODBUS_ZUTAIWANG。
点击下一步完成。
新建工程被添加到工程管理中。
如下图所示∇1.2创建设备双击工程管理器中新建的工程,进入工程浏览器界面,选择工程浏览器中的设备→COM1→新建…进入设备配置向导,选择PLC→莫迪康→ModbusRTU→COM参考如下界面∇点击下一步,给设备命名,如MODBUS,继续点击下一步,选择计算机串口,如本机串口使用COM1,继续下一步选择Modbus从站站号,如2#,继续下一步,创建设备完成,在设备区显示新建的MODBUS设备。
如下图所示∇1.3创建数据词典接下来创建数据库,用于组态王与设备之间进行数据传输。
选择工程浏览器中的数据库→数据词典,创建本工程所需要的I0.0-I0.3输入寄存器变量和Q0.0-Q0.3输出线圈变量。
首先点击新建,弹出定义变量对话框∇定义变量名,变量类型为I/O离散,连接设备选择MODBUS,选择相应的寄存器,数据类型为Bit,并定义读写属性。
I0.0-I0.3输入寄存器变量和Q0.0-Q0.3输出线圈变量如下图所示∇1.4创建画面变量定义完成后创建画面。
选择文件→画面→新建…,如下图所示∇变量与画面进行变量映射,组态王工程建立完成。
02西门子PLC实现MODBUS从站西门子PLC作为从站,仅需要使用MODBUS库提供的Modbus库函数对Modbus从站进行配置。
C++RS-485通讯示例

C++RS-485通讯⽰例RS-485是⼀种半双⼯的通信协议,经常⽤于⼯业控制模块间的通信,因其传输距离远,不容易出错的特点,应⽤⼴泛。
此为windows下⽰例,linux需做相应修改。
#pragma once#include <windows.h>#include <stdio.h>#include <stdlib.h>class Net485{public:Net485(long baud_rate, wchar_t* port_name);bool send(BYTE data[], int length);protected:void set_up_serial_port(long baud);private:HANDLE serial_port;};#include "Net485.h"#include <iostream>Net485::Net485(long baud_rate, wchar_t* port_name){const wchar_t name[8] = L"COM4";serial_port = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);if (serial_port == INVALID_HANDLE_VALUE){fprintf(stderr, "Error opening portn");CloseHandle(serial_port);}else{set_up_serial_port(baud_rate);}}bool Net485::send(BYTE data[],int length){if (serial_port == INVALID_HANDLE_VALUE){printf("发送失败::INVALID_HANDLE_VALUE");return false;}DWORD dwTx = 0;BOOL ret = FALSE;DWORD dwLength = length;Sleep(10);if (dwLength > 0){ret = WriteFile(serial_port, data, dwLength, &dwTx, NULL);if (ret == FALSE){printf("发送失败");return false;}}return true;}void Net485::set_up_serial_port(long baud){DCB properties;// 设置读写缓冲区GetCommState(serial_port, &properties);switch (baud){case1200:properties.BaudRate = CBR_1200;break;case2400:properties.BaudRate = CBR_2400;break;case4800:properties.BaudRate = CBR_4800;break;case9600:properties.BaudRate = CBR_9600;break;case14400:properties.BaudRate = CBR_14400;break;case19200:properties.BaudRate = CBR_19200;break;case38400:properties.BaudRate = CBR_38400;break;default:fprintf(stderr, "Invalid baud rate: %ldn", baud);exit(0);break;}properties.Parity = NOPARITY;properties.ByteSize = 8;properties.StopBits = ONESTOPBIT;SetCommState(serial_port, &properties);//在读写串⼝前,⽤ PurgeComm 函数清空缓冲区PurgeComm(serial_port, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_TXABORT); return;}使⽤⽰例/// 485PLC通信Net485* net = new Net485(9600,L"COM4");BYTE data[2];data[0] = 0x01;if (info.th == 1) {data[1] = 0x11;}else {data[1] = 0x12;}net->send(data,sizeof(data));。
485通讯协议程序怎么写(51单片机的485通信程序案例)

485通讯协议程序怎么写(51单片机的485通信程序案例)
RS-485总线接口是一种常用的串口,具有网络连接方便、抗干扰性能好、传输距离远等优点。
RS-485收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力,加上收发器具有高的灵敏度,能检测到低达200mv的电压,可靠通信的传输距离可达数千米。
使用RS-485总线组网,只需一对双绞线就可实现多系统联网构成分布式系统、设备简单、价格低廉、通信距离长。
51单片机的485通信程序
#ifndef __485_C__ #define __485_C__
#include 《reg51.h》
#include 《string.h》
#define unsigned char uchar
#define unsigned int uint
/* 通信命令*/
#define __ACTIVE_ 0x01 // 主机询问从机是否存在
#define __GETDATA_ 0x02 // 主机发送读设备请求
#define __OK_ 0x03 // 从机应答
#define __STATUS_ 0x04 // 从机发送设备状态信息
#define __MAXSIZE 0x08 // 缓冲区长度
#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错
uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息
uchar dev; // 该字节用于保存本机设备号
sbit M_DE = P1。
stm32 rs485解析程序实例

stm32 rs485解析程序实例在STM32中实现RS485通信,你需要使用UART(通用异步收发器)硬件模块,并配置其RS485模式。
下面是一个简单的RS485解析程序实例,以STM32 HAL库为例。
首先,你需要配置UART并开启RS485模式。
以下是一个示例:```cvoid MX_RS485_UART_Init(void){= USART2;= 115200;= UART_WORDLENGTH_8B;= UART_STOPBITS_1;= UART_PARITY_NONE;= UART_MODE_TX_RX;= UART_HWCONTROL_NONE;= UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart2) != HAL_OK){Error_Handler();}// Enable RS485 mode__HAL_UART_ENABLE_IT(&huart2, UART_IT_REACK); __HAL_UART_DISABLE_IT(&huart2, UART_IT_TEACK); __HAL_UART_ENABLE_IT(&huart2, UART_IT_RWUID); __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE); __HAL_UART_ENABLE(&huart2);}```然后,你可以在中断服务程序中处理接收到的数据:```cvoid USART2_IRQHandler(void){HAL_UART_IRQHandler(&huart2);}```在`HAL_UART_IRQHandler`函数中,你可以处理接收到的数据:```cvoid HAL_UART_IRQHandler(UART_HandleTypeDef huart){if(__HAL_UART_GET_FLAG(huart, UART_FLAG_REACK) != RESET) // RS485 Receiver Mode ACK reception{__HAL_UART_CLEAR_FLAG(huart, UART_FLAG_REACK);// Handle received data here...}}```以上代码只是一个基本的示例,你可能需要根据你的实际需求进行修改。
485通信程序实例

bdata uchar Repeater_Address _at_ 0x26; //中继器地址
sbit RA_0 = Repeater_Address^0;
sbit PaOData4 = PaOData^4;
sbit PaOData5 = PaOData^5;
sbit PaOData6 = PaOData^6;
sbit PaOData7 = PaOData^7;
s; //收到上位机对下位机的广播信号(时间、日期)
sbit Com1Data_Sent = Status2^5; //串口1已发送一字节
sbit tem_bit = Status2^6; //临时位变量
sbit Com1_Finished = Status2^7; //串口1数据已接收完毕
bdata uchar Status3 _at_ 0x22; //中继器状态标志
sbit Alarm_Over = Status3^0; //掉电时下位机侧传来的报警数据结束
sbit RA_7 = Repeater_Address^7;
bdata uchar Repeater_Status _at_ 0x27; //中继器状态标志位
sbit DHead_Arrived = Repeater_Status^0;
uchar data R_P_Data_Buf1 _at_ 0x33; //Com2读数据缓冲区指针1
uchar data W_P_Data_Buf2 _at_ 0x34; //并口写数据缓冲区指针2
uchar data R_P_Data_Buf2 _at_ 0x35; //并口读数据缓冲区指针2
Python编程实现USB转RS485串口通信

Python编程实现USB转RS485串⼝通信---作者疆,未经允许,严禁转载,违权必究------欢迎指正,需要源码和⽂件可站内私信联系-------------------------功能说明:Python编程实现USB转RS485串⼝通信(发送数据、接收数据均为16进制格式)运⾏环境:Windows7&Python3.7与Ubuntu14.04&Python2.7,宇泰UT-890A USB转RS-485/422串⼝连接线⽂件下载: vsl7⼀、Windows7&Python3.7下Python编程实现USB转RS485串⼝通信参考链接:、(1)驱动下载解压驱动压缩包,选取..\390-11000880 V01\Driver\win xp server2003 2008 2012 Vista 7 8 8.1 10 32-64bit\中Autoinstaller_WHQL_CDM2.12.24_Win 2K, XP, Vista, 7, 8, 8.1, 10, 32_64bit.exe傻⽠式安装,可见。
(2)环境搭建安装serial库,cmd中执⾏命令 pip3 install pyserial(3)源码实现# -*- coding:utf-8 -*-# Author: WUJiang# 运⾏环境为Windows7&Python3.7import serialimport timeser = serial.Serial("com3", 9600) # 选择串⼝,并设置波特率if ser.is_open:print("port open success")# hex(16进制)转换为bytes(2进制),应注意Python3.7与Python2.7此处转换的不同send_data = bytes.fromhex('ff 01 00 55 00 00 56') # 发送数据转换为b'\xff\x01\x00U\x00\x00V'ser.write(send_data) # 发送命令time.sleep(0.1) # 延时,否则len_return_data将返回0,此处易忽视len_return_data = ser.inWaiting() # 获取缓冲数据(接收数据)长度if len_return_data:return_data = ser.read(len_return_data) # 读取缓冲数据# bytes(2进制)转换为hex(16进制),应注意Python3.7与Python2.7此处转换的不同,并转为字符串后截取所需数据字段,再转为10进制 str_return_data = str(return_data.hex())feedback_data = int(str_return_data[-6:-2], 16)print(feedback_data)else:print("port open failed")⼆、Ubuntu14.04&Python2.7下Python编程实现USB转RS485串⼝通信参考链接:、(1)驱动下载按linux对应驱动安装包中readme说明直接make报错,解决不了寻求宇泰科技官⽅技术⽀持,建议我更新系统内核(我拒绝!),后来提供了⼀个说明⽂件(FTDI.txt),经验证本机ubuntu14.04的4.4.0内核集成了该USB驱动,免去了安装⿇烦。
c语言 485通信源程序

// This flag is set on USART1 Receiver buffer overflow
bit rx_buffer_overflow1;
// USART1 Receiver interrupt service routine
volatile bit comm_flg=false;
bit comm_flg1=true;
uchar comm_state=0;
uchar comm_over;
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
uchar i;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer1[rx_rd_index1]=data;
if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
if (++rx_counter1 == RX_BUFFER_SIZE1)
uchar rx_process_buffer1[160];
uchar rx_process_counter1;
#if RX_BUFFER_SIZE1<256
unsigned char rx_rd_index1,rx_counter1;
#else
unsigned int rx_rd_index1,rx_counter1;
c语言 485通信源程序 #definerxb8 #definetxb8 #defineupe #defineovr #definefe #defineudre #definerxc #defineframing_error (1<<fe) #define parity_error (1<<upe) #define data_overrun (1<<ovr) #define data_register_empty (1<<udre) #define rx_complete (1<<rxc) usart1receiver buffer #define rx_buffer_size1 128 uchar rx_buffer1[rx_buffer_size1]; uchar rx_process_buffer1[160]; uchar rx_process_counter1; rx_buffer_size1<256unsigned char rx_rd_index1,rx_counter1; #else unsigned int rx_rd_index1,rx_counter1; #endif usart1receiver buffer overflow bit rx_buffer_overflow1; usart1receiver interrupt service routine volatile bit comm_flg=false; bit comm_flg1=true; uchar comm_state=0; uchar comm_over; interrupt [usart0_rxc] void usart0_rx_isr(void) charstatus,data; uchar status=ucsr0a;data=udr0; rx_buffer_size1)rx_rd_index1=0; rx_counter1=0;rx_buffer_overflow1=1; comm_over=250;if(rx_counter1==2) elseif((rx_counter1>=13)&&(rx_counter1==rx_buffer1[7]+10)) if(comm_state!=0){comm_flg1=true;}else for(i=0;i<rx_counter1;i++)rx_proces
rs485通信程序

r s485通信程序(总6页)本页仅作为文档封面,使用时可以删除This document is for reference only-rar21year.March#ifndef __485_C__#define __485_C__#include <>#include <>#define unsigned char uchar#define unsigned int uint/* 通信命令 */#define __ACTIVE_ 0x01 // 主机询问从机是否存在#define __GETDATA_ 0x02 // 主机发送读设备请求#define __OK_ 0x03 // 从机应答#define __STATUS_ 0x04 // 从机发送设备状态信息#define __MAXSIZE 0x08 // 缓冲区长度#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dev; // 该字节用于保存本机设备号sbit M_DE = P1^0; // 驱动器使能,1有效sbit M_RE = P1^1; // 接收器使能,0有效void get_status(); // 调用该函数获得设备状态信息,函数代码未给出void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main(){uchar type;uchar len;/* 系统初始化 */P1 = 0xff; // 读取本机设备号dev = (P1>>2);TMOD = 0x20; // 定时器T1使用工作方式2TH1 = 250; // 设置初值TL1 = 250;TR1 = 1; // 开始计时PCON = 0x80; // SMOD = 1SCON = 0x50; // 工作方式1,波特率9600bps,允许接收ES = 0; // 关闭串口中断IT0 = 0; //外部中断0使用电平触发模式EX0 = 1; // 开启外部中断0EA = 1; // 开启中断/* 主程序流程 */while(1) // 主循环{if(recv_cmd(&type) == 0) // 发生帧错误或帧地址与本机地址不符,丢弃当前帧后返回continue;switch(type){case __ACTIVE_: // 主机询问从机是否存在send_data(__OK_, 0, dbuf); // 发送应答信息,这里buf的内容并未用到break;case __GETDATA_:len = strlen(dbuf);send_data(__STATUS_, len, dbuf); // 发送设备状态信息break;default:break; // 命令类型错误,丢弃当前帧后返回}}}void READSTATUS() interrupt 0 using 1 // 产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1{get_status(); // 获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一字节置0表示数据结束}/* 该函数接收一帧数据并进行检测,无论该帧是否错误,函数均会返回* 函数参数type保存接收到的命令字* 当接收到数据帧错误或其地址位不为0时(非主机发送帧),函数返回0,反之返回1 */bit recv_cmd(uchar *type){bit db = 0; // 当接收到的上一个字节为0xdb时,该位置位bit c0 = 0; // 当接收到的上一个字节为0xc0时,该位置位uchar data_buf[__ERRLEN]; // 保存接收到的帧uchar tmp;uchar ecc = 0;uchar i;M_DE = 0; // 置发送禁止,接收允许M_RE =/* 接收一帧数据 */i = 0;while(!c0) // 循环直至帧接收完毕{RI = 0;while(!RI);tmp = SBUF;RI = 0;if(db == 1) // 接收到的上一个字节为0xdb {switch(tmp){case 0xdd:data_buf[i] = 0xdb; // 0xdbdd表示0xdb ecc = ecc^0xdb;db = 0;break;case 0xdcdata_buf[i] = 0xc0; // 0xdbdc表示0xc0 ecc = ecc^0xc0;db = 0;break;defaultreturn 0; // 帧错误,返回}i++;}switch(tmp) // 正常情况{case 0xc0: // 帧结束c0 = 1;break;case 0xdb: // 检测到转义字符db = 1;break;default: // 普通数据data_buf[i] = tmp; // 保存数据ecc = ecc^tmp; // 计算校验字节i++;}if(i == __ERRLEN) // 帧超长,错误,返回 return}/* 判断帧是否错误 */if(i<4) // 帧过短,错误,返回return 0;if(ecc != 0) // 校验错误,返回return 0;if(data_buf[0] != dev) // 非访问本机命令,错误,返回return 0;*type = data_buf[1]; // 获得命令字return 1; // 函数成功返回}/* 该函数发送一帧数据帧,参数type为命令字、len为数据长度、buf为要发送的数据内容 */void send_data(uchar type, uchar len, uchar *buf){uchar i;uchar ecc = 0; // 该字节用于保存校验字节M_DE = 1; // 置发送允许,接收禁止M_RE = 1;send_byte(dev); // 发送本机地址ecc = dev;send_byte(type); // 发送命令字ecc = ecc^type;send_byte(len); // 发送长度ecc = ecc^len;for(i=0; i<len; i++) // 发送数据{send_byte(*buf);ecc = ecc^(*buf);buf++;}send_byte(ecc); // 发送校验字节TI = 0; // 发送帧结束标志SBUF = 0xc0;while(!TI);TI = 0;}/* 该函数发送一个数据字节,若该字节为0xdb,则发送0xdbdd,若该字节为0xc0则,发送0xdbdc */void send_byte(ucharda){switch(da){case 0xdb: // 字节为0xdb,发送0xdbdd TI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdd;while(!TI)TI = 0;break;case 0xc0: // 字节为0xc0,发送0xdbdc TI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdc;while(!TI)TI = 0;break;default: // 普通数据则直接发送TI = 0;SBUF = da;while(!TI);TI = 0;}}#endif。
51单片机实现RS485

default: // 普通数据则直接发送TI = 0;SBUF = da;while(!TI);TI = 0;}}#endifRS-232接口实现计算机和单片机通信程序作者:佚名来源:本站原创点击数:…更新时间:2008年07月10日【字体:大中小】//此程序通过RS-232接口来完成计算机和单片机通信(程序已用p1 8f458试验板上调试通过)//程序的调试可以用"串口调试助手V2.1"辅助完成,此程序可在htt p:// 下载//此程序首先发送测试数据55H,再通过中断实现数据的接收和发送#include "p18f458.h"void InterruptHandlerHigh(void);//初始化程序void initial(){SPBRG=0X19; //选择传输波特率为9600bpsTXSTA=0X04; //选择异步高速方式传输8位数据RCSTA=0X80; //允许同步串行口工作TRISC=0X80; //将RC7,RC6设置为输入,断绝与外接电路的连接 TXSTAbits.TXEN=1; //发送允许RCSTAbits.CREN=1; //接受数据允许PIE1bits.RCIE=1; //接收中断使能INTCON=0XC0; //总中断和外围中断允许}//高优先级中断向量#pragma code InterruptVectorHigh=0x08void InterruptVectorHigh (void){_asmgoto InterruptHandlerHigh //跳到中断程_endasm}//高优先级中断服务程序#pragma code#pragma interrupt InterruptHandlerHighvoid InterruptHandlerHigh (){while(PIR1bits.RCIF==1) //若接收中断标志不为1,则为误操作,返回{TXREG=RCREG; //将接收到的数据放入发送寄存器,并启动发送 }}//主程序main(){initial(); //系统初始化TXREG=0X55; //发送数据55H进行测试for(;;);}------------------------------------------汇编语言版本的RS-232接口实现计算机和单片机通信程序------------;此程序通过RS-232接口来完成计算机和单片机通讯(程序以在p18 f458试验板上调通);本单片机程序由提供;此程序首先发送测试数据55H,再通过中断实现数据的接收和发送;程序的调试可以用"串口调试助手V2.1"辅助完成LIST P=18f458INCLUDE "P18f458.INC"ORG 0x00GOTO MAINORG 0x08GOTO INTSERVEORG 0X30;**************中断服务子程序***************INTSERVEBTFSS PIR1,RCIF ;接收中断标志为1?GOTO ERR_RE ;误操作,返回MOVF RCREG,0 ;否则,将接收到的数据通过W寄存器MOVWF TXREG ;放入发送寄存器,并启动发送ERR_RE NOPRETFIE;****************初始化程序***************INITIAL NOPMOVLW 0X19 ;选择传输波特率为9600bpsMOVWF SPBRGMOVLW 0X04 ;选择异步高速方式传输8位数据MOVWF TXSTAMOVLW 0X80 ;允许同步串行口工作MOVWF RCSTAMOVLW 0X80 ;将RC7,RC6设置为输入,断绝与外接电路的连接MOVWF TRISCBSF TXSTA,TXEN ;发送允许BSF RCSTA,CREN ;接受数据允许BSF PIE1,RCIE ;接收中断使能MOVLW 0XC0 ;总中断和外围中断允许MOVWF INTCONRETURN;**********************主程序********************* MAIN NOPCLRWDTCALL INITIALMOVLW 0X55 ;发送数据55H进行测试MOVWF TXREGLOOPGOTO LOOPEND两片51单片机互相通信的串行通信程序(一个发送程序,一个接收程序)2007-05-27 08:27;系统晶振是 11.0592 MHz;51单片机发送单片机程序;此程序用Proteus仿真通过;此程序在硬件上测试通过;2007-05-27;附有简化电路图;为了使初学者能看懂,程序与图尽可能的简单扼要;实验现象为,发送端的P1口的哪个键被接下,接收端的哪个灯对应着亮;如果把两个单片机的T和R通过无线模块(如基于MCP2120芯片的模块)来扩充,便可做成无线通信ORG0000HAJMPSTARTORG0040HSTART:MOVSP,#60HMOVSCON,#50H;串口方式 1MOVTMOD,#20H;T1 方式2MOVTL1,#0FDH;波特率 9600 的常数MOVTH1,#0FDHSETBTR1movr5,#00hWAIT:movp1,#0ffhmova ,p1movr5,alcalldelay ;读键盘,这里去抖动,还要加几句话mova ,p1nopCJNEA,5,WAIT ;是否有键输入MOVSBUF,a;串口输出键盘输入的值NOPSS: JBCTI,WAIT;是否发送完毕SJMPSSDELAY:;延时子程序PUSH;保存现场PUSH1MOV0,#06HDELAY1: MOV 1,#0HDJNZ1,$DJNZ0,DELAY1POP1;恢复现场POPRETEND;系统晶振是 11.0592 MHz;51单片机接收单片机程序;此程序用Proteus仿真通过;此程序在硬件上测试通过;2007-05-27;附有简化电路图;为了使初学者能看懂,程序与图尽可能的简单扼要;实验现象为,发送端的P1口的哪个键被接下,接收端的哪个灯对应着亮;如果把两个单片机的T和R通过无线模块(如基于MCP2120芯片的模块)来扩充,便可做成无线通信ORG0000HAJMPSTARTORG0040HSTART:MOVSCON,#50H;串口方式 1MOVTMOD,#20H;T1 方式 2MOVTL1,#0FDH;波特率 9600 的常数MOVTH1,#0FDHSETBTR1WAIT:JBCRI,DIS_REC;是否接收到数据sjmpwaitDIS_REC:MOVA,SBUF;读串口接收到的数据movp1,aSJMPwaitend51单片机串行口通信程序设计例子时间:2009-03-06 17:13来源:未知作者:牛牛点击: 768次串行口方式0应用编程 8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就能扩展一个并行口。
单片机RS485通信接口、控制线、原理图及程序教学实例

单片机RS485通信接口、控制线、原理图及程序教学实例[前言]RS232 标准是诞生于RS485 之前的,但是RS232 有几处不足的地方:接口的信号电平值较高,达到十几V,使用不当容易损坏接口芯片,电平标准也与TTL 电平不兼容。
传输速率有局限,不可以过高,一般到一两百千比特每秒(Kb/s)就到极限了。
接口使用信号线和GND 与其它设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。
传输距离有限,最多只能通信几十米。
通信的时候只能两点之间进行通信,不能够实现多机联网通信。
针对RS232 接口的不足,就不断出现了一些新的接口标准,RS485 就是其中之一。
RS232 标准是诞生于RS485 之前的,但是RS232 有几处不足的地方:接口的信号电平值较高,达到十几V,使用不当容易损坏接口芯片,电平标准也与TTL 电平不兼容。
传输速率有局限,不可以过高,一般到一两百千比特每秒(Kb/s)就到极限了。
接口使用信号线和GND 与其它设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。
传输距离有限,最多只能通信几十米。
通信的时候只能两点之间进行通信,不能够实现多机联网通信。
针对RS232 接口的不足,就不断出现了一些新的接口标准,RS485 就是其中之一,它具备以下的特点:采用差分信号。
我们在讲A/D 的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。
尤其当工业现场环境比较复杂,干扰比较多时,采用差分方式可以有效的提高通信可靠性。
RS485 采用两根通信线,通常用A 和B 或者D+和D-来表示。
逻辑1以两线之间的电压差为+(0.2~6)V 表示,逻辑0以两线间的电压差为-(0.2~6)V 来表示,是一种典型的差分通信。
RS485 通信速率快,最大传输速度可以达到10Mb/s 以上。
RS485 内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大增。
[通信电子]RS485通讯协议带实例报文
![[通信电子]RS485通讯协议带实例报文](https://img.taocdn.com/s3/m/b0ca352442323968011ca300a6c30c225901f003.png)
附录一RS485通讯协议一.通讯口1.波特率:300,600,1200,2400,4800,9600,19200 2.起始位:1位3.数据位:7或8位4.校验:Odd/Even/None5.停止位:1位6.传送字符:ASCII出厂时设定为:9600,8,1,N二.上位机通讯格式:+ +1.开始符:ENQ (05H)2.机号:机组号 (1号机30H, 31H)3.PLC型号: FF (46H ,46H)4.命令名:a.读位元件:BR (42H,52H)b.读字元件:WR (57H,52H)c.写位元件:BW (42H,57H)d.写字元件:WW (57H,57H)5.等待时间:60ms (36H)6.数据:a.读字(位)元件命令的数据格式为:元件头(5字节) + 数据长度(2字节)b.写字(位)元件命令的数据格式为:元件头(5字节) + 数据长度(2字节) + 所写数据注:位元件数据用“0”(30H)表示ON,“1”(31H)表示OFFc.字(位)元件定义:控制:开机操作 X11停机操作 X12BWT-300\600\1000\1800\3000\5000-PLC 系列步进式可编程微机组合式调速器说明书 电话:************重庆天人自控设备有限公司 TRZK 1增功操作 X13减功操作 X14自动操作 X15手动操作 X16显示状态:故障 Y14全开 Y15全关 Y16导叶开度 D197机组频率 D198功率给定 D1997.校验和: 机号,PLC 型号,命令名,等待时间和数据的ASCII 码值相加后,取末两位ASCII 码值。
三. PLC 数据传出格式+1. 开始符: ENQ (05H)2. 机号: 机组号 (1号机30H, 31H)3. PLC 型号: FF (46H ,46H)4. 数据; 数据与上位机要求发送的数据长度相同。
5. 结束符: ETX (03H)6.校验和: 机号,PLC 型号,数据和结束符的ASCII 码值 相加后,取末两位ASCII 码值。
C51很简洁易懂的RS458串口通信接收发送程序

{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void) {
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
#include <REG52.H>
#include <stdio.h>
sbit RS485E=P3^7; //定义485的使能脚
bit SendFlag;
unsigned int ReData,SenData;
/**************************************
延时程序
**************************************/
SBUF=SenData;//发送数据
delay(50);
}
else
{
RS485E=0;//接收状态
}
}
}பைடு நூலகம்
/****************************************************
串口中断程序
******************************************************/
SendFlag = 1;
}
}
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xF3;// //baud*2 /*波特率4800、数据位8、停止位1。效验位无(12M)
WindowsXPRS485通讯测试程序

WindowsXP/2000下RS485通讯测试程序此测试程序为WindowsXP/2000下的测试工具。
操作说明:1. 把COM1,COM2的设置成RS485, 。
2. 用短接线把的COM1,COM2连接好,即COM1的5/7与COM2的5/7直接连接。
3. 进入系统, 运行RS485Test.exe。
4. 选择要测试的COM口, 工作模式,CHANGE COM MODE:SEND OR READ(S OR R)在这里选择是要发送还是接收。
回车5. 如果COM1,COM2出现相应的字符既表示这2个串口工作正常。
#include <stdio.h>#include <stdlib.h>#include <string.h>#include "Serial.h"//RS485 测试程序int RS485Test(){unsigned int unComNum1 = 0; //unsigned int unComNum2 = 0;unsigned char ucCom1Mod = 0;unsigned char ucCom2Mod = 0;char chCom[5] = {0};CSerial serial1;CSerial serial2;char buffer[1024] = {0};long lSendCounter = 0;char szSendBuff[1024] = {0};DWORD dwRead = 0;int i = 0;//==================输入COM1的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM1 Number (1,2) : ");// scanf("%d", &unComNum1);unComNum1 = 1;fprintf(stdout, "Change COM1 mode: Send or Read(s or r) : ");scanf("%s", &ucCom1Mod);memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum1);BOOL bSer = serial1.InitCOM(chCom, 19200, 8, 0, 0, 1);if (!bSer){fprintf(stdout, "Can't InitCOM Com1.\n");return -1;}//==================输入COM2的端口号和工作模式===========================// fprintf(stdout, "\nEnter COM2 Number (1, 2) : ");// scanf("%d", &unComNum2);unComNum2 = 2;fprintf(stdout, "Change COM2 mode: Send or Read(s or r) : ");scanf("%s", &ucCom2Mod);memset(chCom, 0, 5);sprintf(chCom, "COM%d", unComNum2);bSer = serial2.InitCOM(chCom, 19200, 8, 0, 0, 1);if (!bSer){fprintf(stdout, "Can't InitCOM Com2.\n");return -1;}fprintf(stdout, "Input Send data : ");scanf("%s", szSendBuff);for(int k = 0; k < 10; k++){if( (ucCom1Mod=='s') || (ucCom1Mod=='S') ){serial1.SendData(szSendBuff, strlen(szSendBuff));}if( (ucCom2Mod=='s') || (ucCom2Mod=='S') ){serial2.SendData(szSendBuff, strlen(szSendBuff));}Sleep(100);if( (ucCom1Mod=='r') || (ucCom1Mod=='R') ){memset(buffer, 0, sizeof(buffer));dwRead = serial1.ReadData(buffer, sizeof(buffer));printf("COM1 k=%d, Receive DataLen=%d, Data(HEX): ", k, dwRead);for(i = 0; i < dwRead; i++){printf("%x,", buffer[i]);}printf("\n");}if( (ucCom2Mod=='r') || (ucCom2Mod=='R') ){memset(buffer, 0, sizeof(buffer));dwRead = serial2.ReadData(buffer, sizeof(buffer));printf("COM2 k=%d, Receive DataLen=%d, Data(HEX): ", k, dwRead);for(i = 0; i < dwRead; i++){printf("%x,", buffer[i]);}printf("\n");}}serial1.Close();serial2.Close();return 0;}int main(int argc, char **argv){RS485Test();return 0;}// Serial.cpp: implementation of the CSerial class.//////////////////////////////////////////////////////////////////////////#include <winioctl.h>#include <stdio.h>#include <conio.h>#include <stdlib.h>#include "Serial.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CSerial::CSerial(){memset(&m_OverlappedRead, 0, sizeof( OVERLAPPED));memset(&m_OverlappedWrite, 0, sizeof( OVERLAPPED));m_hIDComDev= NULL;fWaitingOnRead = FALSE;}CSerial::~CSerial(){Close();}/********************************************************************** **RS-485通讯说明由于RS-485是半双工通信,故同一时刻只能发送或接收。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
RS485通信示例程序
看程序时请配合芯片资料一起看,公布源码不是为了抄袭,而是为了相互
学习,如果有不对的地方还请指出来,谢谢!
/*===================================================== ===
程序说明:PC端通过RS232-RS485芯片转换后再经过一个RS485收发
芯片MAX485连接单片机的RX和TX(RO-RX,DI-TX)的通信示例程序
控制发送和接收的引脚为P2.7,使用时注意正确连接!
作者:绘天
地点:成都信息工程学院
====================================================== ==*/
#include <reg52.h>
#include "com_communication.h"
sbit SHRL=P2^7;/*高电平发送,低电平接收*/
void main()
{
int c;
UartInit();
SHRL=0;/*保持为发送状态*/
while(1)
{
if ( RI ) //如果收到数据
{
RI = 0; //清除接收标志
c = SBUF; //读取收到的数据
SHRL=1;
UartSendChar(c); //回送收到的数据
SHRL=0;
}
}
}
所调用的头文件:
#ifndef _com_H_
#define _com_H_
//定义波特率(取值1200、2400、4800、9600、19200等)
#define BaudRate 19200L
/*********************************************************************** ********
函数:UartInit()
功能:串行口初始化
************************************************************************ *******/
void UartInit()
{
SCON = 0x50; //串口方式1(8位UART),允许接收
PCON |= 0x80; //波特率加倍
TMOD &= 0x0F; //设置T1为8位自动重装定时器,用于产生波特率
TMOD |= 0x20;
TH1 = TL1 = 256 - (11059200L / 12) / (16 * BaudRate); //设置T1初值
TR1 = 1; //启动T1
}
/*********************************************************************** ********
函数:UartSendChar()
功能:通过串行口发送单个字节
参数:c是被发送的字节数据,取值0x00~0xFF
************************************************************************ *******/
void UartSendChar(char c)
{
SBUF = c; //数据写入SBUF,同时启动硬件发送过程
while ( !TI ); //等待发送完毕
TI = 0; //清除发送标志
}
#endif。