Rockchip USB转485

  • #RS232 / RS485  简介

    • #RS232

    • #RS485

    • #R485与RS232比较

  • #开发

    • #DTS配置

    • #驱动开发

    • #POSIX规范API

  • #HAL层以上APP层

    • #APK call JNI

    • #APP

  • #调试

    • #log开启

  • #RS232/RS485/RS422常见问题

#RS232 / RS485  简介

#RS232

RS-232是美国电子工业联盟(EIA)制定的串行数据通信的接口标准,原始编号全称是EIA-RS-232(简称232,RS232)。它被广泛用于计算机串行接口外设连接。RS-232C标准,其中EIA(Electronic Industry Association)代表美国电子工业联盟,RS(Recommended standard)代表推荐标准,232是标识号,C代表RS232的第三次修改(1969年),在这之前,还有RS232B、RS232A. 在RS-232标准中,字符是以一串行的比特串来一个接一个的串列(serial)方式传输,优点是传输线少,配线简单,发送距离可以较远。最常用的编码格式是异步起停(asynchronous start-stop)格式,它使用一个起始比特后面紧跟7或8个数据比特(bit),然后是可选的奇偶校验比特,最后是一或两个停止比特。所以发送一个字符至少需要10比特,带来的一个好的效果是使全部的传输速率,发送信号的速率以10划分。

表中列出的是被较多使用的RS-232中的信号和管脚分配:

       DE-9 Male(Pin Side)                   DE-9 Female (Pin Side)-------------                          -------------\ 1 2 3 4 5 /                          \ 5 4 3 2 1 /\ 6 7 8 9 /                            \ 9 8 7 6 /---------                              ---------
信号DB-25DE-9EIA/TIA 561Yost
公共接地7544,5
发送数据(TD、TXD)2363
接受数据(RD、RXD)3256
数据终端准备(DTR)20432
数据准备好(DSR)6617
请求发送(RTS)4781
清除发送(CTS)5878
数据载波检测(DCD)8127
振铃指示(RI)2291
脚位简写意义说明
Pin1DCDData Carrier Detect调制解调器通知计算机有载波被侦测到。
Pin2RXDReceiver接收数据。
Pin3TXDTransmit发送数据。
Pin4DTRData Terminal Ready计算机告诉调制解调器可以进行传输。
Pin5GNDGround地线。
Pin6DSRData Set Ready调制解调器告诉计算机一切准备就绪。
Pin7RTSRequest To Send计算机要求调制解调器将数据提交。
Pin8CTSClear To Send调制解调器通知计算机可以传数据过来。
Pin9RIRing Indicator调制解调器通知计算机有电话进来。

串行通信在软件设置里需要做多项设置,最常见的设置包括波特率(Baud)、奇偶校验(Parity Check)和停止位(Stop Bit)

#RS485

RS485是由EIA(Electronic Industry Association,美国电子工业协会)于1983年在RS-422基础上制定并发布的一种串行通信平衡式数据发送标准, 经通讯工业协会(TIA)修订后命名为TIA/EIA-485-A。满足RS485标准的收发器采用差分传输方式(Differential Driver Mode),数据最高传输速率为10Mbps,最大通信距离约为1219m。

用缆线两端的电压差值来表示传递信号,不同的电压差分别标识为逻辑1及逻辑0。两端的电压差最小为0.2V以上时有效,任何不大于12V或者不小于-7V的差值对接受端都被认为是正确的。

RS485具有支持多节点(32个节点),传输距离远(最大1219m),接收灵敏度高(200mV电压),连接简单(在构成通信网络时,仅需要一对双绞线作传输线),能抑制共模干扰(差分传输), 成本低廉等特点,在多站、远距离通信等多种工控环境中获得了广泛应用。

#R485与RS232比较

  • RS485相比RS232具有抑制共模干扰、传输距离长等优点,所以许多大型的工业设备都采用RS485进行串口通讯。

  • RS485采用的是差分信号,所以在进行串口通讯时,只能采用半双工的工作方式,必须使用1个或2个I/O口来控制RS485的发送和接收状态

