文章目录

  • 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-25 DE-9 EIA/TIA 561 Yost
公共接地 7 5 4 4,5
发送数据(TD、TXD) 2 3 6 3
接受数据(RD、RXD) 3 2 5 6
数据终端准备(DTR) 20 4 3 2
数据准备好(DSR) 6 6 1 7
请求发送(RTS) 4 7 8 1
清除发送(CTS) 5 8 7 8
数据载波检测(DCD) 8 1 2 7
振铃指示(RI) 22 9 1
脚位 简写 意义 说明
Pin1 DCD Data Carrier Detect 调制解调器通知计算机有载波被侦测到。
Pin2 RXD Receiver 接收数据。
Pin3 TXD Transmit 发送数据。
Pin4 DTR Data Terminal Ready 计算机告诉调制解调器可以进行传输。
Pin5 GND Ground 地线。
Pin6 DSR Data Set Ready 调制解调器告诉计算机一切准备就绪。
Pin7 RTS Request To Send 计算机要求调制解调器将数据提交。
Pin8 CTS Clear To Send 调制解调器通知计算机可以传数据过来。
Pin9 RI Ring 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严格控制数据命令,这是通信倍率调慢一些(不是调节波特率)

RK平台 USB转RS485相关推荐

  1. RK平台USB摄像头FAQ

    (记录android9以后调试所遇到的常见问题,有错请批评指正) UVC全称为USB video(device) class,是微软与另外几家设备厂商联合推出的为usb视频捕获设备定义的协议标准:所以 ...

  2. rk平台vr主板项目开发总结

    rk平台vr主板项目开发总结. 产品的形态: 需要配合标准的HDMI接口或usb dp接口的头显设备 需要对应的Android AR core开发的VR 应用程序,游戏等. 主要的功能模块: 基本的A ...

  3. [Camera]RK平台摄像头驱动

    platform:rk3399 OS:Android 7.1 Kernel:4.4 参考: 1. KrisFei https://blog.csdn.net/kris_fei/article/deta ...

  4. linux 渲染程序图层管理,Linux驱动多图层开发--lcdc/framebuffer的注册(RK平台)

    目录 一.引言 Android图形系统系统篇之HWC的介绍 二.源码分析 ------>framebuffer框架 ------>2.RK平台下多图层代码分析 三.多图层的硬件lcdc支持 ...

  5. python实现485通讯_Python编程实现USB转RS485串口通信

    ---作者疆,未经允许,严禁转载,违权必究--- ---欢迎指正,需要源码和文件可站内私信联系--- -----------点击此处链接至博客园原文----------- 功能说明:Python编程实 ...

  6. USB转RS485代替PC/PPI通讯电缆

    S7-200的CPU使用的是RS485,PC机有RS232口和USB口,两种接口电气规范不同,需要用中间电路转换成同一接口类型. 现在常用的PC/PPI其实就是一根USB/RS485的匹配电缆. RS ...

  7. 记一次rk平台热点打开流程追踪记录

    记一次rk平台热点打开流程追踪记录 问题描述 rk平台偶现热点打开失败,错误日志如下: I/android.hardware.wifi@1.0-service: Starting legacy HAL ...

  8. cywdhd在RK平台的适配

    一.平台自带驱动 一般rk sdk在kernel4.4.194版本以上,都有适配了cypress的WiFi驱动cywdhd.现在适配到的大多数为cyw43438,cyw43455.cypress的驱动 ...

  9. 高通平台USB 2.0和USB 3.0接口充电器识别原理

    1 BC 1.2 1.1 充电器类型探测 1)DCD:DP上有150mV(= 10uA x 15K欧姆下拉电阻)的电压,DM上电压为0 2)Primary Det(DP发起检测DM): - DP上加载 ...

最新文章

  1. ZooKeeper简介和概念知识
  2. C#_uploadify_mvc_version
  3. 指定域的名称或安全标识(SID)与该域的信任信息不一致.
  4. 基于Python语言Hamcrest断言的使用
  5. OpenGL实现flocking (聚集)实例
  6. Django项目调用外部程序soffice报错subprocess.CalledProcessError: Command 'soffice --headless --convert-to pdf
  7. Copy(定义,特点,深复制,浅复制)(非ARC,ARC的运用范围)
  8. iPhone X 的新解锁技术:用 Python 编写 Face ID!
  9. 美国喜提刷脸登机,官方开心发通告,竟马上引发公民不适
  10. 手把手:教你如何用深度学习模型预测加密货币价格
  11. libSM.so.6: cannot open shared object file: No such file or directoryapt-file search libSM.so.6
  12. Java之数组(下)
  13. ps添加的阴影怎么去除_去除人物照片脸部阴影的PS技巧
  14. Problem : 救公主续
  15. 通过简单脚本批量取消新浪微博的关注
  16. markdown提示错误HTML Rendering Error: An error occurred with the HTML rendering component
  17. SQlserver基础学习
  18. 对数据库三大范式及BC范式的理解
  19. 根据高程值批量修改等高线为计曲线工具,FME实现等高线批量修改成计曲线,根据高程值自动识别计曲线,解决地形图计曲线丢失问题,等高线批量提取计曲线,首曲线根据高程批量转换成计曲线
  20. 微信内置浏览器清理缓存方法

热门文章

  1. IT是什么行业?就业前景怎么样
  2. Java 时间相关 获取某月的某一天
  3. 把ipad变成电脑的外接显示屏
  4. MySQL数据库(1)~~一起学习数据库冲冲冲
  5. python基础练习题1(12题)
  6. 【计算机科学】【2020.05】基于深度学习的计算蛋白质结构预测
  7. 答题微信小程序实现(7):python3将题库处理成json格式的。
  8. ne_products 表
  9. 计算机防火墙知识点,防火墙及防火墙的基本概念-信息安全工程师知识点
  10. 计算机奥赛金牌排名,2019五大学科竞赛含金量排名