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