#开发

#DTS配置

项目中主芯片RS232 RS485不够 需要通过USB 扩展RS232(silicon CP2105) ,RS232再转RS485 (thvd1500)  RS232转RS485,RE/DE 控住输出 ,项目中通过GPIO控制

rs485-thvd1500{status = "okay";compatible = "ti,thvd1500-gpio";thvd1500-gpio1 = <&pca0 1 1>;thvd1500-gpio2 = <&pca0 2 1>;
};

2路RS485 控制脚

#驱动开发

协议转换

drivers/usb/serial/cp210x.c
/** cp210x_get_config* Reads from the CP210x configuration registers* 'size' is specified in bytes.* 'data' is a pointer to a pre-allocated array of integers large* enough to hold 'size' bytes (with 4 bytes to each integer)*/
static int cp210x_get_config(struct usb_serial_port *port, u8 request,unsigned int *data, int size)
{...
}/** cp210x_set_config* Writes to the CP210x configuration registers* Values less than 16 bits wide are sent directly* 'size' is specified in bytes.*/
static int cp210x_set_config(struct usb_serial_port *port, u8 request,unsigned int *data, int size)
{....
}static int cp210x_open(struct tty_struct *tty, struct usb_serial_port *port)
{int result;result = cp210x_set_config_single(port, CP210X_IFC_ENABLE,UART_ENABLE);if (result) {dev_err(&port->dev, "%s - Unable to enable UART\n", __func__);return result;}/* Configure the termios structure */cp210x_get_termios(tty, port);/* The baud rate must be initialised on cp2104 */if (tty)cp210x_change_speed(tty, port, NULL);return usb_serial_generic_open(tty, port);
}

通过设置termios类型的数据结构中的值,可以对终端接口进行控制。

