一、485硬件原理

  • 差分对传输数据的原理

    • IO数据的传输→差分对
  • rs232传输的距离在15米以下,RS485传输距离是几十米到1000米以上
  • 为什么485可以传输这么远
    • 差分对的机制可以降低电磁场的干扰
    • 衰减
  • 485传输距离和传输线有关系
    • 注意:双绞线和屏蔽线

二、485原理图

嵌入式上一般使用串口转485

分析芯片datasheet

串口的信号转化为485则:

  • D→(A,B),DE高电平,RE高电平

485信号转化为串口信号则:

  • (A,B),DE低电平,RD低电平

三、驱动

485驱动=串口驱动+GPIO的字符驱动

BUF_XURTS1高电平发送,低电平接收

串口驱动是drivers/char/max485_ctl.c

  • 485驱动=串口驱动+GPIO的字符驱动
  • BUF_XURTS1高电平发送,低电平接收
  • (GPIO是GPA0_7,串口设备节点是ttySAC1)

驱动中只需要操作GPIO

  • 设备节点/dev/max485_ctl

应用中,控制GPIO和串口=类似led+串口的操作

  • ioctl是参数是1,则输出高电平,发送
  • ioctl是参数是0,则输出低电平,接收
  • 串口的节点/dev/ttySAC1

运行程序

  • 发送./test_485 /dev/ttySAC1 1
  • 接收./test_485 /dev/ttySAC1 0

测试程序发送的信息:iTOP-4412: max485 test app(times:%d)

测试程序:

//#include <stdio.h>
#include <unistd.h>
//#include "uart.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <string.h> #define MAX485_CONTROL //#include "uart.c"
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
if ( tcgetattr( fd,&oldtio) != ) {
perror("SetupSerial 1");
return -;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE; switch( nBits )
{
case :
newtio.c_cflag |= CS7;
break;
case :
newtio.c_cflag |= CS8;
break;
} switch( nEvent )
{
case 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E':
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N':
newtio.c_cflag &= ~PARENB;
break;
} printf("Baund Rate: %d\n", nSpeed); switch( nSpeed )
{
case :
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case :
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case :
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case :
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
case :
cfsetispeed(&newtio, B460800);
cfsetospeed(&newtio, B460800);
break;
case :
printf("Rate:921600\n");
cfsetispeed(&newtio, B921600);
cfsetospeed(&newtio, B921600);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if( nStop == )
newtio.c_cflag &= ~CSTOPB;
else if ( nStop == )
newtio.c_cflag |= CSTOPB;
newtio.c_cc[VTIME] = ;
newtio.c_cc[VMIN] = ;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=)
{
perror("com set error");
return -;
}
// printf("set done!\n\r");
return ;
} int prepare_to_send(int fd)
{
int ret; ret = ioctl(fd, , );
if(ret<)
{
printf("max485 set ctl to high failed!\r\n"); return -;
}
else
{
return ;
}
} int prepare_to_recv(int fd)
{
int ret; ret = ioctl(fd, , );
if(ret<)
{
printf("max485 set ctl to low failed!\r\n"); return -;
}
else
{
return ;
}
} void main(int argc, char* argv[])
{
unsigned char ucTmp;
int fd1,fd2,nset1,nset2,nread; char buf[];
//char buf1[1]; //char *buff = "Hello\n\r"; int i = ; char *max485_ctl = "/dev/max485_ctl_pin"; if( != argc)
{
printf("Usage: test_485 [uart port] [type]\r\n");
printf(" type: 0--recv, 1--send\r\n"); return;
} fd1 = open(argv[], O_RDWR);
if (fd1 == -)
{
printf("Open %s faild\n", argv[]);
exit();
} nset1 = set_opt(fd1, , , 'N', );
if (nset2 == -)
{
printf("Set uart faild\n");
exit();
} #ifdef MAX485_CONTROL
if((fd2=open(max485_ctl, O_RDWR|O_NOCTTY|O_NDELAY))<)
{
printf("Open %s faild\n", max485_ctl);
close(fd1); exit();
}
#endif if( == atoi(argv[])) //recv
{
#ifdef MAX485_CONTROL
prepare_to_recv(fd2);
#endif
while()
{ nread = read(fd1, buf, );
if (nread > )
{
for(i=; i<nread; i++)
{
printf("%c", buf[i]); if(buf[i] == 'q')
//break;
goto exit;
}
}
//if(nread)
//{
// printf("\r\n");
//}
sleep();
}
}
else //send
{
#ifdef MAX485_CONTROL
prepare_to_send(fd2);
#endif
while()
{
printf("Send data, time:%d\r\n", i);
sprintf(buf, "iTOP-4412: max485 test app(times:%d)\r\n", i++);
//nread = write(fd1, "iTOP-4412: max485 test app\r\n", strlen("iTOP-4412: max485 test app\r\n"));
nread = write(fd1, buf, strlen(buf));
sleep();
#if 0
nread = read(fd1, buf, );
if (nread > )
{
for(i=; i<nread; i++)
{
printf("%c", buf[i]); if(buf[i] == 'q')
//break;
goto exit;
}
}
if(nread)
{
printf("\r\n");
}
#endif
}
}
exit:
close(fd1); return;
}

测试程序

