一、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. 奖项-MVP:MVP(微软最有价值专家)百科

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

  2. 第 4 章 前端基础之jquery

    一.jQuery是什么? 1. jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team. 2. jQuery是继prototype之后又一 ...

  3. postman测试wsdl类型接口

    1 IP地址来源搜索 WEB 服务 接口信息 http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl 2  设置接口调用地址 ...

  4. 20190814 On Java8 第三章 万物皆对象

    第三章 万物皆对象 对象创建 数据存储 有5个不同的地方可以存储数据: 寄存器 (Registers) 最快的存储区域,位于CPU内部 .无法直接控制. 栈内存(Stack) 存在于常规内存 RAM ...

  5. 异步请求jquery action

    package com.tarena.action; import java.util.HashMap;import java.util.Map; import javax.annotation.Re ...

  6. Linux命令行基础操作

    目录 1.打开终端命令行 2.常用快捷键 2.1 tab键 2.2 Ctrl+c组合键 2.3 Ctrl+d组合键 2.4Ctrl+Shift+c组合键和Ctrl+Shift+v组合键 2.5图形界面 ...

  7. 批量调整word 图片大小

    打开文档后,按Alt+F11,在左边Porject下找到ThisDocument,右键插入模块,贴上下面的 Sub Macro()For Each iShape In ActiveDocument.I ...

  8. ubuntu离线安装mysql

    一:ubuntu离线安装mysql 转载来源:https://blog.csdn.net/liuhuoxingkong/article/details/80696574 参考文章:https://ww ...

  9. [Codeforces 639F] Bear and Chemistry (Tarjan+虚树)(有详细注释)

    [Codeforces 639F] Bear and Chemistry(Tarjan+虚树) 题面 给出一个n个点,m条边的无向图(不保证连通,可能有自环和重边),有q次询问,每次询问给出p个点和q ...

  10. P2619 [国家集训队2]Tree I(最小生成树+二分)

    P2619 [国家集训队2]Tree I 每次二分一个$x$,每条白边加上$x$,跑最小生成树 统计一下满足条件的最小值就好了. to me:注意二分不要写挂 #include<iostream ...