使能控制:

   if (gpio_is_valid(gpio)){┊   devm_gpio_request_one(&pdev->dev, gpio,GPIOF_OUT_INIT_HIGH, "thvd1500-gpio1");┊   thvd1500_priv1.gpio_num = gpio;┊   thvd1500_priv1.active_high = flag;┊   thvd1 = proc_create_data("thvd1", 0777, thvd1500_dir, &thvd_proc_fops1,(void *)&thvd1500_priv1);....

#POSIX规范API

标准接口:

#include <termios.h>speed_t cfgetispeed(const struct termios *);
speed_t cfgetospeed(const struct termios *);
int cfsetispeed(struct termios *, speed_t speed);
int cfseospeed(struct termios *, speed_t speed);

这些API 作用于termios结构。需要先调用tcgetattr()获得termios结构,再调用以上函数设置终端速度,最后调用tcsetattr()使设置生效。

其他API

#include <termios.h>
int tcdrain(int fd);让调用程序一直等待,直到所有排队的输出都发送完毕
int tcflow(int, int flowtype);暂停或重新开始输出
int tcflush(int fd, int in_out_selector);清空输入,输出或两者都清空

#HAL层以上APP层

#APK call JNI

JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open(JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags)
{int fd;speed_t speed;jobject mFileDescriptor;/* Configure device */{struct termios cfg;LOGD("Configuring serial port");if (tcgetattr(fd, &cfg)){LOGE("tcgetattr() failed");close(fd);/* TODO: throw an exception */return NULL;}cfmakeraw(&cfg);cfsetispeed(&cfg, speed);cfsetospeed(&cfg, speed);if (tcsetattr(fd, TCSANOW, &cfg)){LOGE("tcsetattr() failed");close(fd);/* TODO: throw an exception */return NULL;}}...return mFileDescriptor;
}Java 中调用JNI// JNIprivate native static FileDescriptor open(String path, int baudrate,int flags);

调用相关API ,配置termios结构数据

#APP

public class SerialPort {public SerialPort(File device, int baudrate, int flags)throws SecurityException, IOException {/* Check access permission */if (!device.canRead() || !device.canWrite()) {...}mFd = open(device.getAbsolutePath(), baudrate, flags);/*调用JNI总open*/if (mFd == null) {Log.e(TAG, "native open returns null");throw new IOException();}mFileInputStream = new FileInputStream(mFd);mFileOutputStream = new FileOutputStream(mFd);}...
}

构建类

	/** 打开串口,接收数据* 通过串口,接收单片机发送来的数据*/public void openSerialPort() {try {serialPort = new SerialPort(new File(TTYUSB0), 115200, 0);//调用对象SerialPort方法,获取串口中"读和写"的数据流inputStream = serialPort.getInputStream();outputStream = serialPort.getOutputStream();serialPort1 = new SerialPort(new File(TTYUSB1), 115200, 0);//调用对象SerialPort方法,获取串口中"读和写"的数据流inputStream1 = serialPort1.getInputStream();outputStream1 = serialPort1.getOutputStream();Log.i(TAG, "打开串口");} catch (IOException e) {e.printStackTrace();}//getSerialPort();}

通过流读取数据

#调试

#log开启

开启USB转RS232 dev_dbg config文件添加

CONFIG_DEBUG_FS=y
CONFIG_DYNAMIC_DEBUG=y

kernel debug <linux/device.h> 打印级别

#define KERN_EMERG    KERN_SOH "0"    /* system is unusable */
#define KERN_ALERT    KERN_SOH "1"    /* action must be taken immediately */
#define KERN_CRIT    KERN_SOH "2"    /* critical conditions */
#define KERN_ERR    KERN_SOH "3"    /* error conditions */
#define KERN_WARNING    KERN_SOH "4"    /* warning conditions */
#define KERN_NOTICE    KERN_SOH "5"    /* normal but significant condition */
#define KERN_INFO    KERN_SOH "6"    /* informational */
#define KERN_DEBUG    KERN_SOH "7"    /* debug-level messages */
#define KERN_DEFAULT    KERN_SOH "d"    /* the default kernel loglevel*/

kernel/printk.c

/* printk's without a loglevel use this.. */#define DEFAULT_MESSAGE_LOGLEVEL 4 /* KERN_WARNING */int console_printk[4] = {DEFAULT_CONSOLE_LOGLEVEL,       /* console_loglevel 控制台日志级别,优先级高于该值的消息将在控制台显示*/DEFAULT_MESSAGE_LOGLEVEL,       /* default_message_loglevel */MINIMUM_CONSOLE_LOGLEVEL,      /* minimum_console_loglevel 最低的控制台日志级别 */DEFAULT_CONSOLE_LOGLEVEL,       /* default_console_loglevel */
};

查看打印级别 和修改打印级别。

rk3399_mid:/ # cat /proc/sys/kernel/printk
7       4       1       7
rk3399_mid:/ # echo 1 4 1 7 >/proc/sys/kernel/printk
rk3399_mid:/ # cat /proc/sys/kernel/printk
1       4       1       7

#RS232/RS485/RS422常见问题

问题一 :A厂的屏可以和设备通信,换成B厂的屏就通信不上了。方向:1) 首先确认一下接线是否正确了,RX和TX是否兼容。2) 地线是否没有接。3) 除了RX,TX,GND,是否还有其它引脚需要短接的。4) 通信协议是否一致或不完善,波特率是否一样。

问题二:设备A是RS232,设备B是RS422,没有转换设备 怎么处理?

设备A是RS422接口,但是只有RS232通信可以测试通信。需要将RS422转成RS232进行通信,两者都是全双工的,接收和发送都是同时到的,而RS422只是以一种差分信号进行传输。将422的Rx+与232的TX接,422的RX-与232的GND接。将422的TX+与232的RX接,422的TX-与232的GDN接。

