一、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;
}

测试程序

最新文章

  1. aspnet webapi 跨域请求 405错误
  2. URL中的保留和不安全字符
  3. 【zz】matlab 直方图匹配
  4. SQL存储过程解密
  5. 【原创】【Android New Features】—— 关于ADT 17的BuildConfig.DEBUG
  6. 屏蔽页面js报的错误
  7. mysql 5.6 oom 图
  8. 横瓜先生关于如何利用MYSQL数据库设计CMS系统处理100亿级TB规模的数据量
  9. centos GUI界面与命令行的切换
  10. 在php代码中执行liunx命令
  11. cocos2d-x3.6 连连看完整源代码
  12. lua 语法的使用总结
  13. Vue-tab选项卡
  14. JavaWeb——XML转义符字
  15. Selenium在Firefox中踩过的
  16. HTML5新特性 Web Workers 实现多线程
  17. E 定向 牛客练习赛25
  18. 虚幻4随笔6 Object和序列化
  19. (zxing.net)二维码PDF417的简介、实现与解码
  20. request和response的复习

热门文章

  1. 生产环境下,oracle不同用户间的数据迁移。第三部分
  2. python numpy求四分位距
  3. import的项目结构不对
  4. delphi之猥琐的webserver实现
  5. layer帮助手册
  6. 【Jmeter】利用Jmeter+ant+Jenkins 搭建 接口&amp;性能测试 持续集成平台
  7. tmux多终端工具
  8. 矩阵快速幂(queue递推)
  9. 洛谷 P1892 [BOI2003]团伙(种类并查集)
  10. [HDU 5293]Tree chain problem(树形dp+树链剖分)