4412 RS485的更多相关文章

  1. 【学习/研发】嵌入式Linux/Android开发有它就够了——迅为4412开发板

    网站:http://www.topeetboard.com 光盘资料+网盘资料+配套视频+售后支持,助您加速学习研发的进程 产品介绍 iTOP-Exynos4412开发板采用 Exynos4412的主 ...

  2. 迅为三星Exynos 4412开发板四核Cortex-A9ARM安卓linux开发板

    开发板光盘资料包含:原理图(PDF格式).底板PCB(Allegro格式).驱动程序源码.芯片和LCD数据手册.开发环境.产品使用手册. 4412开发板简介: iTOP-Exynos4412开发板采用 ...

  3. 迅为4412嵌入式安卓开发板兼容3G网络|4G网络

    iTOP-Exynos4412开发板内置有无线 WIFI 模块.Bluetooth.GPS.Camera.3G等模组,陀螺仪等,支持 HDMI1.4(1080P/60Hz)显示,客户可以直接从开发平台 ...

  4. 迅为4412全新升级版|3G开发板|4G开发板

    iTOP-Exynos4412开发板采用 Exynos4412的主芯片,具有更高的主频和更丰富外设,配置 2GB 双通道 DDR3的内存及 16GB 存储,支持3G/G模块.GPS模块.陀螺仪.HDM ...

  5. 【转帖】嵌入式4412开发板QT5.7编译安装到arm

    QT5.7.0+UBUNTU16.04+ARM-NONE-LINUX-GNUEABI4.8+busybox最小LINUX系统 Orandragon记录 本文转自迅为4412开发板群:http://to ...

  6. 4412开发板搭建Uboot、Kernel和Android4.0的编译环境方法

    本文转自迅为4412开发板实战教程书籍:http://www.topeetboard.com 迅为是基于Ubuntu12.04.2平台做开发,所有的配置和编译脚本也是基于此平台,没有在其它平台上测试过 ...

  7. RS-232, RS-422, RS-485 Serial Communication General Concepts(转载)

    前面转载的几篇文章重点介绍了UART及RS-232.在工控领域除了RS-232以外,常用的串行通信还有RS-485.本文转载的文章重点介绍了RS-232.RS-422和RS-485. Overview ...

  8. 4412开发板升级4.2之后改了logo开机后屏幕闪解决办法

    荣品4412开发板升级到4.2请注意增加虚拟机内存. 问:荣品4412开发板升级到Android4.2之后,改了logo.4412板子开机后,过一会屏幕就一闪一闪,是什么原因? Android4.2编 ...

  9. Exynos 4412

    Exynos 4412采用了三星最新的32nm HKMG工艺,是三星的第一款四核处理器 1.启动 有时间再接着写……

随机推荐

  1. loj6259「CodePlus 2017 12 月赛」白金元首与独舞

    分析 我们将没连的点连向周围四个点 其余的按照给定的方向连 我们将所有连出去的位置统一连到0点上 再以0作为树根 于是就将问题转化为了有向图内向树计数 代码 #include<iostream& ...

  2. 奖项-MVP:MVP(微软最有价值专家)百科

    ylbtech-奖项-MVP:MVP(微软最有价值专家)百科 微软最有价值专家(MVP) 是指具备一种或多种微软技术专业知识,并且积极参与在线或离线的社群活动,经常与其他专业人士分享知识和专业技能,受 ...

  3. 软件-JMeter:JMeter 百科

    ylbtech-软件-JMeter:JMeter 百科 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到 ...

  4. 页面跳转(包括vue路由)

    1.JS实现页面跳转 1.1 使用window.location的href属性跳转 window.location.href = 'http://www.baidu.com';此处window可以省略 ...

  5. DS静态查找- 顺序-二分-索引

    静态查找 静态表是只执行查找操作,而不执行插入.删除等操作的表. 现在常说的有五大查找方法:顺序查找.分块查找.索引查找.树查找.哈希查找. 后两种之前写过了二叉查找树和哈希表,现在回顾前面三种,它们 ...

  6. Spring-Cloud-Alibaba-Nacos 目录

    Spring-Cloud-Alibaba-Nacos 目录 学习资料 Nacos 官网(https://nacos.io/zh-cn/docs/what-is-nacos.html) Nacos 程序 ...

  7. [Python3] 021 面向对象 第一弹

    目录 1. 面向对象概述 1.1 OOP 思想 1.2 几个名词 1.3 类与对象 2. 类的基本实现 2.1 类的命名 2.2 如何声明一个类 2.3 如何实例化一个类 2.4 如何访问对象成员 2 ...

  8. var、let、const的区别

    var.let.const的区别 var定义的变量,没有块的概念,可以跨块访问, 不能跨函数访问. let定义的变量,只能在块作用域里访问,不能跨块访问,也不能跨函数访问. const用来定义常量,使 ...

  9. C#设计模式:装饰者模式(Decorator Pattern)

    一,装饰者模式(Decorator Pattern):装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. 二,在以上代码中我们是中国人是根本行为,我们给中国人装饰我会说英语 ...

  10. 对象名 XXX 无效。

    对象名 XXX 无效. 首先检查自己数据库连接字符串是否正确!!! 已经有过好几次这样的错误了,还是不长记性,特意记下