问题三:RS232接口通信OK ,RS485通信也OK,但是使用RS232转RS485通信就不稳定。RS232全双工,RS485半双工,应用层发送/接受数据时,RS485不能同时收/发,需要Master严格控制数据命令,这是通信倍率调慢一些(不是调节波特率)

  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

100篇范文(7)

How should college students spend their spare time? College is a place where students arrange their own studies and take part in all kinds of activities as they like.Thus,plenty of time is left at college students’disposal.How should student spend their…

高嘌呤食物搜索引擎_“高嘌呤”的食物已发现,尿酸高的人,要尽量挑着吃!...

导语&#xff1a;在我们的生活中又出现了一种现象&#xff0c;越来越频发&#xff0c;也是越来越倾向于年轻化&#xff0c;那么就是高尿酸&#xff0c;现在高尿酸已经被列为了我们国家的第四高&#xff0c;身体内的嘌呤含量是一部分&#xff0c;那么另一部分也是来源于我们平时…

罗老师带货了

相对比其他事情&#xff0c;我对罗老师带货很感兴趣&#xff0c;也许这样说&#xff0c;我对罗老师这个人比较感兴趣。罗老师是一个经过大风大浪的男人&#xff0c;经过了各种风雨&#xff0c;终于找到自己的位置&#xff0c;也决定在这个位置上发光发热了。我觉得他会像冯提莫…

缓存优化过程中的一些思考

最近一段时间在做双十一的优化&#xff0c;对于缓存的使用和改造渐渐有了一些思考&#xff0c;记录一下 缓存的使用、选择 * 读简单&#xff0c;写复杂的业务最好放在写入端 * 读复杂&#xff0c;写简单的业务逻辑放在读取端 * 根据业务的类型&#xff0c;选择是使用集中式缓存…

【Linux笔记】LED驱动程序

前言 上一篇我们分享了字符设备驱动框架&#xff1a;【Linux笔记】驱动基础篇&#xff0c;当时分享的是hello驱动程序。学STM32我们从点灯开始&#xff0c;学Linux驱动我们自然也要点个灯来玩玩&#xff0c;尽量在从这些基础例程中榨取知识&#xff0c;细抠、细抠&#xff0c;为…

oracle trigger 延迟执行_一文详解Spring任务执行和调度

一、概述Spring框架分别使用TaskExecutor和TaskScheduler接口提供异步执行和任务调度的抽象。Spring还提供了这些接口的实现&#xff0c;这些接口支持线程池或将其委托给应用服务器环境中的CommonJ。二、TaskExecutorSpring 2.0 开始引入的新的抽像。Executors 是线程池的Java …

[转]命令行在IIS添加虚拟目录

来自&#xff1a;http://www.jb51.net/softjc/29702.htmlMkwebdir -c LocalHost -w "Default Web Site" –v CommonImages,D:\Images 附:这些管理性脚本是IIS自带的.缺省被安装在了C:\Inetpub\AdminScripts下. 让用户密码永不过期: net accounts /maxpwage:unlimi转…

数据库(2)

文章目录数据表操作完整性约束AUTO_INCREMWNTNOT NULL非空唯一性约束UNIQUE KEY&#xff08;KEY可省略&#xff09;修改表结构的方式修改表名添加字段删除字段修改字段添加默认值删除默认值添加主键删除主键添加唯一删除唯一修改表的存储引擎设置自增长的值删除数据表DML插入数…

oc51--循环retain

// main.m // 循环retain#import <Foundation/Foundation.h> #import "Person.h" #import "Dog.h"int main(int argc, const char * argv[]) {Person *p [Person new];Dog *d [Dog new];// 如果A对用要拥有B对象, 而B对应又要拥有A对象, 此时会形…

中resource文件夹的作用_冲突与碰撞:OpenStack中的虚拟机和裸机

冲突与碰撞&#xff1a;OpenStack中的虚拟机和裸机要虚拟化还是非虚拟化&#xff1f;如果您追求性能&#xff0c;那么就没有争议——裸机仍然胜过虚拟机&#xff1b;特别是对于I/O密集型应用程序。但是&#xff0c;除非您可以保证充分利用它&#xff0c;否则是有代价的。在本文…

看看大神是如何计算32位数中‘1’的个数

偶然看到一份代码&#xff0c;代码是计算一个int数中 ‘1’ 的个数的&#xff0c;当然&#xff0c;可能这不是什么值得讨论的事情&#xff0c;但如果你看看大神如何写这段代码的&#xff0c;就觉得这个是一个需要了解的知识。int count_bits(int x) {register int xxx;xxxx-((…

MySQL运算符,函数,索引,图形化管理工具

文章目录运算符算术运算符比较运算符逻辑运算符MySQL运算符数字函数字符串函数日期时间函数条件函数系统信息函数加密函数其他常用函数MySQL索引索引的概念索引的分类创建索引创建表时创建索引在已经存在的表上创建索引删除索引MySQL图形化管理工具PHPMyAdminSQLyog运算符 算术…

python list存储方式_python list存储

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

Linux下的gpio,gpiod

GPIO 应该是每个嵌入式设备都避免不了的。最近在做项目的时候&#xff0c;也遇到这方面的问题&#xff0c;所以简单总结一下现在内核里面多了gpiod的来控制gpio口&#xff0c;相对于原来的形式&#xff0c;使用gpiod的好处是我们申请后不进行free也没有什么问题。但是你要是使用…

剖析大神代码,计算整型里面1的个数

昨天的文章&#xff0c;可能很多人看了不知道怎么回事&#xff0c;确实&#xff0c;我也是看了之后一头雾水。先给出个简单的例子#include "stdio.h"int count_bits4(char x) {x (x&0x55) ((x>>1)&0x55);x (x&0x33) ((x>>2)&0x33);x…

android 复制u盘文件到手机本地_如何导出Android中的文件(把Android当做U盘)

方法一&#xff1a;1. 连接USB,插入电脑2.用手在手机上方往下滑动&#xff0c;会出现几个菜单&#xff0c;其中有一个"choose a connection type". 选择 Disk Drive.你看到的也许是&#xff0c;Charge only, 点击切换到Disk Drive.3.这时你的电脑上就会出现USB标志的…

机器学习导论 与数学分析

文章目录机器学习定义说人话例子专家系统 定义好&#xff0c; 应招&#xff0c;速度快机器学习 实验 奖惩 调参对象任务 TASK T一个或多个经验 EXPERIENCE性能PERFORMANCE类比人类学习监督学习半监督学习无监督学习增强学习可解决问题不可解决问题举例f&#xff08;x&#xff0…

聊聊、Highcharts 动态数据

最近项目中需要用到图表&#xff0c;找了几个开源框架&#xff0c;最后选择 Highcharts&#xff0c;原因是 Highcharts 功能强大&#xff0c;稳定&#xff0c;方便&#xff0c;而且开源&#xff0c;社区比较成熟。 首先下载 Highcharts&#xff0c;导入项目。 在 HTML 页面引入…

你知道用git打补丁吗?

#常规操作一个常规的使用git 生成补丁的方式git diff ./ > xxx.patch patch -p1 < xxx.patch但是这样生成的补丁有一个问题&#xff0c;这个是差分形式的diff --git a/kernel-4.4/drivers/input/touchscreen/goodix.c b/kernel-4.4/drivers/input/touchscreen/goodix.c i…

windows 禁用ipv6服务_Win10如何关闭IPV6?Win10禁用IPv6的方法

在Win10系统中默认开启IPV6&#xff0c;不过这个协议暂时我们还用不到。而且开启该协议有时对系统运行有一定的影响&#xff0c;一些网卡还会因为IPv6出现系统未响应&#xff0c;假死等情况&#xff0c;那么Win10系统怎么关闭IPV6&#xff1f;下面小编就给大家带来Win10禁用IPv…